Skip to content
โ—‡ AirawatOS Developer
๐Ÿšง Under development โ€” this portal is being built track by track. Content will keep growing, and some sections are still placeholders.

Tutorials

Service Delivery โ€” Deliver a citizen service

Build a real service an agency publishes and a resident uses: file a civic complaint, route it to the right officer, and see it through to resolution โ€” all from the platform's own apps, with no bespoke server code.

The use case

A resident notices a problem the city should fix โ€” uncollected garbage, a burst water line, a dead streetlight. They need to report it and track it to resolution. The city needs to receive it, route it to the right officer, resolve it, and stand behind an auditable record. Every city in the network needs the same thing, each running its own version.

The challenges

A civic service sounds simple until you list what actually makes it hard:

Keep this list in mind. At the end we'll return to each one and show exactly how the platform handled it.

What you'll build

A working "Report a Civic Complaint" service: an agency publishes it from Service Studio, a resident files one through the Jan Seva app, it lands in the right officer's Tasks inbox, and it moves to resolution โ€” and you'll write no server code to make that happen.

The arc: build the service โ†’ publish it โ†’ install it โ†’ the resident uses it. You'll do each step in an app; each app just drives governed data underneath, so the API call is shown as "under the hood" โ€” you never type it.

Apps you'll use (install them from the Marketplace, or open at /apps/<name>/): Studio (developer),
Service Studio, Admin, Network Admin, Marketplace, Jan Seva, Tasks.
Example agency: nashik.

Step 1 โ€” Govern the vocabulary (once)

A service can only reference governed nouns and roles โ€” that's what lets a citizen app built by someone else understand your service, and makes "who may act" a shared, signed decision. You propose; a network steward approves.

The roles this complaint service routes to โ€” civic.grievance-officer, urban.sanitation-officer โ€” are already governed, so you can skip straight to Step 2.

Under the hood: ๏ผ‹ Request a schema โ†’ POST /bridge/schema-request ยท Request a new role โ†’
POST /bridge/role-request ยท Approve โ†’ /bridge/change-request-decide (schemas) or
/bridge/role-request-decide (roles).

Step 2 โ€” Author the service (no bespoke code)

Open Service Studio and click ๏ผ‹ New Service. You fill in four cards โ€” no code, no solution to build:

Stuck? The ๐Ÿค– Service AI Expert on the right can draft the form and workflow from a description and offer โœจ Apply to editor. Behind the scenes your service is bound to the platform's generic, already-certified declarative-service solution โ€” the certified lifecycle-engine runs your workflow. (Only if config truly can't express your logic do you drop to Developer Studio and build a bespoke solution โ€” most services never do.)

Step 3 โ€” Publish it (steward-signed)

In Service Studio, click Publish. The network signs the service with your agency's steward key and lists it in the directory; you'll see โœ“ Published โ€” citizens in <jurisdiction> can now use it.

The governance wall is real: if a workflow step names a role that isn't governed, publish is refused โ€” workflow step 'triage' role 'โ€ฆ' is not a governed role (a live 422). That's the platform holding you to the shared vocabulary from Step 1.

Under the hood: Publish โ†’ POST /bridge/service-offering-save โ†’ the network service-offerings directory,
steward-signed. *(Publishing a component/solution instead uses Studio's own Publish / `โฌ† Publish as
Solution; a network steward clears it in Network Admin โ†’ ๐Ÿ“ค Publish Requests`.)*

Step 4 โ€” Install it into the agency (one approval, many grants)

A tenant admin opens the Marketplace, finds the fulfilling solution, and clicks Install (the button flips to Uninstall when done). One approval materializes everything the service needs: a steward-signed access grant per component (for exactly its declared reads/writes), the app shelf + roles, any subscriptions, and contributed records.

(The generic declarative-service is already installed platform-wide, so a no-code service like this needs no extra install; a bespoke solution installs exactly this way.)

Under the hood: Install โ†’ POST /bridge/install โ†’ /v1/solutions/install.

Step 5 โ€” The resident files it (Jan Seva)

The resident opens Jan Seva (๐Ÿ›๏ธ Citizen Services) โ€” a public front door. They:

Under the hood: /bridge/service-search โ†’ /bridge/service-consent โ†’ /bridge/service-route {action:"init"}
โ†’ returns { case, reference, routed_to: "role://nashik/civic.grievance-officer", status: "received" }.

Step 6 โ€” The officer resolves it (Tasks)

The task appears in the assigned officer's Tasks inbox (the platform-wide Inbox). The officer opens it and clicks Mark complete (or Approve/Reject on a decision step); the lifecycle-engine advances the workflow to the next role's inbox โ€” triage โ†’ the sanitation officer's field visit โ†’ back to verify & close. The UI confirms e.g. โœ“ Approved โ€” advanced to "resolve" ยท now with urban.sanitation-officer.

(On a service whose final step issues a credential โ€” like a birth certificate โ€” closing it mints a signed credential into the citizen's wallet; the Tasks toast reads โœ“ โ€ฆ credential issued to the applicant. See the Cross-Agency tutorial.)

Under the hood: /bridge/query (load tasks) โ†’ /bridge/complete or /bridge/decide.

Challenges revisited

Back to the five challenges โ€” here's exactly how the platform handled each:

Where this is reference-grade (honest limits)

Deep dives: Solutions & Services ยท
Interaction ยท Work: Inbox, Cases & Tasks ยท
Data Ownership & Consent.