Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
Translation pending
Project estimation and proposal cockpit for Elixir Solutions
BusinessTypeScript · CSSGitHub @wgatelixirOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A web version of Elixir Solutions' project estimation workbook (Business
Assessment through HubSpot Deployment & Go-Live, plus ElixirSync and Third
Party integrations), with a shared dashboard so estimations live in one
place instead of scattered spreadsheet copies.Read the full README ↗A web version of Elixir Solutions' project estimation workbook (V3: Business Assessment, Technical Assessment and Data Migration, the Sales / Service / Marketing / CMS / DealHub implementations, plus ElixirSync and Third Party integrations), with a shared dashboard so estimations live in one place instead of scattered spreadsheet copies.
/estimations/[id]) — edit standard effort, complexity
factors, and per-line items for every workstream (drag a line by its handle
to reorder it), live totals, PM % and integration subscriptions. The Cover
page assigns each onderdeel to phase 1, 2 or 3; once more than one phase is
used, the sidebar summary and the Proposal Summary overview group by phase
with subtotals, and every onderdeel page shows its phase.StandardWorkstream.custom (src/lib/customWorkstreams.ts), so phases,
links, totals, the Proposal Summary and the export treat it like any other
workstream. Name, type, billing and removal are edited on the Cover page
(✎). In these workstreams, lines can also be Consulting,
Development, Support or Project management and carry their
own hourly rate
(StandardLineItem.hourlyRate; empty = the workstream's rate). Prices are
then summed per line, and the workstream shows the effective (blended)
rate. A Project management line starts at the PM rate and is left out of
the PM % base, so planned PM hours never get PM on top.totalsByStage, incl. PM; subscriptions follow their integration), and
the export carries stage per workstream and per line, plus
closedWonPrice / proposalPrice in the totals./) — every saved estimation with client, status,
hours, price, and last edit. "Duplicate" freezes a copy as a snapshot you
can pull numbers from for a proposal while the original stays editable.Next.js 16 (App Router) + TypeScript + Tailwind, Prisma 7 + PostgreSQL. No authentication (open-link, by request — see Security note below).
The templates follow the V3 workbook (2026-03-11). Hourly rates and the PM rate are deliberately lower than the workbook's (150/135 vs. 175/150) - an app-side decision, not an import error. The workbook has a few real bugs, fixed here rather than replicated:
=SUM(G6:G30), missing the
Kick-off Session and Workshop 1, 12h): the sheet shows 104h, the real sum
(and the app) is 116h.The V3 workbook dropped the separate HubSpot Deployment & Go-Live tab (its trainings and go-live now sit inside each hub implementation tab), so it's no longer in the template; estimations created before V3 keep it.
Estimations created from the V2 template show a banner in the editor with an
Update to V3 template button (src/lib/upgradeTemplate.ts). It is opt-in
per estimation and only changes the unsaved editor state: it keeps rates,
included workstreams, complexity choices, hand-edited topics/hours and the
user's own lines, swaps the template lines for V3's, and shows the old and
new total price before applying. Nothing is migrated in bulk, since saved
estimations may already have been sent to a client.
If you need numbers that reconcile with an Excel estimate line-for-line, they may be off by these amounts for the affected tabs.
The editor sidebar has Export ⬇ Excel and ⬇ JSON buttons, for importing an
estimation into other software. Both are built from one model
(src/lib/export/model.ts), so they always carry the same numbers. They export
what's on screen (including unsaved changes) and only what's in scope: included
workstreams and included lines.
workstreamKey, lineId), activity values (Session,
Session Prep, Setup, Risk Buffer, Integration, Project management)
and column/field names are stable English, so an import mapping keeps
working across languages.type is set only for client-specific workstreams, and
billing is one_off or retainer. On retainer workstreams and lines,
hours/price (finalEffortHours/price per line) are the totals over
all months, and the per-month figures come alongside. That way every
sheet still adds up to the grand total, and an importer that ignores the
retainer fields still gets the right amounts.Excel (.xlsx, written by src/lib/export/xlsx.ts; no formulas, no merged
cells, no totals rows in the data sheets):
| Sheet | One row per | Columns |
|---|---|---|
| Workstreams | workstream / integration | key, name, phase, stage, type, billing, months, hours per month, price per month, hours, hourly rate, price, PM hours, PM rate, PM price, total price (incl. PM) |
| Lines | line item (+ one PM line per workstream) | workstream key, workstream, phase, stage, line ID, activity, topic, description, duration (h), standard effort (h), complexity, complexity adjustment (h), months, hours per month, price per month, final effort (h), hourly rate, price |
| Summary | field | client, project, owner, status, estimation ID, language, currency, export time, PM % and rate, totals, subscriptions, grand total |
JSON (format: "elixir-estimation-export", schemaVersion: 1): the same
data as one object, with fields estimation, projectManagement,
workstreams[] (each with its lines[]), subscriptions[] and totals. The
TypeScript interface EstimationExport in src/lib/export/model.ts is the
schema. Bump schemaVersion on any breaking change.
Requires Node 20+ and a Postgres database.
npm install
cp .env.example .env # if starting fresh; otherwise edit .env directly
# set DATABASE_URL to a local Postgres, e.g.:
# postgresql://user:password@localhost:5432/estimator?schema=public
npm run db:migrate # creates the Estimation table
npm run dev # http://localhost:3000
npm run verify-totals runs the calculation engine against the default
template and prints per-workstream totals — useful as a quick regression
check after changing src/lib/calculations.ts or src/lib/templates.ts.
DATABASE_URL environment variable
automatically when you create it there; if you're connecting your own,
add DATABASE_URL yourself under Settings → Environment Variables
(use the pooled connection string, not the direct one, since serverless
functions open many short-lived connections).npm run build) runs
prisma generate && prisma migrate deploy && next build, so the
database schema is created/updated automatically on every deploy as long
as DATABASE_URL is set. No manual migration step needed.Edit prisma/schema.prisma, run npx prisma migrate dev --name <change>
locally to generate the migration file, commit it, and push — the next
Vercel build applies it automatically via prisma migrate deploy.
Per your request this app has no authentication — anyone with the URL can view and edit every estimation, including hourly rates and pricing. That's fine for an internal link shared only with the team, but:
@elixir-solutions.nl (e.g. via
NextAuth with the Google provider and a
domain check in the signIn callback) — happy to wire that up if
priorities change.npm audit reports high-severity advisories in mysql2 and
deepmerge-ts. Both are transitive dependencies of the prisma CLI
package (used only for prisma generate / migrate during development
and build), not of @prisma/client which is what actually ships in the
deployed app. They're not part of the runtime bundle.
src/
app/
page.tsx Dashboard
estimations/[id]/page.tsx Estimator (server component, loads the record)
api/estimations/... REST API (list/create/read/update/delete/duplicate)
components/
editor/ Estimator UI (tabs, panels, summary sidebar)
... Dashboard UI (search, row actions, new-estimation dialog)
lib/
types.ts Shared TypeScript types for an estimation's state
templates.ts Default line items, extracted from the source .xlsx
calculations.ts All total/price math (the "formula engine")
validation.ts Zod schemas for the API boundary
prisma.ts Prisma client (pg driver adapter)
prisma/
schema.prisma Estimation model (JSON payload + cached totals)
scripts/
verify-totals.ts Regression check against the default template