One message goes to Telegram, VK and MAX. Markup is converted at the AST level, and edge cases are covered by tests.
Architecture
features/*coreshared
20+modules moved to their ownersmodule boundary violations: 99 → 15
The refactoring plan became the team standard. Layers rebuilt as shared → core → features, with boundaries checked in CI.
Activity
03
04
05
06
07
08
09
10
11
12
01
02
03
04
05
06
07
08
09
20252026
Commits to the core SPA per month. In summer 2026 big refactorings ran alongside product work. ≈1,050 unique commits across 11 repositories
1 / 6
</>Kirill LevinFrontend Edition
Kirill Levin is a frontend developer from Saint Petersburg with 5+ years of commercial Angular. I build features whose effect shows up in the metrics and keep a large app fast and easy to work with. I review code, mentor, and build tooling for the team.
Looking for a team where I can shape the frontend architecture, where code review is the norm, and where standards are agreed on and checked automatically. Based in Saint Petersburg: remote, hybrid or office. Angular is my core stack, and I’m open to React and Vue.
Hire Kirill Levin
Full-time · remote, hybrid or office in Saint Petersburg
A developer plus five agents in Claude Code and Cursor: work goes in phases, project rules cover architecture and security, and hooks won’t close a phase without real lint and test runs.
−83%6 roles1 offer
Invite to an interview
Demo version: 60 minutes, no sign-up required
Free
About this game
Key case studies from the last year and a half, ordered by business impact. The numbers are my own measurements and team data. Company code stays private.
+50%Conversion+50%
Marketing site: +50% traffic to sign-up
BotHelp · 2026
Problem
Turn blog traffic into product sign-ups without losing attribution on the way from the site to the app.
Solution
Built WordPress CTA blocks and an article sidebar that pass ref and UTM along, plus a mega menu and a CRM-integration landing page. Moved Yandex Metrica to the new tag so the page view is guaranteed to fire before the redirect, set up cross-domain cookie sync for the affiliate network, and removed duplicate Amplitude events.
Result
Site-to-sign-up traffic grew by 50%, and traffic sources are attributed correctly.
WordPressUTMYandex MetricaAmplitude
≈30%Revenue≈30%
Billing: ≈30% of paying customers use plan add-ons
BotHelp · May 2025 — Jul 2026
Problem
The product needed paid and free add-ons on top of plans that behave correctly across trial, expiry, cancellation and downgrade.
Solution
Built the billing frontend: add-ons, extra storage and tokens, limits, downgrade validation, subscription edge states, a mobile version. Integrated FastSpring, Robokassa, YooMoney and one more provider.
Result
About 30% of paying customers use add-ons. Subscription edge cases went through more than six QA iterations.
FastSpringRobokassaYooMoney
1–2 daysDelivery speed1–2 days
A new tool in 1–2 days instead of a week
BotHelp · Aug 2026
Problem
About ten subscriber growth tools (widgets, landing pages, links, comment auto-replies) were copies of each other. Adding a new one took a week.
Solution
Consolidated them into a definition registry with a unified CRUD contract, NGXS state and form-adapter factories, and base components. Routes are generated from the registry, NgModules are gone, components are standalone.
Result
A new tool is now a registry definition. Along the way I deleted 7.6k lines of legacy and replaced snapshot tests with specs.
NGXSStandaloneJest
20+ modulesArchitecture20+ modules
Frontend architecture: the refactoring plan became the team standard
BotHelp · Sep 2025 — Aug 2026
Problem
A large Angular app in an Nx monorepo grew without clear boundaries: features pulled each other in through shared layers, the bundle chunked poorly, and new work kept getting more expensive.
Solution
Audited the codebase and wrote a phased refactoring plan that the team adopted as a standard. Following it, rebuilt the layers (shared → core → features), moved 20+ modules’ code to their owners, and enforced boundaries with ESLint rules in CI. Migrated every form to Typed Forms and panels and menus to Signals.
Result
Five frontend engineers work to one standard. Module boundary violations dropped from 99 to 15, chunking improved, and the third-party forms library is gone.
NxESLintTyped FormsSignals
smoke E2ETeam toolingsmoke E2E
Test automation on stable data-testids
BotHelp · Jun — Aug 2026
Problem
E2E tests relied on brittle selectors, and placing data-testids by hand across hundreds of templates wasn’t realistic.
Solution
Wrote a Node.js template scanner, a rule-based name generator and a registry. Added a CI check, a pre-commit hook and a custom ESLint rule.
Result
testIds are generated automatically and checked in CI. The team built smoke test automation on top of them.
Node.jsESLintCIE2E
−85%Speed−85%
Bot builder: 85% less time to open
BotHelp · Apr 2026
Problem
The GoJS-based visual scenario builder is the product’s main screen. A large scenario took about 13 seconds to open, and the page component had grown into a monolith.
Solution
Moved diagram model conversion to a Web Worker, split the page into services, rewrote rendering and model loading, and closed canvas sync races after WebSocket reconnects.
Result
A large scenario opens in 2 seconds instead of 13. I shipped the main-screen optimization in stages, with a fast rollback path.
GoJSWeb WorkersWebSocket
3 messengersStability3 messengers
Stable formatting across Telegram, VK and MAX
BotHelp · Jan — Jun 2026
Problem
One message goes to three messengers, each with its own markup and length limits. Conversion broke links, macros and line breaks.
Solution
Wrote AST-level HTML ↔ Markdown conversion with link and macro escaping, length counters, previews and a converter for legacy Telegram messages.
Result
Edge cases are covered by tests, and formatting works the same across all three messengers.
mdastMarkdownRich text
5 agentsAI in development5 agents
An agent squad: analyst, architect, engineer, reviewer, debugger
BotHelp · 2026
Problem
The team used AI tools inconsistently, and results depended on who was at the keyboard.
Solution
Rolled out AI-assisted development in Claude Code and Cursor. Agents in the roles of analyst, architect, engineer, reviewer and debugger take a task through phases with plan and decision files, and the /implement, /bugfix and /review commands cover common scenarios. Project rules describe architecture, testing, security (input handling, injections, secrets) and the git workflow.
Result
Quality is enforced by hooks: a phase can’t close without real lint and test runs, and dangerous git commands like force-push are blocked. Ran team meetups on the approach. Decisions are still mine.
Claude CodeCursorHooksSecurity
Svelte 5Embeddable codeSvelte 5
AI-agent chat widget in Svelte 5
BotHelp · May — Sep 2026
Problem
Customers needed an AI-agent widget for their sites that doesn’t clash with the host page and doesn’t add unnecessary load.
Solution
Shadow DOM isolation, UTM tracking, branding, and a WebSocket connection only after the widget opens. Built a pnpm + Turborepo monorepo for public frontends and moved deploys to Shipit.
Result
Operators no longer get an empty dialog for every site visitor, and static deploys got stage, prod and rollback.
Svelte 5Shadow DOMTurborepo
Mature Content Description
The developer describes the content like this: contains scenes of legacy code deletion and forced migration of NgModules to standalone.
Updates & version history
3.0BotHelp
Major update
BotHelp — Frontend Engineer
Mar 2025 — Sep 2026
High-load SaaS chatbot and messenger-marketing platform: mass broadcasts, real-time operator chats, bot builder, CRM integrations and AI agents. Telegram, VK, MAX, WhatsApp.
Patch notes (9)
Billing frontend and four payment providers: ≈30% of paying customers use plan add-ons.
Wrote the refactoring plan that became the team standard and rebuilt the Nx layer architecture by it.
Moved growth tools to a definition registry: a new tool in 1–2 days instead of a week.
Automated data-testids for E2E; the team launched smoke test automation.
Cut the bot builder’s open time by 85%: a large scenario opens in 2 s instead of 13.
Rebuilt the main dashboard pages with folders and a mobile version: large lists render 93% faster.
Reworked message formatting for Telegram, VK and MAX: AST-level HTML ↔ Markdown conversion with edge cases covered by tests.
Owned frontend architecture in a team of 5 developers: code review (including the Flutter app), mentored two developers, rolled out AI-assisted development.
Angular 17–22, TypeScript, RxJS, NGXS, Signals, Nx, Jest, GoJS, Web Workers, WebSocket, Svelte 5, Flutter, GitLab CI
2.0T1
Update
T1 — Frontend Engineer
Jul 2023 — Mar 2025
IT holding, systems integration. A visual low-code CRM editor where implementation teams assemble business services.
Patch notes (4)
Sped up pages with 10k-row tables: lazy data and module loading, faster table and graph rendering.
Kirill Levin is a frontend developer from Saint Petersburg with 5+ years of commercial Angular. I build features whose effect shows up in the metrics and keep a large app fast and easy to work with. I review code, mentor, and build tooling for the team.
data-testids generate themselves; smoke tests run on them
Aug 2026
−85%
Speedrunner
Time to open a large scenario −85% (13 s → 2 s)
Apr 2026
−93%
Impatient
Time to render large lists −93% (30 s → 2 s)
Apr 2025
MD
Polyglot
Stable formatting for Telegram, VK and MAX
Jun 2026
{T}
Strictly typed
Every form in the app on native Typed Forms
Aug 2026
×2
Mentor
Mentored two developers
2025–2026
5
Squad
Assemble a team of five AI agents
2026
99
Border patrol
Module boundary violations: 99 → 15
Aug 2026
i18n
Vocabulary
Purged ≈600 unused translation keys, added a CI gate
Aug 2026
1k
Thousandaire
≈1,050 unique commits across 11 repositories
Sep 2026
200
Solo mode
A platform whose frontend I built alone sold 200+ corporate licenses
2023
WS
Silent widget
The widget connects to the server only after it opens
2026
What products say
Written on behalf of the product and tools. The numbers are real.
+50% sign-up trafficmarketing site
Company blog
Once articles got CTA blocks that pass ref and UTM along, readers started going from the blog to sign-up 50% more often.
≈30% of paying customersplan add-ons
Billing
About one in three paying customers uses add-ons. Trials, cancellations and downgrades behave predictably.
13 s → 2 smain product screen
Bot builder
A large scenario opens in 2 seconds instead of 13. Model conversion moved to a Web Worker, and rendering and loading were rewritten.
3 messengersTelegram, VK, MAX
Broadcasts
The same text looks the same in Telegram, VK and MAX: links, macros and line breaks survive the conversion. Edge cases are covered by tests.
99 → 15module boundaries
ESLint
I check module boundaries on every MR. There were 99 violations, now there are 15, and new ones don’t reach the main branch.
0 empty dialogsAI widget
Operator inbox
The widget connects to the server only after a visitor opens it, so there’s no longer an empty dialog for every site visit.
Members
The agents run on Claude Code and Cursor. Decisions are mine, and I take personal responsibility for the code.
Kirill Levin
Squad leader · sets the task
An
Analyst
In-game: acceptance criteria
Ar
Architect
In-game: mapping the impact
En
Engineer
In-game: code and tests
Rv
Reviewer
In-game: verdict on the diff
Db
Debugger
On call: root cause
About
</>
5+years of commercial development. Contains refactoring scenes.
Open to offers
Kirill Levin is a frontend developer from Saint Petersburg with 5+ years of commercial Angular. I build features whose effect shows up in the metrics and keep a large app fast and easy to work with. I review code, mentor, and build tooling for the team.
Looking for a team where I can shape the frontend architecture, where code review is the norm, and where standards are agreed on and checked automatically. Based in Saint Petersburg: remote, hybrid or office. Angular is my core stack, and I’m open to React and Vue.
Kirill Levin is a frontend developer from Saint Petersburg with 5+ years of commercial Angular. I build features whose effect shows up in the metrics and keep a large app fast and easy to work with. I review code, mentor, and build tooling for the team.
Kirill Levin is a frontend developer from Saint Petersburg with 5+ years of commercial Angular. I build features whose effect shows up in the metrics and keep a large app fast and easy to work with. I review code, mentor, and build tooling for the team.
> **Open to offers.** Looking for a team where I can shape the frontend architecture, where code review is the norm, and where standards are agreed on and checked automatically. Based in Saint Petersburg: remote, hybrid or office. Angular is my core stack, and I’m open to React and Vue.
Kirill Levin is a frontend developer from Saint Petersburg with 5+ years of commercial Angular. I build features whose effect shows up in the metrics and keep a large app fast and easy to work with. I review code, mentor, and build tooling for the team.
Open to offers. Looking for a team where I can shape the frontend architecture, where code review is the norm, and where standards are agreed on and checked automatically. Based in Saint Petersburg: remote, hybrid or office. Angular is my core stack, and I’m open to React and Vue.
Turn blog traffic into product sign-ups without losing attribution on the way from the site to the app.
## Solution
Built WordPress CTA blocks and an article sidebar that pass ref and UTM along, plus a mega menu and a CRM-integration landing page. Moved Yandex Metrica to the new tag so the page view is guaranteed to fire before the redirect, set up cross-domain cookie sync for the affiliate network, and removed duplicate Amplitude events.
## Result
Site-to-sign-up traffic grew by 50%, and traffic sources are attributed correctly.
`WordPress``UTM``Yandex Metrica``Amplitude`
Marketing site: +50% traffic to sign-up
+50% · Conversion · BotHelp · 2026
Problem
Turn blog traffic into product sign-ups without losing attribution on the way from the site to the app.
Solution
Built WordPress CTA blocks and an article sidebar that pass ref and UTM along, plus a mega menu and a CRM-integration landing page. Moved Yandex Metrica to the new tag so the page view is guaranteed to fire before the redirect, set up cross-domain cookie sync for the affiliate network, and removed duplicate Amplitude events.
Result
Site-to-sign-up traffic grew by 50%, and traffic sources are attributed correctly.
WordPressUTMYandex MetricaAmplitude
usertrv›cases›M↓billing.md
# Billing: ≈30% of paying customers use plan add-ons
The product needed paid and free add-ons on top of plans that behave correctly across trial, expiry, cancellation and downgrade.
## Solution
Built the billing frontend: add-ons, extra storage and tokens, limits, downgrade validation, subscription edge states, a mobile version. Integrated FastSpring, Robokassa, YooMoney and one more provider.
## Result
About 30% of paying customers use add-ons. Subscription edge cases went through more than six QA iterations.
`FastSpring``Robokassa``YooMoney`
Billing: ≈30% of paying customers use plan add-ons
≈30% · Revenue · BotHelp · May 2025 — Jul 2026
Problem
The product needed paid and free add-ons on top of plans that behave correctly across trial, expiry, cancellation and downgrade.
Solution
Built the billing frontend: add-ons, extra storage and tokens, limits, downgrade validation, subscription edge states, a mobile version. Integrated FastSpring, Robokassa, YooMoney and one more provider.
Result
About 30% of paying customers use add-ons. Subscription edge cases went through more than six QA iterations.
About ten subscriber growth tools (widgets, landing pages, links, comment auto-replies) were copies of each other. Adding a new one took a week.
## Solution
Consolidated them into a definition registry with a unified CRUD contract, NGXS state and form-adapter factories, and base components. Routes are generated from the registry, NgModules are gone, components are standalone.
## Result
A new tool is now a registry definition. Along the way I deleted 7.6k lines of legacy and replaced snapshot tests with specs.
`NGXS``Standalone``Jest`
A new tool in 1–2 days instead of a week
1–2 days · Delivery speed · BotHelp · Aug 2026
Problem
About ten subscriber growth tools (widgets, landing pages, links, comment auto-replies) were copies of each other. Adding a new one took a week.
Solution
Consolidated them into a definition registry with a unified CRUD contract, NGXS state and form-adapter factories, and base components. Routes are generated from the registry, NgModules are gone, components are standalone.
Result
A new tool is now a registry definition. Along the way I deleted 7.6k lines of legacy and replaced snapshot tests with specs.
NGXSStandaloneJest
usertrv›cases›M↓layers.md
# Frontend architecture: the refactoring plan became the team standard
A large Angular app in an Nx monorepo grew without clear boundaries: features pulled each other in through shared layers, the bundle chunked poorly, and new work kept getting more expensive.
## Solution
Audited the codebase and wrote a phased refactoring plan that the team adopted as a standard. Following it, rebuilt the layers (shared → core → features), moved 20+ modules’ code to their owners, and enforced boundaries with ESLint rules in CI. Migrated every form to Typed Forms and panels and menus to Signals.
## Result
Five frontend engineers work to one standard. Module boundary violations dropped from 99 to 15, chunking improved, and the third-party forms library is gone.
`Nx``ESLint``Typed Forms``Signals`
Frontend architecture: the refactoring plan became the team standard
A large Angular app in an Nx monorepo grew without clear boundaries: features pulled each other in through shared layers, the bundle chunked poorly, and new work kept getting more expensive.
Solution
Audited the codebase and wrote a phased refactoring plan that the team adopted as a standard. Following it, rebuilt the layers (shared → core → features), moved 20+ modules’ code to their owners, and enforced boundaries with ESLint rules in CI. Migrated every form to Typed Forms and panels and menus to Signals.
Result
Five frontend engineers work to one standard. Module boundary violations dropped from 99 to 15, chunking improved, and the third-party forms library is gone.
NxESLintTyped FormsSignals
usertrv›cases›M↓testid.md
# Test automation on stable data-testids
> **smoke E2E** · Team tooling · BotHelp · Jun — Aug 2026
## Problem
E2E tests relied on brittle selectors, and placing data-testids by hand across hundreds of templates wasn’t realistic.
## Solution
Wrote a Node.js template scanner, a rule-based name generator and a registry. Added a CI check, a pre-commit hook and a custom ESLint rule.
## Result
testIds are generated automatically and checked in CI. The team built smoke test automation on top of them.
`Node.js``ESLint``CI``E2E`
Test automation on stable data-testids
smoke E2E · Team tooling · BotHelp · Jun — Aug 2026
Problem
E2E tests relied on brittle selectors, and placing data-testids by hand across hundreds of templates wasn’t realistic.
Solution
Wrote a Node.js template scanner, a rule-based name generator and a registry. Added a CI check, a pre-commit hook and a custom ESLint rule.
Result
testIds are generated automatically and checked in CI. The team built smoke test automation on top of them.
Node.jsESLintCIE2E
usertrv›cases›M↓builder.md
# Bot builder: 85% less time to open
> **−85%** · Speed · BotHelp · Apr 2026
## Problem
The GoJS-based visual scenario builder is the product’s main screen. A large scenario took about 13 seconds to open, and the page component had grown into a monolith.
## Solution
Moved diagram model conversion to a Web Worker, split the page into services, rewrote rendering and model loading, and closed canvas sync races after WebSocket reconnects.
## Result
A large scenario opens in 2 seconds instead of 13. I shipped the main-screen optimization in stages, with a fast rollback path.
`GoJS``Web Workers``WebSocket`
Bot builder: 85% less time to open
−85% · Speed · BotHelp · Apr 2026
Problem
The GoJS-based visual scenario builder is the product’s main screen. A large scenario took about 13 seconds to open, and the page component had grown into a monolith.
Solution
Moved diagram model conversion to a Web Worker, split the page into services, rewrote rendering and model loading, and closed canvas sync races after WebSocket reconnects.
Result
A large scenario opens in 2 seconds instead of 13. I shipped the main-screen optimization in stages, with a fast rollback path.
GoJSWeb WorkersWebSocket
usertrv›cases›M↓format.md
# Stable formatting across Telegram, VK and MAX
> **3 messengers** · Stability · BotHelp · Jan — Jun 2026
## Problem
One message goes to three messengers, each with its own markup and length limits. Conversion broke links, macros and line breaks.
## Solution
Wrote AST-level HTML ↔ Markdown conversion with link and macro escaping, length counters, previews and a converter for legacy Telegram messages.
## Result
Edge cases are covered by tests, and formatting works the same across all three messengers.
`mdast``Markdown``Rich text`
Stable formatting across Telegram, VK and MAX
3 messengers · Stability · BotHelp · Jan — Jun 2026
Problem
One message goes to three messengers, each with its own markup and length limits. Conversion broke links, macros and line breaks.
Solution
Wrote AST-level HTML ↔ Markdown conversion with link and macro escaping, length counters, previews and a converter for legacy Telegram messages.
Result
Edge cases are covered by tests, and formatting works the same across all three messengers.
mdastMarkdownRich text
usertrv›cases›M↓ai.md
# An agent squad: analyst, architect, engineer, reviewer, debugger
> **5 agents** · AI in development · BotHelp · 2026
## Problem
The team used AI tools inconsistently, and results depended on who was at the keyboard.
## Solution
Rolled out AI-assisted development in Claude Code and Cursor. Agents in the roles of analyst, architect, engineer, reviewer and debugger take a task through phases with plan and decision files, and the /implement, /bugfix and /review commands cover common scenarios. Project rules describe architecture, testing, security (input handling, injections, secrets) and the git workflow.
## Result
Quality is enforced by hooks: a phase can’t close without real lint and test runs, and dangerous git commands like force-push are blocked. Ran team meetups on the approach. Decisions are still mine.
`Claude Code``Cursor``Hooks``Security`
An agent squad: analyst, architect, engineer, reviewer, debugger
5 agents · AI in development · BotHelp · 2026
Problem
The team used AI tools inconsistently, and results depended on who was at the keyboard.
Solution
Rolled out AI-assisted development in Claude Code and Cursor. Agents in the roles of analyst, architect, engineer, reviewer and debugger take a task through phases with plan and decision files, and the /implement, /bugfix and /review commands cover common scenarios. Project rules describe architecture, testing, security (input handling, injections, secrets) and the git workflow.
Result
Quality is enforced by hooks: a phase can’t close without real lint and test runs, and dangerous git commands like force-push are blocked. Ran team meetups on the approach. Decisions are still mine.
Customers needed an AI-agent widget for their sites that doesn’t clash with the host page and doesn’t add unnecessary load.
## Solution
Shadow DOM isolation, UTM tracking, branding, and a WebSocket connection only after the widget opens. Built a pnpm + Turborepo monorepo for public frontends and moved deploys to Shipit.
## Result
Operators no longer get an empty dialog for every site visitor, and static deploys got stage, prod and rollback.
Customers needed an AI-agent widget for their sites that doesn’t clash with the host page and doesn’t add unnecessary load.
Solution
Shadow DOM isolation, UTM tracking, branding, and a WebSocket connection only after the widget opens. Built a pnpm + Turborepo monorepo for public frontends and moved deploys to Shipit.
Result
Operators no longer get an empty dialog for every site visitor, and static deploys got stage, prod and rollback.
Svelte 5Shadow DOMTurborepo
usertrv›experience›M↓3.0-bothelp.md
---
version: 3.0
type: Major update
period: Mar 2025 — Sep 2026
---
# BotHelp — Frontend Engineer
High-load SaaS chatbot and messenger-marketing platform: mass broadcasts, real-time operator chats, bot builder, CRM integrations and AI agents. Telegram, VK, MAX, WhatsApp.
## Patch notes
- Billing frontend and four payment providers: ≈30% of paying customers use plan add-ons.
- Wrote the refactoring plan that became the team standard and rebuilt the Nx layer architecture by it.
- Moved growth tools to a definition registry: a new tool in 1–2 days instead of a week.
- Automated data-testids for E2E; the team launched smoke test automation.
- Cut the bot builder’s open time by 85%: a large scenario opens in 2 s instead of 13.
- Rebuilt the main dashboard pages with folders and a mobile version: large lists render 93% faster.
- Reworked message formatting for Telegram, VK and MAX: AST-level HTML ↔ Markdown conversion with edge cases covered by tests.
- Owned frontend architecture in a team of 5 developers: code review (including the Flutter app), mentored two developers, rolled out AI-assisted development.
**Stack:** Angular 17–22, TypeScript, RxJS, NGXS, Signals, Nx, Jest, GoJS, Web Workers, WebSocket, Svelte 5, Flutter, GitLab CI
BotHelp — Frontend Engineer
High-load SaaS chatbot and messenger-marketing platform: mass broadcasts, real-time operator chats, bot builder, CRM integrations and AI agents. Telegram, VK, MAX, WhatsApp.
Patch notes
Billing frontend and four payment providers: ≈30% of paying customers use plan add-ons.
Wrote the refactoring plan that became the team standard and rebuilt the Nx layer architecture by it.
Moved growth tools to a definition registry: a new tool in 1–2 days instead of a week.
Automated data-testids for E2E; the team launched smoke test automation.
Cut the bot builder’s open time by 85%: a large scenario opens in 2 s instead of 13.
Rebuilt the main dashboard pages with folders and a mobile version: large lists render 93% faster.
Reworked message formatting for Telegram, VK and MAX: AST-level HTML ↔ Markdown conversion with edge cases covered by tests.
Owned frontend architecture in a team of 5 developers: code review (including the Flutter app), mentored two developers, rolled out AI-assisted development.
Stack: Angular 17–22, TypeScript, RxJS, NGXS, Signals, Nx, Jest, GoJS, Web Workers, WebSocket, Svelte 5, Flutter, GitLab CI
usertrv›experience›M↓2.0-t1.md
---
version: 2.0
type: Update
period: Jul 2023 — Mar 2025
---
# T1 — Frontend Engineer
IT holding, systems integration. A visual low-code CRM editor where implementation teams assemble business services.
## Patch notes
- Sped up pages with 10k-row tables: lazy data and module loading, faster table and graph rendering.
Looking for a team where I can shape the frontend architecture, where code review is the norm, and where standards are agreed on and checked automatically. Based in Saint Petersburg: remote, hybrid or office. Angular is my core stack, and I’m open to React and Vue.
kirill — -zsh — 80×24
Type help to see the list of commands.
kirill@usertrv ~ % whoami
Kirill Levin (usertrv) — frontend engineer
Saint Petersburg · 5+ years · remote, hybrid, office
Kirill Levin is a frontend developer from Saint Petersburg with 5+ years of commercial Angular. I build features whose effect shows up in the metrics and keep a large app fast and easy to work with. I review code, mentor, and build tooling for the team.
Open to offers. Looking for a team where I can shape the frontend architecture, where code review is the norm, and where standards are agreed on and checked automatically. Based in Saint Petersburg: remote, hybrid or office. Angular is my core stack, and I’m open to React and Vue.
Looking for a team where I can shape the frontend architecture, where code review is the norm, and where standards are agreed on and checked automatically. Based in Saint Petersburg: remote, hybrid or office. Angular is my core stack, and I’m open to React and Vue.
Featured channels
The agents run on Claude Code and Cursor. Decisions are mine, and I take personal responsibility for the code.
Kirill LevinSquad leader · sets the task
AnAnalystIn-game: acceptance criteria
ArArchitectIn-game: mapping the impact
EnEngineerIn-game: code and tests
RvReviewerIn-game: verdict on the diff
DbDebuggerOn call: root cause
Videos
BotHelp · Conversion
BotHelp · Revenue
BotHelp · Delivery speed
BotHelp · Architecture
BotHelp · Team tooling
BotHelp · Speed
BotHelp · Stability
BotHelp · AI in development
BotHelp · Embeddable code
Shorts
Conversion
+50% site-to-sign-up traffic
Cashier
≈30% of paying customers use plan add-ons
Architect
Refactoring plan became the team standard
Assembly line
A new growth tool in 1–2 days instead of a week
Sharpshooter
data-testids generate themselves; smoke tests run on them
Speedrunner
Time to open a large scenario −85% (13 s → 2 s)
Impatient
Time to render large lists −93% (30 s → 2 s)
Polyglot
Stable formatting for Telegram, VK and MAX
Strictly typed
Every form in the app on native Typed Forms
Mentor
Mentored two developers
Squad
Assemble a team of five AI agents
Border patrol
Module boundary violations: 99 → 15
Vocabulary
Purged ≈600 unused translation keys, added a CI gate
Thousandaire
≈1,050 unique commits across 11 repositories
Solo mode
A platform whose frontend I built alone sold 200+ corporate licenses
Silent widget
The widget connects to the server only after it opens
Looking for a team where I can shape the frontend architecture, where code review is the norm, and where standards are agreed on and checked automatically. Based in Saint Petersburg: remote, hybrid or office. Angular is my core stack, and I’m open to React and Vue.
C
Company blogmarketing site
Once articles got CTA blocks that pass ref and UTM along, readers started going from the blog to sign-up 50% more often.
+50% sign-up trafficCompany blog · marketing site
B
Billingplan add-ons
About one in three paying customers uses add-ons. Trials, cancellations and downgrades behave predictably.
≈30% of paying customersBilling · plan add-ons
B
Bot buildermain product screen
A large scenario opens in 2 seconds instead of 13. Model conversion moved to a Web Worker, and rendering and loading were rewritten.
13 s → 2 sBot builder · main product screen
B
BroadcastsTelegram, VK, MAX
The same text looks the same in Telegram, VK and MAX: links, macros and line breaks survive the conversion. Edge cases are covered by tests.
3 messengersBroadcasts · Telegram, VK, MAX
E
ESLintmodule boundaries
I check module boundaries on every MR. There were 99 violations, now there are 15, and new ones don’t reach the main branch.
99 → 15ESLint · module boundaries
O
Operator inboxAI widget
The widget connects to the server only after a visitor opens it, so there’s no longer an empty dialog for every site visit.
Kirill Levin is a frontend developer from Saint Petersburg with 5+ years of commercial Angular. I build features whose effect shows up in the metrics and keep a large app fast and easy to work with. I review code, mentor, and build tooling for the team.
A set of small browser games for phones: a tower of slabs you trim with a precise tap, a drone swarm you lure into itself, ricochets through numbered blocks, speed sorting by swipe, a rope swing ahead of a chasing void, a one-tap chain reaction and a neon road taken sideways in a drift. All in plain Canvas 2D with no dependencies, Web Audio sound and local high scores. Also inside is the 3D game Black Hole: steer a black hole that swallows a procedural city, with Rapier physics in WebAssembly.
KPIs with period comparison, sales drill-down, marketing funnel, cohorts and a pivot report builder. About 286k orders are generated and aggregated in a Web Worker; the UI only renders the results.
An offline-first kanban and whiteboard. Open a board in two tabs: cards, cursors and "who is editing" sync instantly, and the CRDT merges edits made offline.
Wrote the refactoring plan that became the team standard and rebuilt the Nx layer architecture by it.
Moved growth tools to a definition registry: a new tool in 1–2 days instead of a week.
Automated data-testids for E2E; the team launched smoke test automation.
Cut the bot builder’s open time by 85%: a large scenario opens in 2 s instead of 13.
Rebuilt the main dashboard pages with folders and a mobile version: large lists render 93% faster.
Reworked message formatting for Telegram, VK and MAX: AST-level HTML ↔ Markdown conversion with edge cases covered by tests.
Owned frontend architecture in a team of 5 developers: code review (including the Flutter app), mentored two developers, rolled out AI-assisted development.
Stack: Angular 17–22, TypeScript, RxJS, NGXS, Signals, Nx, Jest, GoJS, Web Workers, WebSocket, Svelte 5, Flutter, GitLab CI
Kirill Levin (usertrv) is a frontend developer from Saint Petersburg with 5+ years of commercial Angular. I build features whose effect shows up in the metrics and keep a large app fast and easy to work with. I review code, mentor, and build tooling for the team.[1]
5 years of commercial Angular: architecture, performance, and features whose effect shows up in the metrics.
Biography
Looking for a team where I can shape the frontend architecture, where code review is the norm, and where standards are agreed on and checked automatically. Based in Saint Petersburg: remote, hybrid or office. Angular is my core stack, and I’m open to React and Vue.
Fluent in English: speaking, reading and listening. ≈1,050 unique commits across 11 repositories[2].
Career
BotHelp (Mar 2025 — Sep 2026)
Frontend Engineer. High-load SaaS chatbot and messenger-marketing platform: mass broadcasts, real-time operator chats, bot builder, CRM integrations and AI agents. Telegram, VK, MAX, WhatsApp.
Billing frontend and four payment providers: ≈30% of paying customers use plan add-ons.
Wrote the refactoring plan that became the team standard and rebuilt the Nx layer architecture by it.
Moved growth tools to a definition registry: a new tool in 1–2 days instead of a week.
Automated data-testids for E2E; the team launched smoke test automation.
Cut the bot builder’s open time by 85%: a large scenario opens in 2 s instead of 13.
Rebuilt the main dashboard pages with folders and a mobile version: large lists render 93% faster.
Reworked message formatting for Telegram, VK and MAX: AST-level HTML ↔ Markdown conversion with edge cases covered by tests.
Owned frontend architecture in a team of 5 developers: code review (including the Flutter app), mentored two developers, rolled out AI-assisted development.
Stack: Angular 17–22, TypeScript, RxJS, NGXS, Signals, Nx, Jest, GoJS, Web Workers, WebSocket, Svelte 5, Flutter, GitLab CI
T1 (Jul 2023 — Mar 2025)
Frontend Engineer. IT holding, systems integration. A visual low-code CRM editor where implementation teams assemble business services.
Sped up pages with 10k-row tables: lazy data and module loading, faster table and graph rendering.
Conversion: Marketing site: +50% traffic to sign-up
Problem. Turn blog traffic into product sign-ups without losing attribution on the way from the site to the app.
Solution. Built WordPress CTA blocks and an article sidebar that pass ref and UTM along, plus a mega menu and a CRM-integration landing page. Moved Yandex Metrica to the new tag so the page view is guaranteed to fire before the redirect, set up cross-domain cookie sync for the affiliate network, and removed duplicate Amplitude events.
Result. Site-to-sign-up traffic grew by 50%, and traffic sources are attributed correctly.[1]
Revenue: Billing: ≈30% of paying customers use plan add-ons
Problem. The product needed paid and free add-ons on top of plans that behave correctly across trial, expiry, cancellation and downgrade.
Solution. Built the billing frontend: add-ons, extra storage and tokens, limits, downgrade validation, subscription edge states, a mobile version. Integrated FastSpring, Robokassa, YooMoney and one more provider.
Result. About 30% of paying customers use add-ons. Subscription edge cases went through more than six QA iterations.
Delivery speed: A new tool in 1–2 days instead of a week
Problem. About ten subscriber growth tools (widgets, landing pages, links, comment auto-replies) were copies of each other. Adding a new one took a week.
Solution. Consolidated them into a definition registry with a unified CRUD contract, NGXS state and form-adapter factories, and base components. Routes are generated from the registry, NgModules are gone, components are standalone.
Result. A new tool is now a registry definition. Along the way I deleted 7.6k lines of legacy and replaced snapshot tests with specs.
Architecture: Frontend architecture: the refactoring plan became the team standard
Problem. A large Angular app in an Nx monorepo grew without clear boundaries: features pulled each other in through shared layers, the bundle chunked poorly, and new work kept getting more expensive.
Solution. Audited the codebase and wrote a phased refactoring plan that the team adopted as a standard. Following it, rebuilt the layers (shared → core → features), moved 20+ modules’ code to their owners, and enforced boundaries with ESLint rules in CI. Migrated every form to Typed Forms and panels and menus to Signals.
Result. Five frontend engineers work to one standard. Module boundary violations dropped from 99 to 15, chunking improved, and the third-party forms library is gone.
Team tooling: Test automation on stable data-testids
Problem. E2E tests relied on brittle selectors, and placing data-testids by hand across hundreds of templates wasn’t realistic.
Solution. Wrote a Node.js template scanner, a rule-based name generator and a registry. Added a CI check, a pre-commit hook and a custom ESLint rule.
Result. testIds are generated automatically and checked in CI. The team built smoke test automation on top of them.
Speed: Bot builder: 85% less time to open
Problem. The GoJS-based visual scenario builder is the product’s main screen. A large scenario took about 13 seconds to open, and the page component had grown into a monolith.
Solution. Moved diagram model conversion to a Web Worker, split the page into services, rewrote rendering and model loading, and closed canvas sync races after WebSocket reconnects.
Result. A large scenario opens in 2 seconds instead of 13. I shipped the main-screen optimization in stages, with a fast rollback path.
Stability: Stable formatting across Telegram, VK and MAX
Problem. One message goes to three messengers, each with its own markup and length limits. Conversion broke links, macros and line breaks.
Solution. Wrote AST-level HTML ↔ Markdown conversion with link and macro escaping, length counters, previews and a converter for legacy Telegram messages.
Result. Edge cases are covered by tests, and formatting works the same across all three messengers.
AI in development: An agent squad: analyst, architect, engineer, reviewer, debugger
Problem. The team used AI tools inconsistently, and results depended on who was at the keyboard.
Solution. Rolled out AI-assisted development in Claude Code and Cursor. Agents in the roles of analyst, architect, engineer, reviewer and debugger take a task through phases with plan and decision files, and the /implement, /bugfix and /review commands cover common scenarios. Project rules describe architecture, testing, security (input handling, injections, secrets) and the git workflow.
Result. Quality is enforced by hooks: a phase can’t close without real lint and test runs, and dangerous git commands like force-push are blocked. Ran team meetups on the approach. Decisions are still mine.
Embeddable code: AI-agent chat widget in Svelte 5
Problem. Customers needed an AI-agent widget for their sites that doesn’t clash with the host page and doesn’t add unnecessary load.
Solution. Shadow DOM isolation, UTM tracking, branding, and a WebSocket connection only after the widget opens. Built a pnpm + Turborepo monorepo for public frontends and moved deploys to Shipit.
Result. Operators no longer get an empty dialog for every site visitor, and static deploys got stage, prod and rollback.