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