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
Manage clients and projects for an architecture firm
AI summary · README
BusinessTypeScript · CSSGitHub @neriaokOnlineOwner 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 small CRM demo for an architecture firm. Built in stages.
Express + TypeScript + Mongoose backend with full CRUD for Client and
Project, following the express-conventions skill (asyncHandler, ApiError,
a shared ApiResponse type, separated routes/controllers/models).
Requires a running MongoDB instance (local service or Atlas) at the URI in .env.
Every response is { success: true, data } or { success: false, error }.Read the full README ↗A small CRM demo for an architecture firm. Built in stages.
Express + TypeScript + Mongoose backend with full CRUD for Client and
Project, following the express-conventions skill (asyncHandler, ApiError,
a shared ApiResponse<T> type, separated routes/controllers/models).
cd server
npm install
cp .env.example .env # fill in MONGODB_URI (defaults to local)
npm run dev
npm run seed # optional: populates sample clients/projects for local testing
Requires a running MongoDB instance (local service or Atlas) at the URI in .env.
Every response is { success: true, data } or { success: false, error }.
GET /healthPOST /api/clients, GET /api/clients, GET /api/clients/:id, PUT /api/clients/:id, DELETE /api/clients/:idPOST /api/projects, GET /api/projects (client populated), GET /api/projects/:id (client populated), PUT /api/projects/:id, DELETE /api/projects/:idPATCH /api/projects/:id/stage — updates just the stagePOST /api/projects/:id/interactions — saves free-text call/meeting notes as an Interaction; pass useAi: true to have Claude turn it into a 2-3 sentence summary first, or omit it to save the text verbatimGET /api/projects/:id/interactions — past interactions for a project, newest firstDELETE /api/projects/:id/interactions/:interactionId — deletes one interactionPOST /api/projects/:id/contacts, GET /api/projects/:id/contacts — contacts (contractor/engineer/consultant/...) linked to a projectPOST /api/assistant/ask — ask a free-form question about the firm's projects/clients; see Stage E belowProject stage is one of: inquiry, consultation, quote, contract,
preliminary_design, permits, detailed_design, construction_oversight, handover.
React + TypeScript (Vite) frontend, following the react-conventions skill
(functional components typed as FC<Props>, CSS Modules, Redux Toolkit +
RTK Query for server state, one folder per component with an index.ts).
localStorage.cd client
npm install
npm run dev
The dev server proxies /api to http://localhost:4000, so run the backend
alongside it (see Stage 1 setup, including npm run seed for sample data).
Turns free-text call/meeting notes into a summary and a suggested follow-up task.
services/claudeCliService.ts spawns the local claude CLI
(claude -p, non-interactive mode) via Node's execFile — no API key,
no SDK. The instruction prompt is prepended to the user's text and the
whole thing is piped in over stdin, never passed as a command-line
argument or interpolated into a shell string, so free-form user input
can't reach argv or get shell-interpreted. Explicit handling for the CLI
missing (ENOENT), timing out (45s), and non-zero exits, each mapped to
a 502 Bad Gateway ApiError with a clear message instead of a raw
stack trace.The server detects Hebrew via a Unicode-range check on the input and tells the CLI exactly which language to answer in - asking it to just "match the input language" proved inconsistent in practice.
Requires the claude CLI to already be installed and authenticated on the
machine running the server (claude auth status / ant auth status) —
without it, the AI-Edit path fails gracefully with a clear error instead of
a crash; Save-as-written never touches the CLI.
PATCH /api/projects/:id/stage)
instead of a read-only badge.Contact model.A "+ New Project" button on the projects list opens a modal to create a
Client + Project together in one flow (client name, project title, initial
stage). It makes two sequential calls to the existing POST /clients and
POST /projects endpoints, then navigates straight to the new project's
detail page.
GET /api/projects now also returns daysSinceLastInteraction and
needsAttention per project, computed server-side (utils/projectAttention.ts)
from the most recent Interaction date - or createdAt if it has none -
against a per-stage tolerance (e.g. 3 days for a fresh inquiry, 30 for
permits, which can legitimately sit quiet waiting on a public body). A
"Needs attention" badge shows on the project card in the list when a
project exceeds its stage's threshold. Computed server-side rather than
purely client-side so the same logic can be reused by other features
(e.g. the general AI assistant) without duplicating it.
A floating "Ask the assistant" chat widget, available on every page, that answers free-form questions about the firm's real project and client data ("which projects are stuck?", "how many projects are in the permits stage?", or a lookup by client/project name).
services/assistantService.ts): builds a plain-text context
of every project (title, client, stage, days since last contact, needs
attention) from the same data Stage D computes, and sends it to the
claude CLI (services/claudeCli.ts - the low-level runner shared with
the Stage 3 summarizer) alongside the question.askAssistant catches that and falls back to
answerFromKeywords - a small keyword matcher over the same real data
(stuck-project questions, counts, name lookups). The response always
includes a source: "ai" | "demo" field; the widget shows a small "demo
mode" badge on demo answers instead of failing the request.The app deploys as a single Vercel project: the React build is served as
static output, and the Express API runs as a Vercel serverless function
(server/api/index.ts, wired up via the root vercel.json). The database
is a MongoDB Atlas cluster - Vercel's functions have no fixed IP and no
local disk, so a local mongod isn't an option there.
Setup:
vercel link
vercel env add MONGODB_URI production # mongodb+srv://<user>:<password>@<cluster>/<db-name>
vercel env add MONGODB_URI preview
vercel --prod
Since Vercel's serverless environment doesn't have the claude CLI
installed, the deployed instance always answers assistant questions via the
Stage E keyword fallback and always shows the "AI service is currently
unavailable" message on "AI Edit" - by design, not a bug. Running the
claude CLI-backed features live requires the local dev setup from Stage 1.