Concept This is a design demonstration, not an official city portal. Read about this project.

0° LONGITUDE · TEMA HARBOUR CITY

City services, on the Meridian

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.

0°00′03″ — MERIDIAN

Concept — citywide alert system

Know before you go

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.

  • Scheduled · Information

    Community 4 water tankering moved to Wednesday

    Low reservoir pressure brings this week's tankering forward from Thursday to Wednesday, 6:00–14:00. Free public standpipes stay open throughout.

  • Advisory · Warning

    Berth congestion at Tema Port through the weekend

    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.

  • Urgent · Critical

    Flash flood warning — Chemu Lagoon catchment

    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

Popular services

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.

  • Pay property rates & levies

    Rates, business operating levies, and market tolls — reconciled the same day, receipted by SMS.

    Fees & channels
    Concept UI — indicative figures
    Property rate
    1.2% of rateable value
    Business levy
    GH₵150–600 / year
    Channels
    MoMo, card, USSD *170#
  • Permits & licences

    Building, signage, and trading permits with fees published up front and a tracking number on submission.

    Fees & turnaround
    Concept UI — indicative figures
    Building permit
    45 working days
    Trading licence
    5 working days
    Signage permit
    GH₵60 / month
  • Report a problem

    Potholes, blocked drains, streetlight outages — drop a pin, add a photo, get a tracking code.

    Response targets
    Concept UI — indicative figures
    Blocked drain
    48 hours
    Streetlight
    5 working days
    Pothole
    10 working days
  • Waste & sanitation

    Check your zone's collection day and report a missed pickup within 48 hours.

    Zone schedule
    Concept UI — indicative figures
    Zones A–C
    Mon · Wed · Fri
    Zones D–F
    Tue · Thu · Sat
    Bulk waste booking
    GH₵80 / pickup
  • Water billing & leaks

    View your metered bill, report a leak, or request emergency tankering during supply interruptions.

    Billing & response
    Concept UI — indicative figures
    Billing cycle
    Monthly
    Mains leak response
    Within 24 hours
    Service-line response
    Within 72 hours
  • Transit & port advisories

    Motorway spur conditions, port truck-queueing windows, and local transport updates in one feed.

    Advisories & curfews
    Concept UI — indicative figures
    Heavy-vehicle curfew
    06:00–09:00 & 16:00–19:00
    Live advisories
    Mirrored to alerts above

Three steps, one tracking code

Report a problem

From pin to repair crew — designed to work on any phone, in low signal, with the fewest possible taps.

Drop a pin
Concept UI — demonstration only

Community 6, near the market

Tap the map at the issue location, or use your current position.

Describe it
Concept UI — demonstration only

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.

Track it
Concept UI — demonstration only

Report received — medaase.

TDS-2607-08841

Drainage 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

Zones at a glance

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.

Concept illustration only. Real zone boundaries, community numbers, and collection schedules are published by the Tema Metropolitan Assembly.
  • Port & harbour
  • Industrial area
  • Central business district
  • Residential — Communities 1–8
  • Residential — Communities 9–18
  • Residential — Communities 19–25
  • Free zone & export enclave
  • Sea & harbour water
Waste collection by zone tier Illustrative schedule for this concept — matches the Waste service tile above.
Zone tierCollection days
Port & industrialDaily, commercial contract
Communities 1–8Mon · Wed · Fri
Communities 9–18Tue · Thu · Sat
Communities 19–25Mon · Thu

What's happening

Notices

  • 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.

  • New water tankering points added for Communities 3 & 4

    Two additional standpipes are live while mains pressure recovers. Locations and hours are listed in the Water tile above.

  • Tema Port truck marshalling yard reopens after upgrade

    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

Contact the digital services desk

We only use this to reply to you.

What is this about?

Include your community number if you're reporting an issue.

Visit or call

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.

Client service desk
Tema Metropolitan Assembly, Community 1, near the Meridian Roundabout
Opening hours
Monday to Friday, 8:00–16:30
Revenue office also open Saturday, 9:00–13:00
Service line
+233 (0)30 320 1100 — concept number, for demonstration

Design case study

Process — how this concept was designed

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.

The brief

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.

The problem

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.

Direction chosen — and what was rejected

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.

