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
أخبر كاسكيد بما تحتاجه وما تقدر عليه. كاسكيد تطابقك مع فرص تطوير عقاري مصممة حول خطتك.
Translation pending
BusinessTypeScript · SwiftGitHub @AbdallatifTiyahOnlineOwner 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.
Cascade — Real Estate Investment & Development
Cascade is a demand-driven real estate investment and development platform.
Instead of browsing listings, a customer tells Cascade what they need and what
they can afford; Cascade scores real development opportunities against that
plan and explains exactly why each one fits. On the admin side, every customer's
property profile becomes structured demand data used to decide where to buy
land, what to build, and whether a project has enough real demand to justify
developing it.Read the full README ↗Cascade is a demand-driven real estate investment and development platform. Instead of browsing listings, a customer tells Cascade what they need and what they can afford; Cascade scores real development opportunities against that plan and explains exactly why each one fits. On the admin side, every customer's property profile becomes structured demand data used to decide where to buy land, what to build, and whether a project has enough real demand to justify developing it.
Core loop: preferences → financial capacity → demand data → land opportunity → project feasibility → group participation → apartment allocation → payment plan → construction tracking → handover.
| Role | Password | |
|---|---|---|
| Customer | [email protected] | Demo1234! |
| Admin | [email protected] | Admin123! |
The demo customer already has a completed property profile, a live reservation in Modern Heights (Ramallah), a partially-paid installment plan, and construction/notification history — so you can see "My Project" and "Payments" populated immediately. You can also sign up as a brand-new customer to walk the full onboarding → matching → reservation flow from scratch (the "Build My Property Plan" CTA).
Single Next.js 14 (App Router) application, chosen so the whole product — web today, and a native shell later — shares one backend and one set of business rules:
src/app/api/** form a conventional REST-ish API,
so a future React Native/Expo app (or any other client) can call the exact
same endpoints instead of duplicating logic — no separate "mobile backend"
is needed later (spec's mobile-readiness requirement).src/lib/, not in components or routes. The
matching engine, feasibility calculator, financial utilities, and land
scoring are plain, framework-agnostic TypeScript functions with no React or
Prisma imports in their core (src/lib/matching/engine.ts,
src/lib/feasibility/engine.ts, src/lib/finance.ts,
src/lib/land/scoring.ts). UI code and API routes both call into these —
the same function that scores a match on the customer's screen is what the
admin "Matching" screen and demand-coverage reports use, so results are
always consistent and independently testable.prisma/schema.prisma) — no
native enums/arrays are used (enum-like fields are plain String validated
with Zod), so the same schema runs unchanged against a local Postgres
instance, Neon, Supabase, or RDS. This also matters for hosting: serverless
platforms like Vercel and Cloudflare have no persistent disk, so a
file-based database was never an option for anything beyond a throwaway
local demo.src/middleware.ts,
src/auth.config.ts). Email/SMS verification is simulated (the OTP is
returned directly to the client and shown on-screen, clearly labeled as demo
mode) since no SMS/email provider is configured — swap in a real provider by
sending the code there instead in src/app/api/auth/signup/route.ts.src/components/ui/ (Button, Card, Badge, Table, Dialog, Toast, Tabs,
Progress, Skeleton, empty/error states) — no external component library, so
every visual token traces back to globals.css custom properties.This is an MVP with one team and one database. A single deployable Next.js
app with a clean lib/ boundary gets the "reusable business logic" and
"future mobile" requirements without the operational cost of running and
deploying multiple services for a problem this doesn't have yet.
prisma/schema.prisma Data model (see below)
prisma/seed.ts Realistic demo data generator
src/app/ Routes (App Router) — customer, admin, and API
src/components/ UI, by feature area (onboarding, projects, admin, ui/)
src/lib/
matching/ Match scoring engine + weights + explanations
feasibility/ Project feasibility calculator
land/ Land → demand scoring + product estimation
demand/ Demand segment aggregation + project coverage
finance.ts Monthly payment / amortization schedule utilities
currency.ts Centralized currency formatting
constants.ts Shared vocabularies (locations, amenities, statuses…)
validation/ Zod schemas
Key entities (see prisma/schema.prisma for the full picture, including
indexes and relations): User, PropertyPreference (+ PreferenceLocation),
Location, Land, Project, Apartment, ProjectParticipant,
Reservation, PaymentPlan/Payment, ConstructionStage, ProjectUpdate,
Notification, DemandSegment, MatchingConfiguration, MatchingResult,
ProjectFeasibility, AuditLog, AnalyticsEvent.
src/lib/matching/engine.ts — calculateMatchScore(profile, project, weights)
is a pure, deterministic function: the same profile + project + weights
always produce the same score (spec requirement — auditable, no randomness).
src/lib/matching/explain.ts), and a weight. The weighted sum is the
overall match percentage shown to the customer, with a full breakdown
("Location: perfect match", "Monthly payment: within your budget", …) —
never just a bare number.MatchingResult with its weights
snapshot and timestamp, so scores stay auditable even after weights change.MatchingConfiguration and editable from
Admin → Matching (/admin/matching) — adjusting them re-scores every
future match without a code change.src/lib/feasibility/engine.ts — calculateProjectFeasibility(input) takes
land/construction/other costs, unit count, average unit price, and the number
of "highly matched" potential participants (score ≥ 70, computed by
src/lib/demand/coverage.ts from real demand data), and returns total cost,
total revenue, gross margin, cost/revenue per unit, and demand coverage — each
labeled estimated, never a guaranteed return. Admin → Feasibility
(/admin/feasibility) lets you load these inputs from an existing land or
project and adjust them live.
Land opportunities get a separate, explainable Land → Demand Match score
(src/lib/land/scoring.ts, shown on /admin/lands/[id]) — a weighted
composite of real demand coverage, location popularity, size fit, and
affordability fit against the actual seeded demand pool, not a black box.
You need a reachable PostgreSQL instance (a local one, or a free Neon/Supabase project — see the deployment section below).
npm install
cp .env.example .env # then set DATABASE_URL (and DIRECT_URL) to your Postgres instance
npm run db:push # create the schema
npm run db:seed # seed realistic demo data (120 users, 6 projects, 8 lands, reservations…)
npm run dev
Open http://localhost:3000. Log in with either demo account above, or sign up as a new customer.
See .env.example. DATABASE_URL must point at a real Postgres instance —
there is no zero-config fallback. DIRECT_URL is only relevant for
connection-pooled providers like Supabase (see below); for a plain Postgres
instance or Neon, set it to the exact same value as DATABASE_URL — Prisma
requires the variable to exist even when it's unused. Generate a real
AUTH_SECRET with openssl rand -base64 32 for anything beyond a throwaway
local run.
npm run db:seed wipes and regenerates all demo data (safe to re-run anytime
during development). npm run db:reset does a full Prisma migration reset.
The app is a standard Next.js app with no platform-specific code. This was
validated end-to-end in a sandboxed environment (full next build +
next start against a real Postgres instance, every customer and admin
screen exercised) but never deployed to a live URL from there, since that
environment had no hosting credentials — these are the exact steps to do it
from your own account.
1. Create a free Postgres database — Neon or Supabase both work:
Neon:
DATABASE_URL and DIRECT_URL below.Supabase:
6543, includes
?pgbouncer=true) for DATABASE_URL — required because serverless
functions open many short-lived connections that would otherwise exhaust
Postgres' direct connection limit.5432, no pgbouncer param)
for DIRECT_URL — Prisma needs an unpooled connection to run
db push/migrations, since the transaction pooler doesn't support them.2. Import the project into Vercel (the screen you're on):
./ (leave as-is).npm run build, npm install, and no explicit output directory needed).3. Environment variables — add these under "Environments" before deploying:
| Key | Value |
|---|---|
DATABASE_URL | pooled connection string (Supabase) or your connection string (Neon) |
DIRECT_URL | direct connection string (Supabase) or the same value as DATABASE_URL (Neon) |
AUTH_SECRET | any long random string (e.g. generate one at https://generate-secret.vercel.app/32) |
NEXTAUTH_URL | your Vercel URL, e.g. https://cascade-yourname.vercel.app (you can add/fix this after the first deploy once Vercel assigns the domain) |
NEXT_PUBLIC_DEFAULT_CURRENCY | USD |
4. Deploy. Vercel will run npm install and npm run build. prisma generate runs automatically as part of npm install (via the postinstall
script in package.json), so the client is always in sync with the schema.
5. Create tables and seed demo data — one time, after the first deploy:
run this from your own machine (with Vercel CLI: vercel env pull to get the
variables locally), or from any machine with Node — use the direct
connection string for both commands here, even on Supabase, since db push
needs it:
DATABASE_URL="<your direct connection string>" npx prisma db push
DATABASE_URL="<your direct connection string>" npx tsx prisma/seed.ts
After that, redeploying from Vercel (e.g. a new push to the branch) reuses the same database — you don't need to reseed on every deploy.
Two layers, so people can try Cascade as an "app" today while the real native apps come together:
The site ships a web manifest (public/manifest.webmanifest), app icons
(public/icons/), and a minimal service worker (public/sw.js). Anyone who
opens the deployed URL in Chrome (Android) or Safari (iOS) can tap "Add to
Home Screen" / "Install app" and get a standalone icon that opens
without browser chrome — no APK to send, works immediately for anyone with
the link.
capacitor.config.ts + the android/ and ios/ folders wrap the live site
(server.url in the config) in a real native WebView shell — same
architecture as most "hybrid" apps, and the right fit here since Cascade is
a server-rendered app with auth/cookies/API routes (not a static export).
Update server.url if the production domain changes.
Getting a real APK to hand out: this dev environment can't reach
dl.google.com (blocked network policy), so Android's Gradle plugin can't
resolve here. Instead, .github/workflows/build-android.yml builds it on
GitHub's own runners (unrestricted network):
main).android/, which triggers it automatically).cascade-debug-apk artifact when the run finishes — that
app-debug.apk is installable on any Android phone with "install from
unknown sources" allowed. It's a debug build, so it's fine to hand out
for trying the app, but sign a release build before any real
distribution (Play Store or otherwise).iOS: the ios/ Xcode project is scaffolded and ready, but Apple builds
need Xcode on macOS plus your own Apple Developer account/signing
certificates for a real IPA — GitHub Actions has macOS runners (runs-on: macos-latest) if you want to automate this too, but code signing has to be
set up with your own Apple credentials first, so it isn't wired up yet.
Local development: npx cap sync android / npx cap sync ios after
capacitor.config.ts changes, then open android/ in Android Studio or
ios/App/App.xcworkspace in Xcode if you have those installed locally.
Nothing in src/lib/ (matching, feasibility, finance, land scoring, demand
aggregation) imports React or Next.js — those modules, plus the
src/app/api/** Route Handlers, are the reusable core if you outgrow the
WebView shell and want fully native screens later; they could be called
directly from a React Native/Expo app too.
Being upfront about scope tradeoffs made to prioritize a complete, working core journey over speculative breadth:
src/lib/finance.ts and the
Payment model without changing the schema shape.src/lib/i18n/) but only English strings are fully
wired through the highest-traffic screens; adding Arabic means adding
ar.ts with the same keys and flipping dir="rtl" — no component rewrites.