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.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Self-service U.S. business compliance filings, starting with Pennsylvania annual reports. Customers find their business, see what's required, when it's due and what it costs (state fee and service fee shown separately), authorize us, pay through hosted checkout, and track the filing to completion. Operators fulfil each order from a generated filing packet.
Filewell is a private filing service. It is not affiliated with or endorsed by any government agency, and customers can always file directly with their state.
Requirements: Node 24, Docker Desktop (for the local Supabase stack).
npm install
cp .env.example .env.local # then fill in values
npx supabase start # local Postgres, Auth, Storage, Mailpit (emails at http://127.0.0.1:54324)
npx supabase db reset # applies supabase/migrations
npm run seed # states, agencies, PA rules, provisional price, templates
npm run dev
npx supabase status prints the local URL and keys for .env.local
(NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY, SUPABASE_SECRET_KEY).
.env.local only ever points at local or staging; production credentials never go there.
Brand, support address, legal entity and postal address come from NEXT_PUBLIC_*
variables read in src/config/site.ts (see .env.example); change them in Vercel and
redeploy, not in code. Production links always use https://www.getfilewell.com.
Create an operator: sign up through the app, then
npm run grant-staff -- [email protected] admin
| Command | What it does |
|---|---|
npm run dev | Next.js dev server |
npm run build / npm start | Production build / serve |
npm run typecheck | tsc --noEmit |
npm run lint | ESLint |
npm test | Unit + database tests (Vitest; database tests run the real migrations in PGlite, no Docker needed) |
npm run test:e2e | Playwright end-to-end journey (needs a running app + Supabase) |
npm run seed | Idempotent reference-data seed (refuses to alter a published rule version) |
npm run grant-staff -- <email> <admin|operator|revoke> | Staff access |
The Playwright suite drives the full Pennsylvania journey (visitor → lookup → account
→ intake → authorization → sandbox payment → operator queue → packet → submitted →
receipt → accepted → customer notified → reminders stop) plus cross-account attacks
and webhook forgery. It needs NEXT_PUBLIC_SUPABASE_URL and SUPABASE_SECRET_KEY in
.env.local (test users are created with the service role).
npm run build && npm run test:e2e # local production build
E2E_BASE_URL=https://<deployment>.vercel.app \
E2E_SHARE_URL="https://<deployment>.vercel.app/?_vercel_share=<token>" \
npm run test:e2e # a protected Vercel deployment
E2E_SHARE_URL is a temporary Vercel share link (Vercel MCP get_access_to_vercel_url
or the dashboard's "Share" button); the global setup visits it once and reuses the
access cookie. VERCEL_AUTOMATION_BYPASS_SECRET, if set, is sent as the protection-bypass
header instead. Playwright loads .env.local, then .env.e2e (overriding it). E2E never
uses the production Supabase project, and against a production host only
tests/e2e/public.spec.ts runs.
PAYMENTS_PROVIDER=sandbox (default) uses the built-in hosted-checkout simulator:
no card fields, no money, signed webhooks through the same processing path as Stripe.
PAYMENTS_PROVIDER=stripe uses Stripe Checkout. Live keys are refused unless
PAYMENTS_LIVE_ENABLED=true, and live checkout refuses service prices an admin has not
approved in /admin/pricing.
The production deployment refuses the sandbox and Stripe test keys. Nothing stops a
Preview given live keys and PAYMENTS_LIVE_ENABLED=true from charging cards, so those
go on the Vercel Production target only, never "All environments".
Stripe webhook endpoint: POST /api/webhooks/payments/stripe (events:
checkout.session.completed, checkout.session.async_payment_succeeded,
checkout.session.async_payment_failed, checkout.session.expired,
refund.created, refund.updated; payment_intent.payment_failed is ignored). Registered
agent subscriptions also need invoice.paid, invoice.payment_failed,
customer.subscription.updated and customer.subscription.deleted on the same endpoint
before any registered agent sale (/admin/registered-agent reminds you).
Built and switched off. Every sale fails closed behind environment switches, verified state fees, approved prices and, for real money, the signed wholesale agreement. See docs/REGISTERED_AGENT.md for the launch gates, the operator runbook, renewals and the Harborlune LLC transition checklist.
EMAIL_PROVIDER=outbox records every email in the notifications table (visible at
/admin/notifications) without sending. EMAIL_PROVIDER=resend sends through Resend
from EMAIL_FROM (default Filewell <[email protected]>, a Resend-verified domain).
Resend delivers only on the production deployment; set RESEND_API_KEY on the Vercel
Production target only. Previews and local runs stay on the outbox unless
EMAIL_PROVIDER=resend and EMAIL_DELIVERY_OUTSIDE_PRODUCTION=true (a deliberate staging
deliverability check); tests always do.
vercel.json schedules GET /api/cron/reminders daily at 13:00 UTC with
Authorization: Bearer $CRON_SECRET. Operators can also run a cycle from
/admin/reminders. The daily run also does the registered agent checks; once registered
agent service is sold, call GET /api/cron/services hourly (same header) so urgent legal
documents escalate on time.
src/lib/compliance/states/<state>.ts exporting ComplianceRuleDef[] with
verificationStatus: "verified" only after independent verification.src/lib/compliance/registry.ts, set supportLevel and
filingEnabled in jurisdictions.ts, add a service price, run npm run seed.version with a new effectiveFrom.
Published versions are immutable; existing orders keep the version they used.