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.
Case study · Side projects · Angular 22.1
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.

Application and library state reviewed on 2 October 2026. Studio demonstrates a local workflow; signing and delivery receipts are simulated.
01 / Context and goal
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
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.
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.
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.
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
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.
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.
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.
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
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.
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.
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.
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.
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.
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






06 / Outcomes
07 / What next
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.
Tell me about the application, the integration or the stage you need help with.
contact@clearcraft.dev