Community 6 market road resurfacing begins 14 July
Night works, 20:00–5:00, expected to run ten days. One lane stays open with flag control; the Waste tile's Zone B pickup moves to the service road for the duration.
0° LONGITUDE · TEMA HARBOUR CITY
Tema is Ghana's planned port city — built from the shoreline up, and sitting close enough to zero degrees longitude that the Greenwich line effectively runs straight through it. This concept gives that city a digital front door: pay, apply, report, and track, without a trip to the counter.
Geography, not branding: Tema's harbour sits at roughly 0°00′03″ W — a few metres from the Prime Meridian that fixes the world's timekeeping. The dashed line through the scene marks it.
Concept — citywide alert system
A citywide banner — for tides, tankering, port congestion, or public notice — should never bury the one thing a resident needs today. This demo shows all three severities at once. Dismiss one to see how the system quiets down as issues resolve.
Low reservoir pressure brings this week's tankering forward from Thursday to Wednesday, 6:00–14:00. Free public standpipes stay open throughout.
Two vessels delayed offloading are backing up truck queues on the Motorway spur. Hauliers should expect 40–60 minute delays and use the Community 2 holding bay.
Heavy rain upstream may raise the Chemu Lagoon quickly this evening. Residents of low-lying Communities 1 and 3 should move vehicles and valuables to higher ground now.
Severities share one visual language across every city system: blue for information, amber for advisories, red for anything time-critical. This is a static interaction demo — a live system would sync to real sensor and port data.
Six services, one front door
Every tile states what it costs and how long it takes before you click anything. Open a tile for the fee schedule; fees below are illustrative for this concept.
Rates, business operating levies, and market tolls — reconciled the same day, receipted by SMS.
Building, signage, and trading permits with fees published up front and a tracking number on submission.
Potholes, blocked drains, streetlight outages — drop a pin, add a photo, get a tracking code.
Check your zone's collection day and report a missed pickup within 48 hours.
View your metered bill, report a leak, or request emergency tankering during supply interruptions.
Motorway spur conditions, port truck-queueing windows, and local transport updates in one feed.
Three steps, one tracking code
From pin to repair crew — designed to work on any phone, in low signal, with the fewest possible taps.
Community 6, near the market
Tap the map at the issue location, or use your current position.
What's the issue?
A drain is overflowing onto the pavement outside Community 6 market — worse at high tide.
Add a photo (optional) — helps the crew arrive prepared.
Report received — medaase.
TDS-2607-08841Drainage issues are triaged within 48 hours. You'll get an SMS the moment a crew is assigned.
This is a static design demonstration — the live flow would connect to the works-order system. Prefer to call it in? The service line is listed under Contact below.
Illustrative concept map — not to scale
Every service above resolves to one of Tema's zones. This static map shows the shape of that system: harbour and industry along the coast, the Motorway spur cutting north-east, and residential communities fanning inland.
| Zone tier | Collection days |
|---|---|
| Port & industrial | Daily, commercial contract |
| Communities 1–8 | Mon · Wed · Fri |
| Communities 9–18 | Tue · Thu · Sat |
| Communities 19–25 | Mon · Thu |
What's happening
Night works, 20:00–5:00, expected to run ten days. One lane stays open with flag control; the Waste tile's Zone B pickup moves to the service road for the duration.
Two additional standpipes are live while mains pressure recovers. Locations and hours are listed in the Water tile above.
The Community 2 holding bay returns to full capacity, easing the queueing pattern behind this week's berth congestion advisory.
We answer within two working days
The client service desk will reply within two working days. Urgent reports raised through Report a problem above are triaged the same day.
The client service desk sits at the Assembly's Community 1 office, a short walk from the Meridian Roundabout. An officer is on duty for waste, water, and rates queries — no appointment needed.
Design case study
Concept project — adapted from a public RFQ. Frontend only; the alert system, report-a-problem flow, and zone map shown are static UI demonstrations. This site is a fictional presentation and is not affiliated with the Tema Metropolitan Assembly or any real organization. Names, fees, schedules, and contact details are plausible inventions.
Public RFQs for Ghanaian port-city websites converge on the same four asks: a citywide alert system that doesn't cry wolf, a reporting flow residents will actually finish on a slow connection, transparent fees for permits and rates, and a map that makes "which zone am I in?" a one-glance answer. This concept answers that brief for Tema — Ghana's principal seaport, a planned industrial new town built from 1952, and a city that happens to sit a few metres from zero degrees longitude.
Port cities generate more operational noise than most municipalities — tidal advisories, berth congestion, tankering schedules, motorway curfews — and most council sites either drown residents in all of it or bury the one urgent item under routine notices. The real design problem wasn't "build a portal"; it was build a hierarchy of urgency that a resident can scan in three seconds, and a reporting flow that survives patchy signal at the port's edge.
The chosen direction is isometric civic infrastructure: a single, honestly-labelled isometric scene standing in for the whole city — harbour, cranes, containers, streets — that builds in once on load rather than looping forever, paired with a three-severity alert language reused everywhere (services, notices, the map legend) so residents learn it once.
Two directions were rejected. A literal satellite-map hero was rejected — real GIS tiles would misrepresent a concept site as an official one, and static map images aren't code-drawn. A looping "smart port" animation (cranes forever swinging, ships forever docking) was rejected because constant motion competes with the one job the hero has: state the service, not perform a city simulation — hence the build-in plays once, then holds still.
/guide and /process redirect stubs keep every route in the collection's contract live.Teaching artifact
Part of a 26-site collection designed and built by Hannah Kwakye, engineered with Fable 5. Every visual in the collection is code-drawn — no stock photos, no raster images — which on this site meant an entire isometric harbour city, a zone map, and a set of service icons, all authored as inline SVG path data. Static hand-authored HTML, CSS, and vanilla JS; two self-hosted variable font files; deployed on Netlify from a Git push.
Figtree (400–700 variable, ~20 KB woff2) carries every headline and body line — a geometric-humanist sans with enough warmth for a civic voice and enough structure for dense service tiles. JetBrains Mono (400–700 variable, ~31 KB woff2) is reserved for anything that reads as a system output: alert severity labels, the meridian coordinate chip, service codes, tracking numbers, table figures. That split does real work — the moment a tracking number like TDS-2607-08841 switches typeface, it reads as data the system generated, not copy a designer wrote.
The hero scene is plotted on a 2:1 dimetric grid — the same projection used in classic isometric game art. Every block is four points: a diamond top face of half-width a, and two side faces extruded down by height h:
A small Node script generated every path in the scene — land plane, harbour inlet, two avenues, four buildings with window grids, eight stacked containers, and the crane — from that one formula, so proportions stay consistent across a hand-authored composition rather than eyeballed per shape. The build-in is pure CSS: each layer group carries an --i index and one @keyframes animation staggered by calc(var(--i) * 130ms), so the scene assembles ground → roads → buildings → containers → crane → the meridian marker, once, on load. prefers-reduced-motion: reduce simply disables the animation and shows the finished frame — no separate "reduced" artwork to maintain, no JavaScript driving it at all.
The meridian itself is a dashed line plus a pin and a monospace coordinate chip, positioned at the seam between the city blocks and the container yard — geography chosen the composition, not the other way round.
Every text/background pair below was computed with the WCAG relative-luminance formula before it reached the stylesheet, targeting AA (4.5:1 body, 3:1 large text/UI) with several pairs clearing AAA. Container red #D64B33 reaches only 4.27:1 on white — enough for large text and UI, not for small body copy — so a darker #B8391F carries small critical text instead, and the brief's red stays reserved for backgrounds, icons, and headline-scale type.
| Pair | Used for | Ratio | Result |
|---|---|---|---|
| ink on white | Body text | 14.02 | AAA — pass |
| ink on steel | Body text on panels | 11.18 | AAA — pass |
| muted on white | Secondary text | 7.29 | AAA — pass |
| muted on steel | Secondary text on panels | 5.82 | AA — pass |
| harbour on white | Links, headings accent | 7.37 | AAA — pass |
| white on harbour-deep | Header, footer, dark section | 14.47 | AAA — pass |
| red-deep on white | Critical alert text, tags | 5.76 | AA — pass |
| yellow-deep on white | Warning alert text | 5.38 | AA — pass |
| info-deep on info-bg | Info alert text | 7.58 | AAA — pass |
| ink on crane yellow | Step badges, focus fill (large/UI only) | 7.71 | AAA (large/UI) — pass |
| container red on white | Decorative, icons, large type only | 4.27 | Large/UI ≥ 3.0 — pass; not for small text |
Every interactive element gets a two-layer ring: a 3 px crane-yellow outline with a dark navy drop-shadow halo behind it, so at least one ring reaches 3:1 contrast against any background in the page — white cards, steel panels, or the harbour-deep dark sections. Focus order follows the document; the fake buttons inside the report-a-problem mock are non-focusable <p> text for exactly the same reason as the sibling civic sites in this collection — a mock control that can be focused but does nothing is worse than no control at all.
Nothing in this page is a raster image. The isometric city, the zone map, the six service-tile icons, the report flow's mini street map and pin, and the brand mark are all inline SVG generated from the same small set of geometry helpers, hand-tuned afterward for colour and composition. The zone map is a deliberately simplified 11×8 grid of rounded parcels, hand-assigned to zone codes (port, industrial, CBD, three residential tiers, free zone) rather than traced from a real survey — honest about being illustrative, as the map's own caption states.
.pin-map svg { width:100%; height:100% } was a descendant selector, so it also matched the pin's own <svg class="pin-drop"> a few levels down and outweighed its specificity. Fixed by scoping the rule to .pin-map svg.map-base and giving the pin explicit width/height..field input { width: 100% } was written for text fields but also matched the radio inputs sitting inside fieldset.field, stretching each one to fill its flex row. Fixed with :not([type="radio"]):not([type="checkbox"]) on that selector and gave fieldset.field its own border reset.@media (hover:hover) and (pointer:fine) so touch devices never get a stuck hover state.document.documentElement.scrollWidth against the viewport at 390 px and found 112 px of horizontal overflow. Cause: the zone-map layout's mobile override collapsed to a bare 1fr column, and CSS Grid's default min-width: auto let the zone table's 480 px min-width bleed through and force the whole grid wider. Every collapsed-to-one-column media query in the sheet now uses minmax(0, 1fr) instead of 1fr, closing the same class of bug everywhere it could recur.--red-deep for small critical text.<details> → report chip buttons → map table region → form → footer, in document order, with the dual-ring focus visible at every stop.prefers-reduced-motion: the isometric build-in and alert-dismiss transitions collapse to the finished state instantly; scroll behaviour goes instant too./, /guide/, /process/); fonts confirmed loading from /assets/fonts with no external requests anywhere in the network panel.Netlify, straight from the repository: publish = ".", immutable cache headers on /assets/*, and Netlify Forms handling the contact form with a honeypot field. The /guide and /process routes exist as tiny redirect stubs pointing at these anchored sections, so the collection's route contract holds.