Вибрані роботи

Кейси

Кожен кейс ґрунтується на реальному репозиторії. Приватні проєкти описані без деталей клієнта; код доступний на запит.

2026Architect and sole developerПриватний репозиторій

AI course generator for an e-learning platform

A learning platform that generates complete, coherent courses from source documents with Gemini, aimed at Norwegian municipalities and businesses. Private repository, details on request.

Course generation is a long chain of LLM calls that must survive restarts, stay within budget and read as one narrative rather than glued-together modules. Municipal tenders add SSO, accessibility and verifiable certificates.

Python 3.12FastAPITemporalPostgreSQL 16 + pgvectorGemini (google-genai)Next.js 16 + React 19MinIODocker Compose

Підхід

  • Generation runs as a Temporal workflow (harvest, blueprint, compose, quality gate, localize, media, publish) with durable checkpoints in PostgreSQL.
  • 16 orchestrator agents (Architect, Composer, Critic, NarrativeKeeper, Localizer) and 13 block-type generators, each with a documented contract.
  • All Gemini model strings live in one tier enum; three deprecations in one cycle meant editing one file.
  • Large payloads moved to MinIO after hitting Temporal's 2 MB blob limit.
  • Multi-tenancy via PostgreSQL row-level security; Entra ID SSO per school.

Що є сьогодні

  • 70 architecture decision records and a living project manifest as single source of truth.
  • 62 Alembic migrations, 195 test modules; CI runs gitleaks, ruff, mypy and pytest against real PostgreSQL.
  • Dev environment deployed by GitHub Actions on every merged pull request.
  • PDF completion certificates with QR verification.
2026Architect and sole developerПриватний репозиторій

Personal site with an AI twin, RAG and GDPR controls

This site: a portfolio with a chat assistant that answers questions about my background from a curated knowledge base, built to production standards. Private repository, details on request.

A public chatbot about a real person must stay on topic, resist prompt injection, cite only vetted material and handle visitor data under GDPR.

Astro 5 + React 19FastAPISQLAlchemy 2 (async) + AlembicPostgreSQL 16 + pgvectorGemini (google-genai)Celery + RedisOpenTelemetryDocker Compose

Підхід

  • Each message passes an injection guard (regex plus a Flash classifier that fails closed), an intent classifier and hybrid retrieval (pgvector HNSW plus BM25) before the main model streams a reply.
  • Knowledge base fed from uploaded documents and selected GitHub repositories: secret-scanned, chunked, embedded and re-synced nightly.
  • CV stored as per-language sections in PostgreSQL, importable from a LinkedIn export, feeding the CV page, PDF export and the twin's facts.
  • Daily retention job (30 days for chat); export, delete and rectify endpoints bound to a hashed visitor token; no tracking cookies.
  • Gemini only, via google-genai, model IDs in one config file.

Що є сьогодні

  • Runs on one host with Docker Compose; deploys only via GitHub Actions.
  • Four UI languages: English, Norwegian Bokmål, Russian, Ukrainian.
  • OpenTelemetry traces, Prometheus metrics and Grafana dashboards.
2026Architect and sole developerПриватний репозиторій

Telegram channel and community management dashboard

A multi-tenant dashboard for running a Telegram channel and its discussion group: message sync, publishing, anti-spam, news curation and Gemini-powered analytics. Private repository, details on request.

Moderating an active community by hand does not scale: spam arrives obfuscated, relevant news must be found daily, and nobody can read thousands of messages to see what people discuss.

Python 3.12FastAPIpython-telegram-bot + TelethonPostgreSQL 16 + pgvector (asyncpg)Gemini (google-genai)React + TypeScriptDocker Compose

Підхід

  • Two Telegram paths: a webhook bot for live events and replies, and Telethon (MTProto) for incremental history sync with deletion detection.
  • Anti-spam engine normalises Unicode and leetspeak, matches phrases, computes trust levels and executes actions through a strategy registry.
  • Messages embedded with gemini-embedding-2 into pgvector; topic analysis and news relevance use structured outputs typed with Pydantic.
  • RSS sources fetched on a schedule, scored for relevance by Gemini and prepared for publishing.
  • Tenant context injected per request so several channels share one deployment.

Що є сьогодні

  • 17 route modules, 16 React pages plus server-rendered templates.
  • Deployed with Docker Compose; all ports bound to loopback behind nginx.
  • Schema hand-managed in code without a migration tool, a trade-off I did not repeat later.
2026Architect and sole developerПриватний репозиторій

Self-hosted web scraping and AI analysis platform

A platform that discovers URLs, scrapes and cleans pages, analyses them with Gemini and exports structured data, with a React dashboard on top. Private repository, details on request.

Scraping at scale needs polite rate limiting, proxy rotation, captcha detection and retries, and raw HTML is useless until cleaned, structured and summarised. Each stage fails differently.

Python 3.12FastAPICelery + RedisPostgreSQL 16MinIOGemini (google-genai)React 18 + Vite + Tailwind 4Traefik

Підхід

  • Stages (discover, scrape, parse, analyse, export) run as Celery tasks on dedicated queues with Redis as broker and MinIO for storage.
  • Discovery via sitemaps with robots.txt support, crawling or URL lists; URL grouping labelled by Gemini.
  • httpx fetcher with autothrottle, backoff and health-checked proxy pools; Playwright for JavaScript-rendered pages.
  • Gemini structured outputs produce summaries, entities, sentiment and quality scores, and infer extraction templates from page structure.
  • Every LLM call logged with token and cost statistics; runtime settings editable from the UI.

