Case study · Side projects · Angular 22.1

GeoAtlas: from a map application
to reusable workflows.

GeoAtlas is my own Angular map application for Poland. It brings parcel search, editable tables, documents, reports and printing into one workspace. A second application, Service Studio, now uses the same UI to compose forms and e-services. I own the architecture, integrations and acceptance of both projects, with scoped implementation supported by coding agents.

GeoAtlas start view: a map of Poland with the top toolbar and the tool panel open on the map content tab, listing the national layers.
The start screen on a desktop. Select a screenshot to inspect it at full size.
Problem
Build coherent data workflows and reuse their UI in another domain.
My contribution
Architecture, library APIs, domain workflows, integrations and verification.
Evidence
Working map screens and an editable geodetic service demo; private walkthrough on request.
2 applications
GeoAtlas and a separately buildable Service Studio demo
12 packages
shared UI workspace, including its development catalog
JSON → UI
editable definitions, conditional fields and live validation
PDF + files
searchable summaries, verified attachments and manifests

Application and library state reviewed on 2 October 2026. Studio demonstrates a local workflow; signing and delivery receipts are simulated.

01 / Context and goal

One map product.
A second use of its foundations.

The national geoportal's map application informed a tracked feature inventory. That inventory records implementations, deliberate differences and items placed out of scope. The application is an independent side project with a documented scope and its own interfaces.

The architectural goal is practical reuse: tables, forms, documents and commands should support another application without copying the map product. Service Studio puts that boundary to work in a different domain.

The map library has been in development since 2024. The GeoAtlas application started on 24 September 2026. The 2 October 2026 update adds native e-service authoring and a complete editable geodetic notification example. These are my own projects alongside professional work. GeoAtlas and Studio run privately; a walkthrough is available on request.

02 / Architecture

Two applications.
Shared behaviour, clear boundaries.

One Nx monorepo, with dependencies checked by lint. GeoAtlas owns map-product screens and Polish domain integrations. Studio owns service definitions, drafts, publishing and execution views. Both compose the same controls; a separate contracts and application layer holds the Studio workflow.

The shared UI libraries know nothing about GeoAtlas or its domain. Their workspace dependencies point to other libraries rather than the application. They separate pure state and rules from Angular views and expose design tokens for product styling. The map library holds the generic geodesy, geometry, file formats, drawing, printing and service clients, with a neutral English API and coded errors the application phrases in Polish.

Two applications over shared Angular libraries GeoAtlas and Service Studio both compose the shared UI. GeoAtlas uses the map library directly; shared record-map controls use it as needed. Service Studio owns a separate definition and workflow layer. MAP APPLICATIONGeoAtlasParcels, tables, reports, assistantE-SERVICE DEMOService StudioDefinitions, drafts, executioncomposesShared Angular UI + catalog12 packages · grids, forms, files,service builder, commandsMap libraryGeometry, drawing, formats, printingSTUDIO'S OWNWorkflowContractsRevisionsLocal repository
The applications share generic UI; Studio has its own definition and workflow layer. GeoAtlas's production build excludes Studio and the development catalog.
A /

Library first

Anything reusable outside GeoAtlas — geodesy, file formats, service clients, a grid behaviour — moves into a library before the application uses it. The application keeps only what is Polish or product-specific.

B /

One owner per behaviour

DOM behaviour belongs to Angular Aria and the CDK, grid data and state to TanStack Table, form state to Signal Forms. Each is wired in one place, so a fix lands once.

C /

A small own backend

Routing, isochrones and spatial data come from existing engines — GraphHopper, PostGIS with a feature server — that I integrate and maintain in one container behind a same-origin API. They provide the engines behind the application integrations.

03 / Added on 2 October 2026

Compose a service.
Try the whole workflow.

Service Studio is a separate Angular application for building forms and e-services from editable JSON definitions. It reuses the map application's form controls, layouts, document handling and design tokens. Definitions stay separate from the answers entered during a preview.

The complete example is a geodetic work notification, ZG-1: executor details, qualified personnel, work purposes, conditional sections, dates, map-based location, stages, attachments and acknowledgement. It is editable in the same builder used for new services.

Native form and service builders

Thirteen service block types, nested forms, undo, reordering, bounded JSON import/export and a live preview. Conditional sections and cross-field rules update as answers change.

Drafts and publication revisions

