Wano is the social discovery platform for Kampala and Uganda — places, events, experiences, restaurants, communities, and bookings, all in one app. Wano × AFCON 2027 is our launch campaign.
SocialTypeScript · CSSGitHub @denisekiremire-a11yOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A Kampala-focused discovery, booking and rewards app for travellers in Uganda — browse and book hotels, restaurants, tours/experiences, transport, spas, attractions and rentals from Wano-verified vendors, earn Passport stamps and points, and redeem rewards. Every listing type stays pay-at-venue today; a behind-a-flag paid-bookings pilot (Flutterwave, with Pesapal planned next) is layered on top without changing that default. AFCON 2027 content (club pages, match tickets, venue pages) lives behind its own flag and reuses the same booking/rewards machinery rather than a parallel system.
src/proxy.ts (Next 16's
renamed middleware.ts) for route protection.postgres.js driver), with Postgres Row-Level Security as a second,
database-enforced layer under the app's own server-side authorization checks. See
RLS and database migrations below — this is the part most likely to
trip up a new environment.src/lib/session.ts,
src/lib/auth.ts), email verification, WhatsApp/SMS phone verification, and self-service password
reset — deliberately lightweight (no third-party auth provider) so it stays easy to reason about.PAID_BOOKINGS_ENABLED kill switch.src/lib/whatsapp.ts) for phone verification and reminders.capacitor.config.ts) — this
is a server-rendered app with server actions and live cookies, not a static export, so the native
shell loads the deployed site at runtime rather than bundling a build.src/app/globals.css).src/app/api/cron/*, Neon
for managed Postgres in production.Start a Postgres database. Either run the bundled one:
docker compose up -d
or point DATABASE_URL at any managed Postgres (Neon, Supabase, RDS, etc).
Configure environment variables:
cp .env.example .env.local
# then edit .env.local — set DATABASE_URL and generate an AUTH_SECRET:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
Install dependencies (already done if you're continuing this session):
npm install
Push the schema, apply RLS, and seed demo data:
npm run db:push
# then every file in drizzle/manual_*.sql, in the order described below —
# db:push alone does not set up RLS or any other non-schema.ts SQL
npm run db:seed
npm run db:seed:wano
(db:seed:birthday, db:seed:journal and db:seed:clubs add more optional demo content for
those specific features — not required for a basic local setup.)
The seed scripts create the 5 fixed journeys, demo challenges, a handful of demo accredited
vendors (one pending accreditation), and demo accounts — all with password
WanoLocalDev-9214! (local dev only; see src/db/seed.ts if you change it):
[email protected] (already has 2 of 5 stamps)[email protected] (and several others — see src/db/seed.ts)[email protected]These credentials are for a local database only — never rendered on any page, and never the credentials for the live/production deployment.
Run the dev server:
npm run dev
Open http://localhost:3000.
(Optional) Admin email notifications. The admin gets an email whenever someone signs up (traveller or vendor), a vendor submits an accreditation document, or someone submits/applies to start a club. This works out of the box in a sort of way — without any setup it just logs the email to the server console instead of sending it, so nothing breaks, but nothing actually arrives anywhere either. To get real emails:
This is the beginning of the README. Read the rest at the original. Read the full README ↗
RESEND_API_KEY in .env.local (and in your Vercel project's environment variables for
production).[email protected] (same as the site's public support
address) — set ADMIN_NOTIFICATION_EMAIL to change that.[email protected] address, which only
delivers to the email on your own Resend account. To send to any address, verify a real domain
under Domains in Resend, then set EMAIL_FROM to an address on that domain (e.g.
Wano <[email protected]>).NEXT_PUBLIC_APP_URL to your real deployed URL so the links inside notification emails
(e.g. "review this vendor", a password reset link) point somewhere real instead of
localhost:3000.