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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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
- Citizen spots a problem
- Takes a photo, maybe posts online
- No public record is created
- No one confirms the scale
- Work order may or may not be issued
- If work happens, no evidence trail
- 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
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
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
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.
Roles
Citizen
Report faults, confirm neighbours' reports, contribute to community funds.
Self-serve at sign-up
Contractor
Browse funded cases, claim work, upload evidence, get paid on verified completion.
Self-serve at sign-up
Administrator
Review completed work against a checklist, pass or fail inspection, oversee cases.
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:
- 01Coordinate jitter on report pins, so a public case never exposes a home address.
- 02Role-gate the evidence read endpoints server-side, not only the pages that show them.
- 03Write the payout record on a passing inspection, closing the money loop in the database.
- 04Replace the duplicate-detection radius with a proper great-circle check, and drop the current degrees-versus-kilometres mismatch.
- 05Real payment rails and SMS notification delivery.
Built with
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
