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.
- 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.
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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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