Що є сьогодні

  • 12 Alembic migrations; unit and integration tests with a mock server for captcha and rate-limit behaviour.
  • Exports to JSON, CSV, Markdown and PDF (WeasyPrint).
  • Runs on one host with Docker Compose behind Traefik, with Flower for queue monitoring.
2026Lead developerПриватний репозиторій

Self-hosted CRM for a Norwegian consulting business

A CRM combining client management, booking, messaging, video calls, course sales and document collaboration, fully self-hosted on one server. Private repository, details on request.

The client wanted client data on Norwegian-controlled infrastructure, no mandatory vendor accounts, three UI languages and one place for owner, managers and clients to work, without five separate products and five logins.

Next.js 15 + TypeScriptPrismaPostgreSQL 16 + pgvectorRocket.Chat (headless)Jitsi MeetMinIOGeminiDocker Compose + nginx

Підхід

  • After a first iteration of off-the-shelf tools, consolidated everything into one Next.js application where roles are separated by routes and middleware.
  • PostgreSQL is the single source of truth; Rocket.Chat, MediaCMS and MinIO run headless and are referenced through an externalRefs JSONB column.
  • Easy!Appointments, Jitsi Meet and ONLYOFFICE exposed on their own subdomains behind nginx.
  • Soft delete on every entity, optimistic locking via a version field, permissions as role, resource, action tuples.
  • Background workers for pgvector embeddings (Gemini) and video transcoding.

Що є сьогодні

  • GitHub Actions deploys on push to main after a Prisma generate and TypeScript check, with a health check and a production concurrency group.
  • Runbook, permissions matrix, go-live checklist, backup script and six ADRs in the repository.
2025DeveloperПриватний репозиторій

VPS hosting website with scheduled AI content generation

The public website of a VPS hosting company: a legacy PHP site restructured into an MVC layer, with a daily cron that publishes blog posts through the Gemini API. Private repository, details on request.

The site had grown as PHP includes with no routing layer, and the blog needed a steady flow of technical articles without a content team.

PHP 8MySQL (PDO)Gemini REST APICloudflareNginxCron

Підхід

  • Introduced a PSR-4 autoloaded core (Router, Request, Config) with controllers, models and services, keeping legacy includes working for cron jobs.
  • Topics queued in a database table with dates; a daily cron picks pending topics, calls Gemini over REST with a JSON response schema and Google Search grounding, and retries on failure.
  • After publishing, the Cloudflare cache is purged and search engines notified via IndexNow.
  • Cloudflare Turnstile on forms, cookie consent and a blog search API.
  • Main and dev branches map to live and dev servers; a dev mode toggles profiler and debug toolbar.

Що є сьогодні

  • Sitemap of roughly 2,900 URLs, including over 2,500 posts, as documented in the repository.
  • Product pages for GPU slices, microVMs, AI inference, game servers and CI/CD.
2025AuthorGitHub ↗

Ubuntu server provisioning toolkit

Three Bash scripts that take a fresh Ubuntu 22.04 server to a hardened, tuned web host and add Laravel or PHP domains with TLS in one command.

Setting up a PHP host by hand is repetitive and error-prone: packages, a non-root admin user, firewall, PHP-FPM and MySQL tuning, vhosts and certificates all have to be done the same way every time.

BashUbuntu 22.04 LTSNginxPHP-FPMMySQLCertbotFail2ban

Підхід

  • postinstall.sh installs Nginx, MySQL, PHP (version auto-detected), Memcached, Composer, ionCube, Fail2ban and Certbot, and creates a sudo admin user with a standard directory layout.
  • PHP-FPM worker counts and MySQL memory settings are derived from detected RAM, CPU and disk.
  • addDomain.sh creates the vhost, log directory and Let's Encrypt certificate for a domain, with a Laravel variant.
  • install_project.sh bootstraps a Laravel project on the prepared host.
  • Strict mode (set -euo pipefail), non-interactive APT and dedicated log files.

Що є сьогодні

  • About 1,000 lines of Bash across three scripts, runnable directly from the repository.
  • Public repository.
2025AuthorGitHub ↗

Multilingual tax calculator for Norwegian sole proprietorships

A dependency-free browser calculator that estimates 2025 taxes for an ENK (sole proprietorship) in Norway, in four languages, with gross-to-net and net-to-gross modes.

People starting a business in Norway, many of them non-native speakers, need a quick, transparent view of how trygdeavgift, ordinary income tax and bracket tax add up, and what profit a target take-home amount requires.

JavaScriptHTMLCSSlocalStorage

Підхід

  • Tax rules encoded as data: 10.7% national insurance on business income, 22% tax on ordinary income and the five 2025 bracket-tax steps, each linked to the official Skatteetaten source.
  • Reverse calculation (desired net to required profit) implemented with a binary search over the forward model.
  • Translations in one file per language with nested keys and a fallback; the choice persists in localStorage.
  • Monthly or yearly input, results in both, and an optional second currency with a manual exchange rate.

Що є сьогодні

  • Four languages: Norwegian, English, Ukrainian and Russian.
  • Plain HTML, CSS and JavaScript with no build step or external dependencies.