Skip to content
VaelkorCivic
Hackathon 2025 · Vaelkor Civic

Karachi's civic problems, fixed by the people who live with them.

Vaelkor Civic is a community-powered infrastructure reporting platform. Citizens document faults, neighbours confirm them, the community funds the repair, and licensed contractors do the work — all tracked on a public ledger with evidence at every step.

Judge quick start

Everything below runs against a live deployment with seeded data. The ledger, the map and every case page are readable without an account.

To walk the full loop, sign up twice as a citizen and once as a contractor — both roles are self-serve. The administrator role is deliberately not self-selectable and is granted by an operator, so ask us if you want to see the inspection queue.

1

Anyone, no account

Open the ledger and the map

The public ledger and the map are fully readable signed out. Every case, its status, its photos, and its funding progress are visible. Start from the map to see the pins, then click a case.

/ledger
2

Citizen — sign up

File a real report

Sign up, pick Citizen, then file a report with a photo and a category (Road, Waste, Drainage, Light, Spaces, Other). The pin drops at your device location and the case appears in the ledger immediately as your own first confirmation.

/report
3

Citizen

Get it to 3 confirmations

Open a second account and hit Confirm. One more account confirms and the case flips to verified on its own — no operator touches it. Confirmations lock the second a work order exists.

/ledger
4

Citizen

Pledge to the repair fund

A goal is assigned automatically — PKR 5,000 standard, PKR 10,000 for drainage or high severity. Pledge between PKR 1 and PKR 500 per pledge; the progress bar moves as you do.

/ledger
5

Contractor — sign up

Claim the funded work

Sign up as Contractor, open the work board, and claim an open case. A case unlocks once pledges reach 80% of its goal. Claiming assigns you exclusively — nobody else can file evidence on that case.

/contractor
6

Contractor

File before / during / after evidence

Upload the three evidence sets on the case. The work order moves through claimed, in progress, and completion submitted, and the case moves to inspection automatically.

/contractor
7

Administrator

Inspect and close

The inspection queue shows the before and after evidence side by side against a checklist. Pass closes the case and releases the resolution; fail sends it back to the contractor with a note.

/inspect
8

Citizen — sign up

Open the Civic Network

Go to /network — no account needed to read. See posts from the community, filter by category, browse Civic Pulse for live analytics.

/network
9

Citizen

Create a post & link a case

Create a post about a road issue, attach a photo, and link it to an existing case from the ledger. The post now shows the case's live status, work order, and before/after evidence.

/network/create
10

Citizen

Confirm & comment

Hit "I'm affected too" on a post — the count increments. Add a comment with local knowledge. Watch the post appear in Civic Pulse.

/network

The problem

Karachi faces millions of small civic problems every day — potholes, broken streetlights, overflowing drains, garbage piling up on sidewalks. Most never get fixed because no one has a way to track whether a complaint actually led to action.

Complaints disappear into helplines and social media posts. There is no public record connecting the problem to the repair. Citizens have no visibility into what happens after they report, and contractors have no easy way to find work that the community already agrees needs doing.

Vaelkor Civic closes that loop — from report to repair, all in public view.

What happens today

  1. Citizen spots a problem
  2. Takes a photo, maybe posts online
  3. No public record is created
  4. No one confirms the scale
  5. Work order may or may not be issued
  6. If work happens, no evidence trail
  7. Problem reappears, cycle restarts

How it works

STEP 01

Take a photo

Point your phone at the problem and snap it. Add a short description and category.

STEP 02

Pick a location

The app reads your device location and places the pin on the map.

STEP 03

Submit the report

The case enters the ledger. Others nearby will see it and can confirm.

STEP 04

Wait for confirmation

Once 3 people confirm, the case is verified.

STEP 05

Fund the repair

Community pledges fill the repair fund. Once the goal is met, contractors can claim it.

STEP 06

Work gets done

A contractor completes the repair, uploads before and after photos, and an inspector verifies closure.

Key features

Report with a photo

Snap a picture of any civic fault — pothole, broken light, clogged drain. Location is captured automatically; no need to type an address.

Community confirms

After 3 independent people confirm the report, the case is verified and moves to funding. Noise stays noise.

Community-funded repairs

Anyone can pledge toward a case's repair fund. Once the goal is reached, the case becomes open for contractors to claim.

