ArtFeed

A social network where classic and everyday authors stand side by side. Writing and art in one feed, and every author gets a page on their own subdomain.

Open artfeed.ru
Role
Backend & infrastructure
Period
2026 — now
Status
Beta
Code
Closed

The UI is built by the frontend team. I'm responsible for the backend and infrastructure: everything these screens load, search and save.

Classics: author profiles, captions and work counts come from the API. Beta, September 2026.

The task

Authors have no single home for everything they create. Poems traditionally go to one old site, prose to another, paintings somewhere else. And on mainstream social networks a work sinks in the feed between memes and ads: no proper reading format, no collections by genre, no real author profile.

ArtFeed brings it all into one place: poems, prose and paintings in one feed, follows, comments and co-authorship like a familiar social network, plus a full profile at its own address, name.artfeed.ru. Classics sit alongside, from Pushkin to Aivazovsky, with their works and biographies: readers have something to read and see from day one, and new authors share the shelf with them.

Constraints: the project is meant to last for years, so the code has to stay readable; personal data is handled under Russian law 152-FZ and never leaks into logs or outside.

artfeed.ru currently runs the beta from September 16. The full version launches on January 1, 2027, and testers are checking it on staging.

What I did

  1. 01

    A modular monolith on DDD and CQRS

    Modules depend strictly one way, commands and queries are separated, Dishka wires the dependencies. import-linter checks the boundaries right in CI.

  2. 02

    Access rules in one place

    Who can see and do what lives in policy classes in the domain, not scattered across endpoints. Someone else's private content answers 404, as if it didn't exist.

  3. 03

    Sign-in and security

    argon2 passwords, app-based 2FA, VK ID sign-in, rate limits, re-confirmation for risky actions. Secret fields are encrypted in the database.

  4. 04

    Background work

    Events go through an outbox, notifications arrive as web push, the sitemap is built on a schedule. The worker and scheduler run on Taskiq.

  5. 05

    Over 170 endpoints and a contract for the frontend

    The OpenAPI schema and error codes live in the repository: every API change shows up in the diff, and the frontend gets a changelog.

  6. 06

    Three environments and one-click deploys

    local, staging and prod on Docker Compose behind Traefik, private access through Headscale, every operation through Taskfile. Deploys and rollbacks via GitHub Actions.

  7. 07

    Backups and monitoring

    Every night the database is encrypted and shipped to S3 in Russia, and a separate script checks that the backup actually restores. Errors go to a self-hosted Bugsink, uptime is watched by Uptime Kuma.

Stack

  • FastAPI
  • PostgreSQL
  • Redis
  • Taskiq
  • Python
  • SQLAlchemy
  • Alembic
  • Dishka
  • Pydantic
  • S3
  • structlog
  • Sentry
  • pytest
  • testcontainers
  • mypy
  • ruff
  • import-linter
  • Docker Compose
  • Traefik
  • GitHub Actions
  • Headscale
  • Taskfile