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。 以下为已保存的摘录。
A clean rental property management app for tracking properties, tenants, leases, payments, expenses, and maintenance. Built with Next.js 15 + Supabase + Tailwind.查看完整 README ↗A clean rental property management app for tracking properties, tenants, leases, payments, expenses, and maintenance. Built with Next.js 15 + Supabase + Tailwind.
supabase/schema.sql and click Rundocuments, set as Privatesupabase/storage-policies.sql and Run (enables per-user file isolation)http://localhost:3000 for local) and add <your-domain>/auth/callback to redirect URLsanon public keycp .env.example .env.local
Edit .env.local and paste in your Supabase URL and anon key.
npm install
npm run dev
Open http://localhost:3000 — it'll redirect you to login. Sign up with your email, confirm via the email Supabase sends, then start adding properties.
git add . && git commit -m "Initial rental management app"
git push origin main
On Vercel:
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY)Enable the tenant portal "Pay rent" flow.
https://your-domain.com/api/stripe/webhookpayment_intent.succeeded, payment_intent.processing, payment_intent.payment_failed, payment_intent.canceled, invoice.paid, invoice.payment_succeeded, invoice.payment_failed, setup_intent.succeededwhsec_)STRIPE_SECRET_KEYNEXT_PUBLIC_STRIPE_PUBLISHABLE_KEYSTRIPE_WEBHOOK_SECRETSUPABASE_SERVICE_ROLE_KEY (used by the webhook handler only)supabase/v9-stripe-payments.sql in the Supabase SQL Editor to add Stripe columns to tenants, leases, and payments plus the tenant_payment_methods table.stripe listen --forward-to localhost:3000/api/stripe/webhook and use the printed whsec_ value for STRIPE_WEBHOOK_SECRET.ACH payments take 3–5 business days to clear. Until they do, the payment shows as Processing in both the tenant and landlord views. Cards clear instantly.
app/
(app)/ # Authenticated routes (sidebar layout)
page.tsx # Dashboard
properties/ # List + new
tenants/ # List + new (auto-creates lease)
payments/ # Bulk collection + new
expenses/ # List + new
maintenance/ # List + new
reports/ # P&L and category breakdowns
layout.tsx # Sidebar wrapper
login/page.tsx # Sign in / sign up
layout.tsx # Root
components/Sidebar.tsx
lib/supabase/
client.ts # Browser client
server.ts # Server client
middleware.ts # Auth gate
supabase/schema.sql # Database schema (run once)
Every payment is tagged as Rent or Security deposit on the record-payment
form (/payments/new, or "Record deposit" from the command palette).
supabase/v13-payment-type.sql adds the payment_type column; it is applied
automatically (see Database migrations below). Payments recorded before it
are backfilled as rent.Until that migration is run the app still shows your complete payment history — every payment is simply treated as rent, and the Payments page shows a banner pointing at the migration. Recording rent keeps working; recording a deposit asks you to run the migration first rather than saving it as rent.
Schema changes ship with the code — no pasting SQL into the dashboard.
One-time setup: in Supabase go to Project Settings → Database → Connection
string → URI, copy the Session pooler URI (the direct host is IPv6-only and
GitHub's runners can't reach it), and add it to GitHub under
Settings → Secrets and variables → Actions as SUPABASE_DB_URL.
After that, every push to main that touches supabase/** runs
.github/workflows/migrate.yml, which applies whatever is outstanding. You can
also trigger it by hand from the Actions tab (with a "list only" option), or
run it locally:
export SUPABASE_DB_URL="postgresql://..."
npm run migrate:check # list what would run, change nothing
npm run migrate # apply
How it works
supabase/migrations.json lists every SQL file in dependency order. Add each
new migration to the end of that list.public.schema_migrations, so runs are
idempotent — re-running applies nothing.DROP TABLE, DROP COLUMN, TRUNCATE, or DELETE FROM unless you
explicitly set ALLOW_DESTRUCTIVE=1.A brand-new Supabase project still needs the private documents storage bucket
created by hand (Storage → New bucket) — that isn't a SQL migration.
units table. The "Add property" form creates a single default unit; for a duplex you'd add a second unit manually (UI for this comes in Phase 2).NUMERIC(10,2) — no float precision issues.(app) route group is a Next.js convention — it groups authenticated pages under one shared layout (sidebar) without affecting URLs.