Contractors pick work

Contractors browse verified, funded cases and claim the work they can do. Only the assigned contractor files before-and-after evidence.

Evidence-backed close

Work moves to inspection after completion evidence is filed. An administrator compares before and after photos against a checklist and marks the case resolved.

Anti-gaming by construction

Confirmations lock the moment a work order exists, so popularity can never inflate a case that is already being worked. Every lifecycle edge is an asserted transition, not a free-text status.

Civic Network

The Civic Network is the public accountability layer of VAELKOR CIVIC. It turns the ledger into a living civic space where citizens surface problems, communities verify them, and progress becomes visible — all without leaving the post.

The core loop: Report → Post → Community → Verification → Work Order → Progress → Resolution.

Civic posts

Citizens post issues, updates, or observations with photos. Posts are public, categorical, and can link to existing ledger cases.

"I'm affected too"

Not a like — a civic confirmation. One per person. Counts show "47 residents affected" and drive visibility in Civic Pulse.

Comments

Flat, useful local information — "this has been broken for three weeks", "repair started this morning". No nested threads.

Work order integration

A post linked to a case shows live status, work order progress, contractor name, and before/after evidence — no need to leave the post.

Civic Pulse

Real-time analytics: active cases, resolved, being worked on, posts, confirmations, comments — all counted from live rows, never fabricated.

Before / After proof

Posts linked to cases surface the work order's before and after photographs side by side — accountability made visible.

The system

Citizen
↓Civic Network
↓Verified Issue
↓Work Order
↓Contractor
↓Evidence
↓Resolution

Under the hood

9 lifecycle states, asserted not assigned

A case moves reported → confirmed → verified → open → claimed → in progress → completion submitted → inspection → closed. Every edge is declared in one table and every transition is checked against it, so an illegal move is a rejected mutation rather than a corrupted row.

One writer for case state

All status changes funnel through a single lifecycle function that patches the case and its work order in the same atomic mutation. A case can never sit closed while its work order still says in progress.

Server-side role gates

Every mutation re-checks the caller's role on the server. The UI hides what you cannot do, but the check that matters is in Convex — the deployment is a public endpoint, and the client is never trusted.

Money as a ledger, in cents

Goals, pledges and claims are integer cents — no floats in the money path. Two tiers, not nine: PKR 5,000 standard and PKR 10,000 for drainage or high severity, with an administrator able to adjust a goal inside a hard ceiling.

Evidence first, claims second

A report is unusable without a photograph. Before, during and after evidence is attached to the work order, and closure is only reachable through an inspection that reads it.

Notifications on real transitions

6 event types fan out to the reporter, the assigned contractor and the administrators watching a case, fired from the transition itself — so nobody has to remember to tell anyone.

Quality and verification

A platform that holds money and photographs has to be right, not just demonstrable. The state machine, the funding arithmetic, the role gates and the claim approval path are covered by an automated suite that runs on every change.

The tests are written against a real Convex backend harness rather than mocks, so the lifecycle, the storage and the authorisation rules are exercised as deployed. The funding tier rules are a pure function with an exhaustive matrix test; the funding gate is tested from both directions, through pledges and through approved claims.

We would rather show you the test count than ask you to trust the demo.

Current state

Automated tests265 passingAcross 13 files
Type safetyStrictTypecheck clean, zero errors
Production buildPassing22 routes compiled
Rate limitingPer-userOn every write path
IdempotencyKeyedDuplicate submits rejected
Roles3Citizen, contractor, admin

Submitting a report

Filing a report takes about 30 seconds on a smartphone. You take a photo of the fault, select a category (road, drainage, garbage, streetlight), and the app captures your location automatically. No account is required to read the ledger, but you need one to submit a report.

Once submitted, the case appears on the public ledger and map. Other users in the area can confirm they see the same problem. After 3 confirmations, the case is verified and a repair fund is opened. Anyone can then contribute toward the estimated cost. When the fund reaches its goal, the case becomes available for contractors to claim.

Report requirements

  • At least one photograph (required)
  • One of four categories (road / drainage / garbage / streetlight)
  • Location captured from the device (required)
  • At least 3 confirmations to verify
  • A funded repair goal before contractor assignment

How the repair fund works

