Articles — .NET, Nuxt, Telegram Bots and AI in Practice

Architecture decisions, implementation deep-dives, and honest accounts of what went wrong. Written by engineers who shipped the code.

We built a markdown CMS backend in .NET, then dropped it for SSR in Nuxt
Why we deleted our own markdown-to-API backend and moved the blog into the Nuxt app — the frontend/backend sync problem, the things the system did not support, and what got simpler after the move.
Read →
How we run our backlog in Boards with Claude Code over MCP
We built an MCP server for Laraue Boards to understand how MCP works, then started using it with Claude Code every day. How the first version came together in two hours, what was wrong with it, and the daily loop it made possible.
Read →
Why reviewing AI-generated code is often more expensive than writing it yourself
The modern approach to development increasingly comes down to one claim — AI should write the code, and the developer just steers it and checks the results. The fact that reviewing generated code well enough to trust it is often slower than writing it yourself gets quietly left out.
Read →
Telegram Login Widget vs Mini App auth in .NET — two validation schemes, one JWT
Part 13 of building a Telegram task tracker solo. How to add Telegram Login Widget authentication to a .NET and Nuxt web app next to the Mini App's: linking the domain in BotFather, validating the widget data (a different secret from init data), rejecting outdated data by auth_date, and issuing the same JWT.
Read →
One card from a Telegram album — handling media groups and edits in a bot, without timeout hacks
Part 12 of building a Telegram task tracker solo. Telegram delivers an album as a burst of separate messages and an edit as a fresh update — here is how to turn a media group into a single record without the usual timeout accumulator, and how to treat an edit as an update instead of a duplicate.
Read →
Saving media from a Telegram bot — store the preview, stream the original
Part 11 of building a Telegram task tracker solo. Teaching the capture bot to handle photos and video, and the storage decision behind it — keep small previews on disk, stream full files straight from Telegram on demand without buffering them in memory, using nginx range-request passthrough, instead of re-hosting everything.
Read →
Why users kept choosing Telegram Saved Messages over our bot — and what we changed
Part 10 of building a Telegram task tracker solo. The story of a product mistake — we added epic and status selection to the bot, but real users kept using Saved Messages — and how we fixed it.
Read →
When not to use a nullable foreign key — modelling the empty state as a default row
Part 9 of building a Telegram task tracker solo. The issue layer in the web app and the database design decision at its centre — when a nullable foreign key is the wrong choice and a dedicated default row is better, using issues, epics and the backlog as the example.
Read →
Telegram Mini App authentication in .NET end to end — initData validation, JWT issuing and the Nuxt frontend
Part 8 of building a Telegram task tracker solo. How to authenticate a Telegram Mini App user in .NET and Nuxt: validating the initData hash with HMAC-SHA256, rejecting outdated data by auth_date, issuing and using a JWT bearer, reading the user from HttpContext, and why CORS matters.
Read →
Deploying a Nuxt Telegram Mini App. Setting up HTTPS on nginx with Let's Encrypt. A new mini app via BotFather
Part 7 of building a Telegram task tracker solo. How to deploy a Nuxt Telegram Mini App behind nginx with HTTPS: a subdomain, the nginx configuration, the first Let's Encrypt certificate and automatic renewal with certbot, registering the app in BotFather, local testing through ngrok, and what to do when the Mini App shows "Welcome to nginx!".
Read →
Deploying a .NET app and PostgreSQL to a cheap VPS with Docker Compose
Part 6 of building a Telegram task tracker solo. Deploying to a cheap VPS with Docker Compose — self-hosted PostgreSQL tuned for 1 GB of RAM, a GitHub CI pipeline running on push to main, and a walkthrough of the Dockerfiles.
Read →
Clean Telegram bot architecture in .NET — controllers instead of a giant switch
Part 5 of building a Telegram task tracker solo. A clean .NET Telegram bot with ASP.NET-style controllers and middleware instead of a giant switch, a layered solution structure, and EF Core paired with linq2db on the same models for the queries EF Core handles poorly.
Read →
Choosing a pet project stack for solo development — .NET, PostgreSQL, Nuxt, and why we prefer boring technologies
Part 4 of building a Telegram task tracker solo. The reasons behind .NET 10, PostgreSQL 18, Nuxt 4 and Vue 3. A bit about the MongoDB-to-Postgres migration in a past project that taught us to prefer boring, stable technologies.
Read →
From Telegram Saved Messages to a real task tracker — defining the user path
Part 3 of building a Telegram task tracker solo. Why Saved Messages is not convenient for managing tasks, which minimal scenario Laraue Boards started from, and why the user path is defined before development begins.
Read →
Prototyping the interface with AI before writing code
Part 2 of building a Telegram task tracker solo. Why we start with the interface, how AI HTML prototypes replaced Figma, and how the first Laraue Boards prototype turned out.
Read →
Building a Jira alternative solo — why we are doing it and the repository links
Part 1 of building a Telegram task tracker solo with AI. What problem we are solving, why the world needs another task tracker, and which two repositories the article series is built on.
Read →