Skip to content
Gemenon Technologies

Selected work

Systems we have designed, built, and run.

A cross-section of recent engagements and in-house builds. Client details are anonymized and environment specifics are left out on purpose.

Security

Zero-trust access for self-hosted apps

Put a dozen internal tools behind single sign-on without opening an inbound port.

The challenge

A set of internal and self-hosted tools was only reachable on the local network, and the remote-access options were either a flat VPN or public exposure.

What we built

  • Identity-aware access in front of every application, with Google sign-in and a one-person allowlist policy
  • Outbound-only tunnels, so nothing listens on the public internet
  • Reverse proxy with automated certificate renewal and a least-privilege DNS token on a rotation schedule
  • Split-horizon DNS so devices resolve the same names at home and away, with an IPv6 leak found and fixed
  • Versioned scripts, runbooks, and a wiki so the setup can be replayed or handed over

Outcomes

  • About a dozen applications reachable from anywhere behind SSO and MFA
  • Sensitive admin consoles deliberately kept off the internet entirely
  • Every change scripted, backed up before it runs, and documented in the same commit
Cloudflare Zero TrustCloudflare TunnelCaddyTailscaleWireGuardDNSGoogle SSO

AI

Private AI platform with guarded agents

A local LLM stack and chat-driven agents where humans approve anything risky.

The challenge

Run capable AI models on owned hardware, keep data off third-party clouds, and let agents do real work without handing them the keys.

What we built

  • Local model serving with a private chat front end on a GPU workstation
  • A tool-using agent on its own unprivileged account with a command allowlist and human approval for everything else
  • Chat-ops bridges for Slack and Telegram, with owner-only access and a click-to-approve step before any push
  • A reproducible rebuild: every change recorded as a playbook or compose file after an earlier install was lost
  • Nightly backups that are verified, not assumed

Outcomes

  • Full rebuild from a clean OS reinstall driven by a repository, not memory
  • Chat bridge shipped with more than 1,700 automated tests
  • Agent permissions enforced by placement and policy rather than trust
NVIDIA DGXOllamaOpen WebUIClaude Agent SDKNode.jsTypeScriptSlackTelegramsystemd

DevOps

Self-hosted engineering platform and CI/CD

GitLab, shared pipelines, Jira integration, and docs that publish themselves.

The challenge

Dozens of repositories across personal, client, and lab work needed one consistent way to build, test, deploy, document, and back up.

What we built

  • Self-hosted GitLab with a group layout that separates each zone, plus shared CI templates every project includes
  • Runners on dedicated hardware, with deploys to Vercel from the pipeline using the CLI
  • Docs-as-code: runbooks and changelogs publish to each project wiki on merge
  • Jira Cloud connected for traceability, and a scheduled poller that turns tickets into merge requests
  • A product analytics backend for the platform, with a documented upgrade and migration procedure

Outcomes

  • One template change updates the pipeline of every project
  • Every repository has a remote, a changelog, and published docs
  • Documentation drift removed by making the repo the single source of truth
GitLabGitLab CIDockerVercelJiraClickHouseBashYAML

Web

Multilingual website with a headless CMS

A three-language site for an international technology park, with editors who never touch code.

The challenge

The client needed a modern, trilingual public site and a way for non-technical staff to publish, without tying content to a developer or to a git host.

What we built

  • Migration of a Lovable-built design into a maintainable codebase with English plus two additional languages
  • Payload CMS with role-based access for admins, editors, and read-only users, on a managed Postgres database
  • Build-time content pull with a daily rebuild that only runs when content changed
  • Staging and production environments on separate hosts, with search indexing blocked on staging
  • Machine-drafted translations clearly marked for native-speaker review

Outcomes

  • Live CMS and staging site, with a runbook and an explicit cutover plan
  • Editors log in with CMS accounts, not developer tools
  • Content changes publish without a developer in the loop
Payload CMSNext.jsReactPostgresVercelCloudflare DNSi18n

Application

Private bookkeeping web app

Turns platform payout exports into a tax-ready ledger for a small property portfolio.

The challenge

Monthly CSV exports from booking platforms were being reconciled by hand, with no per-property profit and loss view.

What we built

  • CSV import that creates ledger entries per booking and per property, with manual entries for off-platform income and expenses
  • Google sign-in restricted to an allowlist, deployed as a non-indexed app
  • Tax-ready reporting by month and by property
  • Versioned releases, a test suite, and CI type checks
  • Delivered through a build, independent review, and fresh verification gate before anything was published

Outcomes

  • Reconciliation moved from a manual spreadsheet to repeatable imports
  • Several tagged releases with changelog and review records
  • Access limited to named users, with previews protected
Next.jsReactTypeScriptPostgresNextAuthVitestVercel

Cloud

Legacy cloud audit and safe decommission

Found the spend, closed the access risks, and retired a dormant environment without losing anything.

The challenge

An old product left a cloud account running servers nobody used, with access keys from former contractors still active.

What we built

  • Read-only cost and resource audit mapping every charge to a workload
  • Cross-reference of what was still referenced by DNS, code, and email
  • Source and data archived to the repository before anything was turned off
  • Scripted, reviewed teardown run by the owner, with snapshots retained
  • Access cleanup plan covering stale keys and service users

Outcomes

  • Compute spend taken to zero, with recovery snapshots kept
  • Ten stale access keys identified for rotation or removal
  • A repeatable audit script reused for other accounts
AWSIAMEC2Route 53Cost ExplorerPythonBash

Automation

Touch-screen kiosk and smart-home control layer

Locked-down wall display with sensor-driven brightness, plus a containerized home automation stack.

The challenge

Turn a commercial touch panel into a reliable always-on dashboard, and move home automation off a vendor package that lagged upstream.

What we built

  • Windows kiosk with Shell Launcher, a passwordless locked profile, and idle-return behavior
  • Ambient-light-driven backlight curve and scheduled night mode, with a status endpoint
  • Home Assistant migrated to a pinned, versioned Docker Compose stack with a verified pre-move backup
  • Dashboards aggregating calendars, photos, and device state
  • Runbooks capturing the lockout lessons so the next change is safer

Outcomes

  • Stable always-on kiosk managed over SSH and PowerShell
  • Updates become a one-line version bump with a rollback path
  • No unpinned images and no auto-updaters
Windows 11PowerShellHome AssistantDocker ComposeGlancenginxSSH

Software

macOS maintenance app with a desktop widget

One-click support tools in a native app and a WidgetKit widget, built without Xcode projects.

The challenge

Routine fixes such as flushing DNS needed admin rights and a terminal, which is a poor fit for help-desk staff.

What we built

  • Native AppKit app with one button per maintenance command
  • WidgetKit extension using App Intents so tools run straight from the desktop
  • Command-line build and signing pipeline, including the certificate chain and linker details the widget needs to load
  • Outcome feedback on each tile after a run

Outcomes

  • Working widget on a free developer identity
  • Documented path to Developer ID signing and notarization for wider distribution
SwiftAppKitWidgetKitApp Intentscodesignswiftc

How we work

The same standards on every project

Documented by default

Every project ships with a runbook, a changelog, and a repository remote. Handover is a link, not a meeting.

Read-only first

Audits and assessments come before changes. Nothing is deleted or replaced without approval and a backup.

Reviewed before it ships

Public-facing work goes through build, independent review, fixes, and a fresh verification pass before release.

Secrets stay secret

Credentials live in a secrets store, never in repositories or chat. Tokens are scoped to least privilege and rotated.