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
We rebuilt the tools you use every day as open source (AGPLv3). Self-host them free, forever, or use Zerosoft Cloud: a free plan, and you pay only for what scales.
BusinessTypeScript · CSSGitHub @lschiaffinoOnlineOwner 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.
Software is dead. We rebuild the tools you use every day and set them free. The core is open source (AGPLv3): self-host every product for $0, forever. Or use Zerosoft Cloud: a generous free plan, then transparent usage-based pricing — you pay for what scales, not for seats.
This repository is the whole company in one Next.js app: the marketing site, the blog, and six products — Link, CRM, Track, Cal, Chat and Docs.
Made of zeros. White background, black ink, nothing else.Read the full README ↗Software is dead. We rebuild the tools you use every day and set them free. The core is open source (AGPLv3): self-host every product for $0, forever. Or use Zerosoft Cloud: a generous free plan, then transparent usage-based pricing — you pay for what scales, not for seats.
This repository is the whole company in one Next.js app: the marketing site, the blog, and six products — Link, CRM, Track, Cal, Chat and Docs.
Made of zeros. White background, black ink, nothing else.
/en, /es, /pt, browser-detected)./app/links) — the Bitly alternative: custom aliases, tags, password-protected / expiring / max-click links, UTM builder, QR codes (SVG and PNG), bulk create (up to 200 URLs), cookie-less analytics (day, referrer, country, device, browser, OS), per-link CSV export, 7/30/90-day analytics with period comparison, custom domains (go.yourcompany.com/slug), Bitly import (API or CSV), link-in-bio pages (/@handle), link.created / link.clicked webhooks, and the public REST API v1 with personal keys (zs_…), 100 req/min rate limit, documented at /docs./app/crm) — the HubSpot alternative: contacts, companies, deals with multiple pipelines and a kanban board, activities timeline, tasks, static and dynamic lists, saved views, custom fields, CSV import with mapping and dedupe, CSV/JSON export, reports and dashboards, workflows (triggers on contact/deal/task/email events → email, task, field update, list, webhook, notify), Gmail read-only sync (on demand), Cal bookings that create the contact and log the meeting, Chat conversations saved to a contact, contact.*/deal.* webhooks, and /api/v1/crm/* (contacts, companies, deals incl. stage moves, activities, tasks, pipelines; OpenAPI at /api/v1/openapi.json). Workflows, export and bulk delete are admin-only.
/app/track) — the Linear alternative: projects, issues with sub-issues and relations, custom statuses, priorities, estimates, cycles, list / board / calendar / Gantt views, saved views and filters, comments, attachments, activity log, notifications inbox.
/app/calendar) — the Calendly alternative: event types with custom questions, weekly availability, buffers, minimum notice and booking window, blocked slots, round-robin team hosts, routing forms, public booking pages (/book/[slug]), confirmation + host notification + 24h reminder emails (via Resend when RESEND_API_KEY is set).
/api/v1/calendar/* and booking.* webhooks./app/chat) — the Intercom alternative: embeddable webchat widget, shared inbox, states and priorities, assignment rules, SLA policies, canned responses, office hours, CSAT, people/visitors, and an auto-answer bot.
/app/docs) — the Notion alternative: block editor with slash menu and inline formatting, nested pages, [[ page mentions, templates, comments, trash, title search, sharing (public / team / single user).
content/blog/{en,es,pt}/.npm install
cp .env.example .env.local # then fill in the values (see below)
npm run seed # demo user, 12 links, ~450 clicks, 200 contacts, 40 companies, 65 deals, demo API key
npm run dev # http://localhost:3000
With DEMO_MODE=true (the default in .env.example) you can open http://localhost:3000/en/app and use every dashboard (Link, CRM, Track, Cal, Chat, Docs) immediately — no Google credentials needed.
The seeded demo includes a password-protected link: http://localhost:3000/tryit (password: ceros).
Production build:
npm run build && npm start
| Variable | What for |
|---|---|
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | Google OAuth. Create at console.cloud.google.com/apis/credentials with authorized redirect URI <NEXTAUTH_URL>/api/auth/callback/google. |
NEXTAUTH_SECRET | Session signing. Generate with openssl rand -base64 32. |
NEXTAUTH_URL | Canonical app URL, e.g. http://localhost:3000. |
TURSO_DATABASE_URL | Optional. Unset → local SQLite file at data/zerosoftware.db. Set to libsql://<db>.turso.io → remote Turso database (what production uses). |
TURSO_AUTH_TOKEN | Auth token for the remote Turso database (turso db tokens create <db>). Ignored for local files. |
DEMO_MODE | true = everyone is the shared demo user, no login. Ignored when NODE_ENV=production unless DEMO_MODE_ALLOW_PRODUCTION=true. |
RESEND_API_KEY / EMAIL_FROM | Transactional email (booking confirmations, reminders). Unset → emails are logged to the console. |
BLOB_READ_WRITE_TOKEN | Vercel Blob for file uploads. Required on Vercel; elsewhere, unset → files go to UPLOADS_DIR (default data/uploads, outside public/) and are always served through access-checked routes. |
CRON_SECRET | Required in production for /api/cron/tick (Cal reminders + webhook retries; Vercel Cron sends it as a Bearer token). |
ENCRYPTION_KEY | Encrypts OAuth tokens and webhook secrets at rest. Unset → derived from NEXTAUTH_SECRET. |
CREDENTIALS_KEY | Optional dedicated key for Flow/Robots credentials (AES-256-GCM, bound to each workspace). Unset → derived from ENCRYPTION_KEY or NEXTAUTH_SECRET. Rotating it means re-entering saved credentials. |
Every key is created in /app/settings and shown exactly once. The seed prints a demo key (zs_demo_…).
curl -X POST http://localhost:3000/api/v1/links \
-H "Authorization: Bearer zs_demo_…" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/a/very/long/url", "slug": "my-link", "tags": ["demo"]}'
Endpoints: POST /api/v1/links, GET /api/v1/links, GET /api/v1/links/:id/stats. CRM: GET/POST /api/v1/crm/contacts|companies|deals|tasks plus GET/PATCH on /:id. Full reference with errors and examples at /docs (or app/[locale]/docs/page.tsx).
The app talks to a libSQL database. Locally it is a single SQLite file at data/zerosoftware.db — backup = copy that file, there is no other state. In production it is a remote Turso database selected purely by env vars (TURSO_DATABASE_URL + TURSO_AUTH_TOKEN), no code changes.
Production runs on Vercel + Turso at https://zerosoft.ai:
vercel link # once
vercel env add TURSO_DATABASE_URL production # libsql://<db>.turso.io
vercel env add TURSO_AUTH_TOKEN production
vercel env add NEXTAUTH_URL production # https://zerosoft.ai
vercel env add NEXTAUTH_SECRET production
vercel env add GOOGLE_CLIENT_ID production
vercel env add GOOGLE_CLIENT_SECRET production
vercel env add SHORT_DOMAIN production # zerosoft.ai
vercel --prod
To self-host on any $5 VPS instead, with Docker:
git clone <repo> && cd zerosoft
cp .env.example .env # NEXTAUTH_URL, NEXTAUTH_SECRET, Google credentials, SHORT_DOMAIN=your-domain
docker compose up -d # http://localhost:3000 — put any HTTPS reverse proxy in front
Your reverse proxy must add the client address to X-Forwarded-For (nginx: proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;, Caddy and Traefik do it by default). Rate limits per IP read the rightmost entry; with more than one proxy in a chain, set TRUST_PROXY_HOPS. If nothing sits in front of the app (it is exposed directly), set TRUST_PROXY=0: otherwise a client can send its own X-Forwarded-For and pick its rate-limit bucket.
Data lives in two volumes: zerosoft-data (the SQLite file) and zerosoft-uploads (attachments). Back them up and you have everything.
Without Docker: npm ci && npm run build && npm start.
ROBOTS_RUNNER is unset: npm ci installs playwright-core, you add the browser once with npx playwright-core install --with-deps chromium (or point ROBOTS_CHROMIUM_PATH at an installed Chrome). Set ROBOTS_RUNNER=none to disable runs. The same SSRF guard as webhooks blocks private hosts unless ALLOW_PRIVATE_WEBHOOKS=true./api/cron/tick. Vercel calls it once an hour (vercel.json). The Flow queue (schedules, delays, retries) and Cal reminders and workflow steps also run every minute from /api/cron/minute, and robot schedules also have their own cron, /api/cron/robots, every 5 minutes (due robots run in parallel, one per workspace; ROBOTS_CRON_CONCURRENCY caps how many at once); self-hosted, call it as often as you like (for example every minute with curl -H "Authorization: Bearer $CRON_SECRET" https://your-host/api/cron/tick). Cron expressions are 5-field with a time zone; robot intervals are at least 15 minutes./app/flow/credentials, encrypted per workspace. Keep CREDENTIALS_KEY (or NEXTAUTH_SECRET) stable.FLOW_CODE_RUNNER=sandbox + VERCEL_TOKEN, VERCEL_TEAM_ID, VERCEL_PROJECT_ID); without them it stays disabled. User code never runs inside the app process. Each execution is one microVM, capped per workspace by FLOW_CODE_RUNS_PER_HOUR (default 300) and FLOW_CODE_RUNS_PER_DAY (default 2000); set either to unlimited to lift it.Export everything, always: links and analytics are yours (JSON via API, and the SQLite file itself if self-hosted). No hostages.
app/ Next.js App Router
[locale]/ en / es / pt pages (home, products, blog, docs, legal, status)
[locale]/app/ product dashboards: links/, crm/, track/, calendar/, chat/, docs/
api/ links CRUD, keys, v1 public API (+ /api/v1/crm), auth
r/[slug]/ the redirect engine (302 + cookie-less click tracking)
components/ UI (ZeroField canvas, header/footer, link/* dashboard, crm/* CRM, products/* mockups)
content/blog/ 66 posts × 3 locales, Markdown with frontmatter
i18n/ routing + request config (next-intl)
lib/ db, auth, links, crm, analytics, rate limit, blog loader
messages/ en / es / pt UI strings
middleware.ts locale negotiation + short-link passthrough
lib/schema/ versioned migrations (baseline + numbered, tracked in schema_migrations)
ee/ enterprise features under a commercial license (see ee/README.md)
tests/unit/ Vitest · tests/e2e/ Playwright (critical flows + every screen)
scripts/seed.ts demo data (Link) · scripts/seed-crm.ts (CRM) — both run via npm run seed
styles/ globals.css, pages.css, link.css, crm.css (no Tailwind, hand-rolled)
Next.js 15 (App Router) · React 19 · TypeScript · @libsql/client (local SQLite file or Turso) · next-intl · next-auth v4 · zero CSS frameworks.
See CONTRIBUTING.md. Security issues: SECURITY.md.
Open core, the same model as Cal.com or Dub:
/ee — every core feature of every product — is AGPLv3. Use it, self-host it, modify it. If you offer a modified version as a service, publish your changes./ee folder (SSO/SAML, audit logs, custom roles, white-label) is source-available under the Zerosoft Enterprise License: free for development and testing, a subscription for production use. The license text is a draft pending legal review.FLOW_CODE_RUNNER | sandbox or none. The Flow "Code" node runs JavaScript in Vercel Sandbox (30 s, 128 MB, no network). Default: sandbox on Vercel or with VERCEL_TOKEN + VERCEL_TEAM_ID + VERCEL_PROJECT_ID, otherwise none (the node is disabled with a notice). |
ROBOTS_RUNNER | sandbox, local or none. Default: sandbox on Vercel; elsewhere local when playwright-core is installed (it is, after npm ci), else none. |
VERCEL_TOKEN / VERCEL_PROJECT_ID / VERCEL_TEAM_ID | Link custom domains on Vercel: domains are added to the project (and get HTTPS) through the Vercel API. Self-host: leave unset, domains are verified by DNS. |
APP_HOSTS | Extra hostnames that serve the app (comma-separated), so they aren't treated as custom short-link domains. |
TRUST_PROXY_HOPS / TRUST_PROXY | Client IP for rate limits when self-hosting. Behind a reverse proxy the app uses the X-Forwarded-For entry added by your proxy (the rightmost one); with several proxies in a chain set TRUST_PROXY_HOPS to how many there are (default 1). TRUST_PROXY=0 ignores those headers (use it if nothing in front rewrites them: everyone then shares one quota). On Vercel it uses X-Vercel-Forwarded-For. |
ALLOW_PRIVATE_WEBHOOKS | true allows webhooks to private/internal hosts and plain http (self-host on a private network). Never on a public cloud. |
ZEROSOFT_LICENSE_KEY | Enterprise license key for /ee features (optional). |
SHORT_DOMAIN | Public domain shown in short URLs, e.g. zs.ai. No trailing slash. |