When a case is verified it is assigned a repair goal automatically. We deliberately use two tiers, not a table of nine: a table of near-identical numbers is a number nobody can hold in their head, and a pledger told "PKR 7,300" has no way to judge whether that is fair. The rule that picks the tier is one sentence, and it is printed on the case.

Drainage and any high-severity case asks for PKR 10,000. Everything else asks for PKR 5,000. Severity is a floor, not a ceiling — a high-severity pothole is not made cheap by being reported as one. An administrator can still adjust a single goal inside a hard ceiling, and the reason is recorded in the audit log.

A pledge is a commitment, not a payment. The platform never moves money. At this stage the ledger records intent, and a passing inspection records that the work was verified as complete.

Funding rules

Standard goalPKR 5,000
Major goalPKR 10,000
Assigned whendrainage or high severity
Pledge sizePKR 1 – PKR 500
Claim unlocks at80% of goal
Payment methods3
Administrator ceilingPKR 15,000

A pledge claim is filed against one of 3 supported payment methods with a screenshot, and an administrator credits it after verification. Unverified claims never count toward the goal.

Contractors picking work

A case becomes available to contractors once pledges reach 80% of its repair goal. This ensures there is real backing before any work is assigned.

Contractors browse the ledger or map for cases near their area of operation. When they claim a case, they become the sole person authorized to upload before, during, and after photographs. Once the work is done, they submit the evidence and the case moves to an administrator for inspection.

The administrator compares the before and after evidence against a standard checklist. A pass closes the case and records the resolution. A fail returns the case to the contractor with a note explaining what is still outstanding.

Case statusverified + funded → open
Who can claimAny registered contractor
Evidence requiredBefore → During → After photos
Closure triggerAdministrator inspection pass
Reopened onFailed inspection, with a note

Roles

Citizen

Report faults, confirm neighbours' reports, contribute to community funds.

Go to report

Self-serve at sign-up

Contractor

Browse funded cases, claim work, upload evidence, get paid on verified completion.

Go to work

Self-serve at sign-up

Administrator

Review completed work against a checklist, pass or fail inspection, oversee cases.

Go to inspect

Granted out of band — not self-selectable

What is real, and what is not

A hackathon build should be honest about its edges. Here is exactly what is running for real, and what is a placeholder we would finish before this touched a live city.

The full report-to-closure lifecycle

Real mutations, real state machine, real database rows.

Funding ledger and the 80% claim gate

Real pledge records, enforced server-side.

Photo evidence on the work order

Real Convex file storage with signed URLs.

Role separation and admin oversight

Enforced on the server, not just hidden in the UI.

Civic Network posts, confirmations, comments

Real mutations, real-time counts, linked to live cases.

Civic Pulse analytics

Counts from live database rows via paginate({ numItems: 0 }).

Work order integration on posts

Linked posts read case status, work order, and evidence live.

Before/after evidence on linked posts

Surfaces the work order's actual evidence, not copies.

Moving actual money

Pledges and claims are records of intent. No payment gateway, and the payout table is not written yet. The bank details shown are placeholders.

Anonymous location privacy

Coordinates are stored as reported so the pin lands on the fault. We have not added coordinate jitter yet, so a report is effectively public at block level.

Email and SMS delivery

Notifications are in-app only at this stage.

City-scale geospatial queries

Convex has no geo index, so nearby search scans recent cases in JavaScript. Correct at pilot volume, not at city volume.

What we would fix next

In priority order, and all of it visible on the current codebase rather than in a wishlist document:

  1. 01Coordinate jitter on report pins, so a public case never exposes a home address.
  2. 02Role-gate the evidence read endpoints server-side, not only the pages that show them.
  3. 03Write the payout record on a passing inspection, closing the money loop in the database.
  4. 04Replace the duplicate-detection radius with a proper great-circle check, and drop the current degrees-versus-kilometres mismatch.
  5. 05Real payment rails and SMS notification delivery.

Built with

Next.js 16
Convex (backend)
Clerk (auth)
MapLibre GL (maps)
TypeScript (strict)
Shadcn UI

See it in action

The ledger is live. Try filing a report, or browse what the community is fixing right now — everything on that ledger is a real record written by a real mutation.

Vaelkor Civic · Hackathon 2025 · Karachi, Pakistan