Key decisions & trade-offs

  • The Meridian as the hook, not a gimmick. Tema's near-exact position on 0° longitude is a real, checkable fact, so it earns the headline and a labelled marker through the hero art — rather than an invented slogan.
  • Alerts as a demo, not decoration. The three-severity system is genuinely interactive — dismiss, restore, and the empty state are all built — because a "concept" alert banner that can't be dismissed teaches the wrong lesson about what the interaction should feel like.
  • Honest mocks everywhere. The report flow and every fee inside the service tiles carry a "Concept UI — demonstration/indicative" tag. Fake buttons are non-focusable text so keyboard and screen-reader users are never lured into a dead control.
  • One page, full route contract. A live Assembly site needs deep routes; a concept needs one walkable argument. Anchored sections plus tiny /guide and /process redirect stubs keep every route in the collection's contract live.

Intended impact — framed as design goals

  • A resident glancing at the alerts panel knows within three seconds whether anything today needs their attention.
  • A dockworker reporting a hazard on a low-end phone completes the three-step flow in under a minute, even on 3G.
  • Nobody overpays a permit fee because the schedule is one tap away, before any form is opened.
  • "Which zone am I in?" becomes a five-second lookup instead of a call to the Assembly.

Teaching artifact

Guide — how this site was built

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.

The type system

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.

Signature: the isometric build, drawn with real geometry

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:

top = (cx, cy) // top vertex of the diamond right = (cx + a, cy + a/2) bottom = (cx, cy + a) left = (cx - a, cy + a/2) // side faces extrude "bottom" and its neighbours down by 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.

Contrast audit — computed, not eyeballed

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.

Contrast audit — computed ratios WCAG 2.x relative luminance. AA requires 4.5:1 for body text, 3.0:1 for large text (≥ 24 px, or ≥ 18.7 px bold) and non-text UI.
PairUsed forRatioResult
ink on whiteBody text14.02AAA — pass
ink on steelBody text on panels11.18AAA — pass
muted on whiteSecondary text7.29AAA — pass
muted on steelSecondary text on panels5.82AA — pass
harbour on whiteLinks, headings accent7.37AAA — pass
white on harbour-deepHeader, footer, dark section14.47AAA — pass
red-deep on whiteCritical alert text, tags5.76AA — pass
yellow-deep on whiteWarning alert text5.38AA — pass
info-deep on info-bgInfo alert text7.58AAA — pass
ink on crane yellowStep badges, focus fill (large/UI only)7.71AAA (large/UI) — pass
container red on whiteDecorative, icons, large type only4.27Large/UI ≥ 3.0 — pass; not for small text

The focus system

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.

Code-drawn assets

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.

Iteration log

  • Pass 1 — critique

    • The harbour water inlet was nearly invisible on the first render — its diamond was sized and placed so most of it fell outside the land shape's clip path. Rescaled and repositioned it so the bay reads clearly beside the container yard, then re-screenshotted to confirm.
    • The report mock's map pin rendered as a giant red blob covering a third of the mini-map. Cause: .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.
    • The contact form's topic radio buttons rendered as a scattered column — inputs pinned far left, labels adrift on the right. Cause: .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.
  • Pass 2 — elevation

    • Rebuilt the crane from a rough two-strut sketch into a proper A-frame gantry silhouette with a trolley mid-lift on a container spreader — the screenshot moment of the hero.
    • Made the alert demo genuinely interactive (dismiss, empty state, restore) instead of a static three-card display, so the "signature interaction" claim in the brief is actually demonstrated, not just described — verified end-to-end with a scripted click-through of all three dismiss buttons and the restore action.
    • Added hover states across service tiles, notices, and category chips (lift, border-colour, cursor) gated behind @media (hover:hover) and (pointer:fine) so touch devices never get a stuck hover state.
  • Pass 3 — ship

    • Measured 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.
    • Recomputed every colour pair against the final stylesheet; caught container red at 4.27:1 on white and restricted it to large/decorative use, introducing --red-deep for small critical text.
    • Full keyboard walk: skip link → nav → hero CTAs → alert dismiss/restore → tile <details> → report chip buttons → map table region → form → footer, in document order, with the dual-ring focus visible at every stop.
    • Reduced-motion verified with forced prefers-reduced-motion: the isometric build-in and alert-dismiss transitions collapse to the finished state instantly; scroll behaviour goes instant too.
    • Zero console errors at 390 / 834 / 1440 px on every route (/, /guide/, /process/); fonts confirmed loading from /assets/fonts with no external requests anywhere in the network panel.

Deploy

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.