Laraue Blog — .NET, Nuxt, Telegram Bots and AI Workflow

Real code, real decisions, real tradeoffs. We write about what we build — .NET libraries, Telegram bots, AI integrations, and the architecture mistakes worth learning from.

DeepSeek API in .NET — an OpenAI-compatible client without an SDK, Ollama for development and AI that tidies up notes
Part 26 of the series about building a Telegram task tracker in a tiny team. How Boards got AI that turns a stream of thoughts from a chat into a neat task: DeepSeek in production, Ollama for local development, our own OpenAI-compatible client on HttpClient and the /aisave command in Telegram.
Read →
A Telegram bot for group chats in .NET — linking a chat to a board and tasks from messages
Part 25 of the series about building a Telegram task tracker in a tiny team. How the Boards bot learned to work in group chats: linking a chat to a board with /link, two message save modes, the admin check, privacy mode and a group turning into a supergroup.
Read →
How we rewrote the frontend — a Nuxt architecture with explicit dependencies, Vitest tests and rules for AI agents
Part 23 of the series about building a Telegram task tracker in a tiny team. Why the Boards UI had to be rewritten, how the new frontend architecture works with every page declaring its dependencies explicitly, how that helps Vitest tests, and why the repository has a file of rules for AI agents.
Read →
Task comments — permissions, background loading and API pagination without COUNT
Part 22 of the series about building a Telegram task tracker in a tiny team. How task comments work in Boards: who can read, write and edit them, why they load in a separate background request, and how pagination works without a COUNT query.
Read →
Telegram as file storage for a web app — uploads through a bot and one attachment model
Part 21 of the series about building a Telegram task tracker in a tiny team. How we let the web app upload images to tasks and store them in Telegram through a bot and brought files from the bot and from the web under one attachment model.
Read →
Task change history — how we built an audit log in a task tracker
Part 20 of the series about building a Telegram task tracker in a tiny team. How Boards got a change history for tasks, why we write it explicitly in services in the same transaction as the changes themselves, and why EF Core interceptors, temporal tables and event sourcing did not fit.
Read →
Custom fields for tasks — EAV vs JSONB in PostgreSQL, a separate table per type and filtering by values
Part 19 of the series about building a Telegram task tracker in a tiny team. How we added attributes (custom fields) to issues, why we chose an EAV model with a separate value table per type instead of a JSONB column, and how filtering tasks by attribute values works.
Read →
Sequential issue numbers — a counter on PostgreSQL INSERT ON CONFLICT, space keys and organization URLs
Part 18 of the series about building a Telegram task tracker in a tiny team. How issues got sequential numbers like BRD-42, why a counter on INSERT ... ON CONFLICT DO UPDATE suited them better than a PostgreSQL sequence, and how space keys and organization URLs work.
Read →
Access control in a task tracker without roles — an alternative to RBAC, four versions of the model and space-level permissions
Part 17 of the series about building a Telegram task tracker in a tiny team. Why Boards has no roles, how the permission system went through four versions looking for a balance between flexibility and simplicity, and why permissions are now granted only on the organization and the space.
Read →
Multi-tenancy in a SaaS task tracker — organizations, a personal organization for every user and a separate organization JWT
Part 16 of the series about building a Telegram task tracker in a tiny team. How we added organizations to Boards: a shared-database data model, a personal organization for every user, joining by an invite code, and a separate JWT issued when a user enters an organization.
Read →
API integration testing in ASP.NET Core — WebApplicationFactory, a real PostgreSQL and a typed controller proxy
Part 15 of the series about building a Telegram task tracker in a tiny team. Why we wrote our first integration tests when the app was already in production, how the test host on WebApplicationFactory with a real database works, and our own proxy that turns a controller method call into an HTTP request.
Read →
Spaces in a task tracker — grouping boards by project, the data model and moving existing users' data
Part 14 of the series about building a Telegram task tracker in a tiny team. How spaces group boards by project, why the space lives on the board and not on the issue, and the SQL migration that gave every existing user a default space.
Read →
How we run our backlog in Boards with Claude Code over MCP
Part 27 of the series about building a Telegram task tracker in a tiny team. 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 →
From Telegram Saved Messages to a real task tracker — defining the user path
Part 3 of building a Telegram task tracker in a tiny team. 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 →
Building a Jira alternative in a tiny team — why we are doing it and the repository links
Part 1 of building a Telegram task tracker in a tiny team 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 →
Laraue Boards
Laraue Boards is an open source task tracker with Telegram integration. The product site is boards.laraue.com; this page is about the project and how we build it.
Read →