Lalabase
티켓·문서·근무시간·고객대화를 한 곳에 모아 KI로 검색, 소프트웨어 기업 고객 프로젝트용, 오픈소스로 자체 서버·독일 클라우드에 배포
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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 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 }.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.