# Automation & CI/CD

> Selected Engineer ApS work demonstrating Automation & CI/CD — the achievements that prove it.

- [Resolved 1,000 issues in geographical data and time‑series data, using GDAL, ArcGIS, PostGIS, Mapbox, QGIS, SQL (PL/pgSQL, Transact‑SQL), Bash, ensuring high‑quality big data processing.](https://software.engineer.company/portfolio/resolved-1-000-issues-in-geographical-data-and-7/)
- [Designed, implemented, and administered 6 ETL/ELT pipelines, utilizing Google BigQuery, MSSQL, PostgreSQL, Shell scripting, PL/pgSQL, and Transact‑SQL, integrating data for efficient Python API processing.](https://software.engineer.company/portfolio/designed-implemented-and-administered-6-etl-elt-pipelines-8/)
- [Automated GIS SaaS application deployment, data processing, and reporting system using GitHub Actions CI/CD, Python, Bash, and SQL.](https://software.engineer.company/portfolio/automated-gis-saas-application-deployment-data-processing-and-16/)
- [Automated delivery of 20 GIS data pipelines and app data ETL processes, streamlining infrastructure automation and reporting.](https://software.engineer.company/portfolio/automated-delivery-of-20-gis-data-pipelines-and-17/)
- [Overhauled internal processes, saving 8,000 hours by improving software architecture, systems, and scheduling efficiency.](https://software.engineer.company/portfolio/overhauled-internal-processes-saving-8-000-hours-by-38/)
- [Developed a Data Analytics reporting system, increasing quarterly software revenue by 400% through Python‑based PDF reports.](https://software.engineer.company/portfolio/developed-a-data-analytics-reporting-system-increasing-quarterly-44/)
- [Generated the API contract outward from the database — OpenAPI, a 44,076‑line typed TypeScript client, 61 mock handlers and the limits the UI enforces — with a guard at every hop that fails on drift.](https://software.engineer.company/portfolio/built-a-request-schema-validation-contract-with-automated-61/)
- [Built the Python vessel‑data scrapers (MarineTraffic, Maritime‑Database) and a repeatable import that seeds the platform's reference data — 184,197 rows, including 698 companies and 56,149 vessels.](https://software.engineer.company/portfolio/built-a-python-vessel-data-scraper-marinetraffic-maritime-66/)
- [Established an English/Danish internationalization system carrying 12,027 messages per locale across 458 namespace files, with linter‑enforced vocabulary and a 400‑line budget per file.](https://software.engineer.company/portfolio/established-an-english-danish-internationalization-system-with-linter-78/)
- [Built a layered automated test suite — 981 Go tests, 543 frontend and browser specs, 494 SQL behavioural tests — with mutation testing, property‑based tests and an accessibility gate.](https://software.engineer.company/portfolio/built-a-layered-automated-test-suite-across-four-layers-94/)
- [Moved slow work off the request path onto a River job queue — 15 worker modules, 8 scheduled tasks and 20 pg_cron jobs — so a request returns while the work behind it carries on.](https://software.engineer.company/portfolio/moved-slow-work-onto-a-river-job-queue-97/)
- [Deployed the company's own git forge on Soft Serve, private by default with no web panel and its SSH port bound to loopback behind a jump host, and made the landing page in front of it a build artefact of the main site rather than a hand‑kept copy.](https://software.engineer.company/portfolio/deployed-the-companys-own-git-forge-121/)
- [Cut the site's browser‑driven quality gate from 1,636 seconds to 615 by scheduling its checks longest‑first through a worker pool bounded to four lanes, after measuring that alphabetical order cost 320 seconds against 224.](https://software.engineer.company/portfolio/cut-the-visual-quality-gate-to-ten-minutes-128/)
- [Replaced 27 rendered font sizes whose nearest neighbours were 0.6% apart with a six‑step Major Third scale, and wrote the linter that fails the twenty‑eighth.](https://software.engineer.company/portfolio/replaced-27-font-sizes-with-a-six-step-scale-129/)
- [Found and fixed 11 accessibility defects the browser reported as healthy — eight footer links still in tab order behind pointer‑events, a scroll timeline clipping the colophon off three pages, and a rule engine running 70 of its 105 rules.](https://software.engineer.company/portfolio/fixed-11-accessibility-defects-the-browser-called-healthy-131/)
- [Closed the colour system at 28 documented colours with a linter that fails a value painted but undocumented, documented but unpainted, mis‑measured, respelled as a literal, or within a perceptual distance of 0.02 of one already there.](https://software.engineer.company/portfolio/closed-the-colour-system-at-28-colours-133/)
- [Found that the light theme had been missing a full‑page overlay layer since the day it was written, by asserting that both themes paint every layered surface with the same number of layers.](https://software.engineer.company/portfolio/found-the-light-theme-missing-an-overlay-layer-134/)
- [Mirrored the entire site as 777 Gemini documents and 777 Gopher documents off the same deployed tree, at zero bytes of change to the HTML.](https://software.engineer.company/portfolio/mirrored-the-site-to-gemini-and-gopher-137/)
- [Replaced 963 anonymous structured‑data blocks that restated the company 1,671 times with one linked graph of 16 types minted from stable origin identifiers.](https://software.engineer.company/portfolio/replaced-963-structured-data-blocks-with-one-graph-138/)
- [Cut the stylesheet bundle from 87 KB to 31 KB by taking a base64 font out of it, and dropped 756 KB across 22 files that were published on every deploy and referenced by nothing.](https://software.engineer.company/portfolio/cut-the-stylesheet-bundle-from-87kb-to-31kb-139/)
- [Fixed a sitemap where 172 of 176 URLs shared one modification timestamp, by taking the date from git history after establishing that the export rewrites every file on every run.](https://software.engineer.company/portfolio/fixed-a-sitemap-with-one-shared-timestamp-140/)
- [Brought 10,242 lines of quality‑gate JavaScript under a formatter and a linter after establishing it was the largest body of code in the repository and the only one nothing read, fixing 13 findings and suppressing none.](https://software.engineer.company/portfolio/brought-the-quality-gate-code-under-a-linter-143/)
- [Built a database‑driven CV, references, portfolio and cover‑letter generator in Python — 41 modules, 10,580 lines — rendering six output formats from one 23‑table SQLite source assembled by a 19‑step idempotent pipeline.](https://software.engineer.company/portfolio/built-a-database-driven-cv-and-portfolio-generator-144/)
- [Held the generator to 981 test cases at a 92% branch‑coverage floor with warnings treated as failures, and asserted idempotence by running the whole build pipeline twice from an empty file and requiring the second pass to change nothing.](https://software.engineer.company/portfolio/held-the-generator-to-964-tests-and-a-coverage-floor-145/)
- [Established PDF/UA‑1 conformance across nine documents at 106 of 106 rules, and found the archival variant failing one rule of 146 — a near‑miss that reads as a pass to anyone not running the validator.](https://software.engineer.company/portfolio/established-pdf-ua-1-conformance-across-nine-documents-146/)
- [Selected every rule the Python linter has as an error, working through 1,815 findings to reach zero, with each of the few exemptions carrying a written reason and two of them backed by a checker instead of a comment.](https://software.engineer.company/portfolio/enabled-every-python-linter-rule-as-an-error-147/)
- [Built a cross‑language content check that fails when a translation drops a figure the English states, and when a language uses notation it does not use — finding two Danish descriptions missing a metric and sixteen Ukrainian spans quoting in the English style.](https://software.engineer.company/portfolio/built-a-cross-language-figure-and-notation-check-153/)
- [Wrote a parser that reads the real 7,308‑line C header and verifies every call site, every enum constant and that every pointer‑owning class is final, after a hand‑written placeholder header let calls to three removed functions compile, link and crash.](https://software.engineer.company/portfolio/wrote-a-parser-that-verifies-every-ffi-call-site-157/)
- [Named every icon‑only control in the interface for screen readers after finding the send button announced as "arrow up circle, button", and wrote the linter that requires the label within eight lines of the icon.](https://software.engineer.company/portfolio/named-all-seventeen-interface-icons-for-screen-readers-159/)
- [Built a 48‑token design system on the platform's own glass material and wrote the linter that rejects a magic number, a hardcoded font size, or an animation that ignores the reduce‑motion preference.](https://software.engineer.company/portfolio/built-a-48-token-design-system-160/)
- [Reached the half of the messaging core the application had never used — backup transfer, disappearing messages, message editing and resending, verified invitations, proxies and encryption policy — driving every test against the real library with no mocks.](https://software.engineer.company/portfolio/reached-the-unused-half-of-the-messaging-core-161/)
- [Built the company's icon and favicon sets from two hand‑made drawings, with every derived asset regenerated by script and a check that fails when a derived file was committed before its source.](https://software.engineer.company/portfolio/built-the-visual-identity-from-two-drawings-164/)

<https://software.engineer.company/categories/automation/>