A local IndexedDB repository supports author and publisher demos, recovery, revision conflicts, immutable published snapshots and withdrawal. Uncertain publication replies are checked without creating duplicate writes.

Documents prepared from real bytes

PDF, PNG and JPEG attachments are validated, snapshotted and hashed. The execution view produces an HTML summary, a searchable PDF and a manifest. Editing an answer or attachment invalidates the prepared result.

This is a working local demo of authoring and execution. Signing and receipt steps are simulations; delivery to an office and external registry checks require backend integrations.

04 / Engineering practice

Decisions that keep
a large application coherent.

Zoneless Angular and Signal Forms

Angular 22.1 without Zone.js; forms are built on Signal Forms with shared layouts, validators and form definitions. Tests wait for rendered effects, not for time.

One command core, one assistant gate

The command palette, the assistant's tool loop and the agent API run through one typed command engine. An experimental assistant maps natural language onto the same command registry through a gated local model, with confirmation rules enforced by the application. The agentic UI article explains how it is built.

A tracked feature inventory

The reference inventory records implemented behaviour, deliberate differences and scope exclusions, with identifiers in specs and commits. Closing the inventory is a project milestone, not a certification of equivalence to the national service.

Accessibility and the phone

Touch targets of 44 px on coarse pointers are a library rule, not a per-screen fix. Phone layouts and a phone wizard sit beside the desktop workbench; axe checks recorded catalog and application states. Automated checks do not replace manual keyboard, screen-reader and task review.

Remote CI gates

In the 1 October setup, the fast gate could release main in about 4 minutes, before the full end-to-end result. The full gate took about 15 minutes; nightly checks exercised the served revision. The process page explains this release trade-off.

Coverage as a contract

The application enforces 80 % statements, 70 % branches, 75 % functions and 80 % lines; the last measurement (30 September 2026) was 92.05 %, 84.41 % and 94.68 % for statements, branches and lines.

05 / In use

Complete tasks,
on a desktop and a phone.

A parcel report window for parcel 756 in Stara Wieś, Mircze municipality, listing its registry facts over the map with the parcel outlined.
A parcel found by its precinct and number, outlined on the map, with a report built from several public sources.
A phone wizard titled Check parcel on step 2 of 4, Confirm parcel: the parcel outline, its identifier, location, the address it was found at (Marszałkowska 1, Kielce) and its area, with Back and This is the parcel buttons.
The phone wizard on its Confirm step: find, confirm, check, then save or share.
An attribute table of municipal boundaries with two rows selected, and the selected municipalities highlighted on a topographic map around Warsaw.
The attribute table: the shared data grid over map features, with filters, saved views and selection commands. This selection example uses WFS fixture data.
GeoAtlas on a phone: compact search bar, the scale and coordinate readout, a rail of map tools below it on the left and map controls on the right over a map of Poland.
The start screen on a phone.
The print editor with an A4 page preview of the map of Poland and print settings for paper size, orientation, margins and quality.
The print editor: a live page preview beside paper, margin, quality and template settings.
The assistant chat panel beside a topographic map of Poronin, showing completed tool cards with undo buttons, the place chosen in answer to its question, and suggested next tasks.
The experimental assistant runs the portal's commands with confirmation rules and undo for supported actions. Model replies in this capture are replayed from a recorded session.

06 / Outcomes

What the structure
made possible.

  • Two domain applications using the same UI: map workflows in GeoAtlas and form/service authoring in Studio.
  • Twelve UI workspace packages, including a 53-page catalog, the libraries free of product specifics, reused by the application screen by screen.
  • Verification across the layers: unit and browser tests, coverage gates, desktop and phone scenarios, visual baselines and accessibility checks.
  • A complete editable example: the geodetic notification connects form rules, map fields, attachments and document preparation.
  • A product others can take over: a decisions register and a live hand-off document, updated in the same commit as each unit of work.

07 / What next

The same layers,
new domains.

Studio now demonstrates reuse in a second domain. The next step is to connect that local workflow to real storage, authorization, registries and submission services, with integration tests for each boundary. Further product directions still need their own domain work.

  • Service Studio integrations for persistent backend storage, authentication and delivery.
  • A document-workflow domain on the same UI libraries, without a map.
  • A municipal geoportal as a second map product configured on the same foundations.

Building something of similar scope?

Tell me about the application, the integration or the stage you need help with.

contact@clearcraft.dev