update
This commit is contained in:
parent
e78ce3172c
commit
49770b351f
|
|
@ -1,168 +0,0 @@
|
|||
---
|
||||
name: triage-jobs
|
||||
description: Triage the latest Telegram vacancy inbox (`tracking/telegram_inbox.json`) — stratifies by priority (p1 in this session, p2/p3 via a Haiku subagent) and returns a deduped shortlist of vacancies worth applying to. Use when the user says "разбери inbox", "что нового по работе", "разбери вакансии", "пройдись по telegram-вакансиям", "triage the inbox", "find relevant jobs from telegram", or similar.
|
||||
---
|
||||
|
||||
# triage-jobs
|
||||
|
||||
Read the latest Telegram vacancy fetch and present a shortlist that fits Oleg's targeting.
|
||||
|
||||
The inbox file is large (~200K tokens). To keep the main session lean, p2/p3 channels go to a **Haiku subagent** that returns only finalists. p1 (small, high-signal) is processed here.
|
||||
|
||||
## Args
|
||||
|
||||
Optional priority filter as positional arg(s): `p1`, `p2`, `p3`, or `all` (default).
|
||||
|
||||
- `/triage-jobs` → all three tiers
|
||||
- `/triage-jobs p1` → only p1 in this session, skip subagent
|
||||
- `/triage-jobs p2 p3` → only subagent run
|
||||
|
||||
## Step 1 — Pre-checks
|
||||
|
||||
Verify the inbox exists and is recent:
|
||||
|
||||
```bash
|
||||
ls -lh tracking/telegram_inbox.json
|
||||
jq '{generated_at, total_in_inbox, channels_count: (.channels | length)}' tracking/telegram_inbox.json
|
||||
```
|
||||
|
||||
If the file is missing or its `generated_at` is older than ~6 hours, **don't run triage on stale data** — offer to refetch first:
|
||||
|
||||
```bash
|
||||
~/.local/bin/uv run scripts/list_telegram_channels.py \
|
||||
| ~/.local/bin/uv run scripts/fetch_telegram_jobs.py -
|
||||
```
|
||||
|
||||
## Step 2 — Oleg's targeting (apply strictly during triage)
|
||||
|
||||
This is the rubric — use it verbatim when deciding "keep or drop" and when briefing the subagent.
|
||||
|
||||
**Roles he targets:**
|
||||
- Senior / Staff / Principal Full-Stack Engineer
|
||||
- Tech Lead, Engineering Lead, Engineering Manager (with hands-on)
|
||||
- AI Engineer / Applied AI / LLM Engineer (TS or Python OK for AI roles)
|
||||
|
||||
**Stack match (strong signal):** TypeScript, JavaScript, Node.js, React, Next.js, TanStack, Tailwind, PostgreSQL, Drizzle, Vercel, Cloudflare, Sanity/Storyblok/Contentful/Payload (Headless CMS), Shopify/Hydrogen, GraphQL, WebSockets. For AI roles also: LLM orchestration, MCP, RAG, embeddings, Mastra, Vercel AI SDK, Claude/GPT/Gemini APIs.
|
||||
|
||||
**Culture must-haves:**
|
||||
- **Global remote** (he's in GMT+7, full EMEA overlap + US East AM). EMEA / global / US-East-friendly TZ all fine. "Remote within Russia only" or "US only — must be in EST 9-5" → reject.
|
||||
- **Compensation in USD/EUR** preferred. Target ~$100k+ FT or $70+/hr contractor. Russian-RUB roles at ₽70-100k/mo (≈ $750-1100) are below floor.
|
||||
- Deel/W-8BEN contractor format is a plus.
|
||||
|
||||
**Deal-breakers (auto-reject):**
|
||||
- Mobile-native (Kotlin, Swift, Android, iOS, Flutter)
|
||||
- Non-stack backend (Go/Golang, Java, .NET, C#, Ruby, PHP, Rust, Scala) **as primary** — if the role is fullstack with React/Node + Go on side, that's fine
|
||||
- DevOps / SRE as primary role
|
||||
- QA / Manual testing
|
||||
- Sales, Marketing, Designer, Recruiter, PM (non-engineering)
|
||||
- Junior / Trainee / Intern
|
||||
- On-site outside major remote-friendly hubs (e.g. Lagos, low-cost-region on-site)
|
||||
- Sub-$50k FT compensation when the salary is stated
|
||||
|
||||
**Stretch interests (consider even if not perfect match):**
|
||||
- AI/ML engineering roles using Python (his AI CV covers this)
|
||||
- Vetted-contractor platforms (Toptal, Lemon.io, Turing) — separate financial track
|
||||
- Headless CMS, Shopify Hydrogen, eCommerce platforms
|
||||
- Roles at companies building dev tooling, AI agents, MCP ecosystem (his open-source overlaps)
|
||||
|
||||
For canonical source-of-truth, the CVs are at:
|
||||
- `base/oleg_proskurin_ai_engineer_fullstack_cv.md`
|
||||
- `base/oleg_proskurin_fullstack_techlead_cv.md`
|
||||
|
||||
## Step 3 — p1 (process here)
|
||||
|
||||
Pull p1 channels from inbox and walk through every kept message:
|
||||
|
||||
```bash
|
||||
jq '.channels | to_entries | map(select(.value.priority == "p1")) | from_entries' tracking/telegram_inbox.json
|
||||
```
|
||||
|
||||
For each kept message, classify:
|
||||
- **Apply** — fits role + culture + comp. Note: company, role, link, why-fit (1 line).
|
||||
- **Maybe** — fits role/stack but unclear comp or stretch culture. Note same fields + the uncertainty.
|
||||
- **Drop** — fails targeting. Don't list, don't explain.
|
||||
|
||||
p1 should be small enough (~12K tokens currently) to do in main session without context strain.
|
||||
|
||||
## Step 4 — p2 and p3 (delegate to Haiku subagent)
|
||||
|
||||
Spawn a subagent via the Agent tool. Use `general-purpose` agent type with **Haiku model** for cost/speed.
|
||||
|
||||
**Critical:** the subagent does not see this conversation. The prompt must be self-contained.
|
||||
|
||||
Template (fill `<PRIORITY>` with `p2`, or pass both p2 and p3 in one call):
|
||||
|
||||
```
|
||||
Agent({
|
||||
description: "Triage Telegram inbox <PRIORITY>",
|
||||
subagent_type: "general-purpose",
|
||||
model: "haiku",
|
||||
prompt: `
|
||||
Triage job postings from Oleg's Telegram inbox.
|
||||
|
||||
Read tracking/telegram_inbox.json and filter to channels with priority "<PRIORITY>":
|
||||
|
||||
jq '.channels | to_entries | map(select(.value.priority == "<PRIORITY>")) | from_entries' tracking/telegram_inbox.json
|
||||
|
||||
Oleg's targeting (apply strictly):
|
||||
|
||||
[paste the "Step 2 — Oleg's targeting" section verbatim]
|
||||
|
||||
For each kept message that is a REAL vacancy (not a resume/CV digest entry, not a chat-room message, not a market-intel essay), decide if it fits the targeting.
|
||||
|
||||
Return ONLY the shortlist as JSON. Reject everything else silently — no commentary on rejected items.
|
||||
|
||||
Shortlist schema:
|
||||
[
|
||||
{
|
||||
"channel": "<channel_key>",
|
||||
"id": <message_id>,
|
||||
"link": "<t.me url>",
|
||||
"title": "<role title>",
|
||||
"company": "<company or null>",
|
||||
"stack": ["<key tech tokens>"],
|
||||
"comp": "<salary string or null>",
|
||||
"remote": true | false | "unclear",
|
||||
"fit": "apply" | "maybe",
|
||||
"why": "<one short sentence>"
|
||||
}
|
||||
]
|
||||
|
||||
If there are zero matches, return [].
|
||||
Do not paraphrase or summarize messages — quote the original title verbatim and just extract structured fields.
|
||||
Do not include personal opinions or formatting commentary.
|
||||
`
|
||||
})
|
||||
```
|
||||
|
||||
Run subagents in parallel where possible (one for p2, one for p3 in the same message).
|
||||
|
||||
## Step 5 — Aggregate and present
|
||||
|
||||
Combine p1 finalists (from Step 3) with subagent shortlists (Step 4). Dedupe by `(company, title)` pair when possible.
|
||||
|
||||
Present grouped output to Oleg, e.g.:
|
||||
|
||||
```
|
||||
🎯 APPLY (N)
|
||||
- jaabz_com #10233 — AI-Native Full Stack Developer @ Geeky Tech — TS/React/Python, Fully Remote, B2B SaaS
|
||||
- dev_connectablejobs #2039 — Full-Stack Engineer @ VOYGR — AI-native, $4-7k, Remote, founders ex-Google
|
||||
- ...
|
||||
|
||||
🤔 MAYBE (N)
|
||||
- jsspeak #58062 — AI Engineer (Python & Node.js) Senior @ Eshe App — 300-400k₽, RU+BY citizenship only — fit but comp lower
|
||||
- ...
|
||||
```
|
||||
|
||||
## Step 6 — Suggest next step
|
||||
|
||||
After the shortlist, offer to:
|
||||
- Append apply-list to `tracking/applications.md` (one row each, status `to-apply`).
|
||||
- For 1-2 top picks, switch to the tailoring workflow (see main CLAUDE.md "Workflow 2 — Tailor CV").
|
||||
|
||||
## Notes
|
||||
|
||||
- **Don't auto-add to `applications.md`** without explicit confirmation — Oleg curates that file.
|
||||
- **Don't auto-refetch.** If the inbox is stale, ask first.
|
||||
- **State cursor advances on every fetch.** A skill run only reads the existing inbox — it doesn't trigger a new fetch unless explicitly requested.
|
||||
- **Skip P3 by default if user says "quick triage"** — p3 is mostly market-intel and dead channels, low ROI.
|
||||
|
|
@ -0,0 +1,145 @@
|
|||
# Критерии отсева и триаж вакансий — 2026
|
||||
|
||||
> **Статус документа: authoritative playbook для триажа.**
|
||||
> Единый источник для решения apply / skip и выбора версии CV.
|
||||
> Сводит воедино критерии из `strategy-positioning-tracks-2026.md` (разделы 3–4), `<objective>` + `<reality_calibration>` из основной инструкции, backend-трек из `cv-backend-variant-hostinger-2026-05.md`, таймзонные расчёты из `facts-from-salmon-chat.md`.
|
||||
> Приоритет при конфликте: явное указание Олега → этот документ → остальные файлы.
|
||||
> Последнее обновление: 2 июня 2026 (v1, ввод comp-scaled таймзоны, fallback comp-яруса, research-протокола по площадкам).
|
||||
|
||||
---
|
||||
|
||||
## 1. Логика в двух словах
|
||||
|
||||
Сначала четыре **hard-gate** (объективные блокеры — отсев без вариантов). Прошли все четыре — вакансия в работе, дальше не отсев, а **классификация трека** и выбор CV. Триаж занимает ~5 минут чтения JD.
|
||||
|
||||
Базовая постура: **trying-friendly, не filtering-friendly.** На спорных побеждает «подаём». Жёсткий skip — редкость, нужен конкретный объективный блокер.
|
||||
|
||||
---
|
||||
|
||||
## 2. Hard-gate — четыре блокера
|
||||
|
||||
Вакансия проходит, если выполнены **все четыре** одновременно.
|
||||
|
||||
### Gate 1 — География / найм
|
||||
Можно нанять одним из:
|
||||
- contractor через Deel / Remote.com из Таиланда, ИЛИ
|
||||
- remote-employee для компании, нанимающей non-US резидентов.
|
||||
|
||||
**Skip если:** location-locked / US-only / UK-only / EOR не покрывает Таиланд и нет contractor-опции.
|
||||
|
||||
### Gate 2 — Таймзона (comp-scaled, не бинарный)
|
||||
Базовое окно гибкости: **9:00–22:00 GMT+7** (полный EMEA overlap, утренний US East). Это предел, до которого можно растягиваться без доплаты за неудобство; комфортный день — 11:00–20:00.
|
||||
|
||||
| Что требует роль | Условие прохождения |
|
||||
|---|---|
|
||||
| Overlap укладывается в 9:00–22:00 GMT+7 | проходит при любом comp ≥ floor |
|
||||
| Overlap выходит за окно (частичное пересечение) | проходит, если **comp > $9k** |
|
||||
| Полный overlap, ночная работа (PST core hours, full US-day) | проходит, если **comp > $10k** |
|
||||
|
||||
**Skip по таймзоне только если:** comp ≤ $9k **И** требуемый overlap выходит за пределы 9:00–22:00 GMT+7.
|
||||
|
||||
### Gate 3 — Compensation
|
||||
| Ярус | Зона | Как рассматриваем |
|
||||
|---|---|---|
|
||||
| Целевая | $8–12k/мес | основная воронка |
|
||||
| Floor | $6–8k/мес | нормальный рабочий нижний порог |
|
||||
| Fallback | $4.5–6k/мес | **только временный мостик**, «если вообще ничего нет». Не основная воронка, штучно и осознанно |
|
||||
| Skip | < $4.5k/мес | отсев |
|
||||
|
||||
Сигналы «ниже floor» без явной вилки: pre-seed без funding visibility + equity-heavy framing + явное «scrappy team». Stretch выше $15k существует для founding-engineer ролей в AI-стартапах Series A–B, но только при реальном матче профиля.
|
||||
|
||||
### Gate 4 — Уровень роли
|
||||
Senior / Staff / Tech Lead / опытный middle+.
|
||||
|
||||
**Skip если:** явный junior / mid без потолка роста.
|
||||
**НЕ skip если:** роль выглядит выше (Lead / Principal / Head) — это сигнал, что внутри такого человека нет, стоит пробовать, особенно если подача быстрая.
|
||||
|
||||
---
|
||||
|
||||
## 3. Классификация трека (после прохождения gate)
|
||||
|
||||
Не отсев, а выбор CV и угла письма.
|
||||
|
||||
| Условие в JD | Трек | CV |
|
||||
|---|---|---|
|
||||
| AI в **must-have** (LLM / agents / MCP / RAG / orchestration / embeddings в core requirements) | **Track A** | CV-A (`cv-2026-05-base.md`) |
|
||||
| Чистый Node.js / backend, AI как nice-to-have / «significant plus» | **Backend-first** | CV-C (`cv-backend-variant-hostinger-2026-05.md`) |
|
||||
| Senior / full-stack / frontend без AI в must-have | **Track B** | CV-B (`oleg_proskurin_fullstack_techlead_cv.md`) |
|
||||
| Senior + AI-tooling fluency как требование (не AI-продукт, а «build with AI assistance») | **Hybrid** | CV-B с AI, поднятым в Skills на 2–3 позицию |
|
||||
|
||||
Russian-speaking scale-ups (Manychat, inDrive, Wheely, Joom, Adapty и подобные) — **по умолчанию Track B**, даже если AI в JD не упомянут.
|
||||
|
||||
Принцип на спорных:
|
||||
- между «Track B» и «skip» → побеждает Track B;
|
||||
- между «Track A» и «Track B» для гибридной JD → есть AI в must-have → A, нет → B.
|
||||
|
||||
---
|
||||
|
||||
## 4. Обработка отсутствующих навыков
|
||||
|
||||
Один отсутствующий навык (Go, конкретный фреймворк, named-инструмент) — **не skip**.
|
||||
|
||||
Но:
|
||||
- **Не флагать явно** в письме. Не строить конструкцию «вот тут у меня гэп / one thing to flag».
|
||||
- **Сначала уточнить у Олега перед подачей:** «в JD просят X, не вижу его в материалах — был ли опыт?» Навык часто есть, просто выпал при тримминге CV (примеры: Redux Toolkit / RTK Query, Vitest, Playwright в `facts-from-salmon-chat.md`; Jest в backend-CV; eCommerce/CMS tail в `cv-master-extended.md`).
|
||||
- Сначала проверяем реальность → потом решаем, как подавать.
|
||||
|
||||
Реальные гэпы, которые можно называть без проверки (из `<profile_scope_and_matching>`): языки вне стека (Go, Rust, Java, C++, Ruby, PHP), heavy DevOps (K8s-оркестрация at scale, SRE), нативный мобайл (Swift, Kotlin). React Native и Python — bridgeable, не гэп.
|
||||
|
||||
---
|
||||
|
||||
## 5. Research-протокол при анализе вакансии
|
||||
|
||||
Дополнительно к чтению самой JD — рекомендуется (особенно для ролей, проходящих gate):
|
||||
|
||||
### 5.1. Поресёрчить саму компанию
|
||||
Что за компания, что делает, продукт, стадия, funding, недавние новости, размер команды, репутация (Glassdoor / Blind где есть). Цель — понять контекст и отсеять ghost / red-flag компании.
|
||||
|
||||
### 5.2. Найти, где ещё выложена эта вакансия
|
||||
Сравнить постинг на разных площадках (careers-page компании, LinkedIn, ATS-ссылка, job-боарды, агрегаторы). Обратить внимание и **консолидировать**:
|
||||
- **Дата постинга** — самое раннее появление. Старый постинг (90+ дней без обновлений) — ghost-сигнал.
|
||||
- **Вилка** — где какая указана. Разные площадки часто дают разные band'ы.
|
||||
- **Гео-ограничения** — где-нибудь указано US Only / UK Only / location-locked / список eligible стран?
|
||||
|
||||
### 5.3. Правило приоритета ограничений
|
||||
**Ограничения трактуются как более актуальная / авторитетная информация.** Если в одном месте «remote», а в другом «US only» — значит берут US only, отсев по Gate 1. Менее ограничительная формулировка побеждает **только** если прямо и явно указано, что ограничение снято / расширено.
|
||||
|
||||
Это согласуется с известным паттерном (`<memory>`, strategy-docs): «100% remote» на LinkedIn engagement-листах надёжно завышает гео-гибкость — всегда проверять hiring-country eligibility до вложения в тейлоринг. Freshteam ATS: SSR отдаёт полный JD независимо от статуса; «not accepting applications» — JS-оверлей, подтверждать активность apply-кнопки в браузере.
|
||||
|
||||
Вся найденная информация консолидируется в один разбор вакансии, не размазывается.
|
||||
|
||||
---
|
||||
|
||||
## 6. Ложные блокеры — НЕ основание для skip
|
||||
|
||||
Системные ошибки триажа, которых избегаем (из `strategy-positioning-tracks-2026.md` раздел 4):
|
||||
|
||||
1. **Роль выглядит senior-heavy** (Lead / Principal / Head) → сигнал «внутри нет такого», пробовать.
|
||||
2. **Один отсутствующий навык** → уточнить у Олега, не skip (см. раздел 4).
|
||||
3. **«Не AI-first компания»** → причина для Track B / Hybrid, не отказ.
|
||||
4. **Поверхностный domain mismatch** → смотрим на технические задачи (orchestration, structured extraction, LLM workflows), не на ярлык индустрии.
|
||||
5. **«Не Russian-speaking scale-up»** → нейтрально, не минус.
|
||||
6. **«Stage / timeline не вписывается в 8 недель»** → влияет на приоритизацию последовательности, не на отсев. Проверять скорость interview-процесса по сигналам.
|
||||
7. **Comp ниже $8k но в floor / fallback** → рассматриваем, особенно если компания стратегическая или роль интересная.
|
||||
8. **Tech-stack mismatch с быстрым ramp** → лиди к подаче, ramp упоминаем честно (но не выпячиваем гэп — см. раздел 4).
|
||||
|
||||
---
|
||||
|
||||
## 7. Operational flow при получении JD
|
||||
|
||||
1. Открыть и прочитать JD (при недоступности URL — halt, не реконструировать из памяти).
|
||||
2. Извлечь за первую минуту: уровень роли, must-have stack, AI-наличие (must / nice / нет), location & timezone constraints, comp-сигналы.
|
||||
3. Прогнать 4 hard-gate (раздел 2). Любой провален → skip с одним объективным критерием.
|
||||
4. Anti-pattern self-check (раздел 6): отсеваю ли по subjective критерию? Да → повысить класс.
|
||||
5. Research-протокол (раздел 5): компания + кросс-площадочная проверка ограничений и вилки.
|
||||
6. Прошли gate → классифицировать трек (раздел 3) + назвать рекомендуемое CV + 2–3 proof-point для письма.
|
||||
7. Missing skills → уточнить у Олега до подачи (раздел 4).
|
||||
8. Выдать консолидированный разбор: роль/компания, фит, трек, strong matches, open questions, найденные ограничения/вилки по площадкам, рекомендация apply/skip.
|
||||
|
||||
---
|
||||
|
||||
## 8. Когда обновлять документ
|
||||
|
||||
- После первого callback / interview / rejection из каждого трека → калибровка proof-point и порогов.
|
||||
- При изменении comp-floor, таймзонного окна или target-зоны Олегом → правка немедленно.
|
||||
- Раз в 4 недели baseline pass — рынок и позиционирование меняются быстро.
|
||||
|
|
@ -6,7 +6,8 @@
|
|||
"type": "module",
|
||||
"scripts": {
|
||||
"pdf": "node scripts/generate-pdf.mjs",
|
||||
"chrome": "bash scripts/launch-chrome.sh &"
|
||||
"chrome": "bash scripts/launch-chrome.sh &",
|
||||
"tg:session": "bash scripts/regen_telegram_session.sh"
|
||||
},
|
||||
"dependencies": {
|
||||
"puppeteer": "^24.37.3"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
#!/usr/bin/env bash
|
||||
# Regenerate Telegram session string via QR login.
|
||||
# Reads TELEGRAM_API_ID / TELEGRAM_API_HASH from the project .env,
|
||||
# then runs the generator from the telegram-mcp install.
|
||||
set -euo pipefail
|
||||
|
||||
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
TELEGRAM_DIR="/projects/my-utils/telegram"
|
||||
|
||||
if [ ! -f "$PROJECT_ROOT/.env" ]; then
|
||||
echo "missing $PROJECT_ROOT/.env" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -a
|
||||
. "$PROJECT_ROOT/.env"
|
||||
set +a
|
||||
|
||||
if [ -z "${TELEGRAM_API_ID:-}" ] || [ -z "${TELEGRAM_API_HASH:-}" ]; then
|
||||
echo "TELEGRAM_API_ID / TELEGRAM_API_HASH missing in $PROJECT_ROOT/.env" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "$TELEGRAM_DIR"
|
||||
exec .venv/bin/python session_string_generator.py --qr "$@"
|
||||
|
|
@ -0,0 +1,169 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Oleg Proskurin — CV — Tangory</title>
|
||||
<link rel="stylesheet" href="/templates/cv-style.css" />
|
||||
</head>
|
||||
<body>
|
||||
<header class="cv-header">
|
||||
<h1 class="name">OLEG PROSKURIN</h1>
|
||||
<p class="role"><strong>Senior Node.js Backend Engineer & Tech Lead</strong></p>
|
||||
<p class="contacts">Remote · GMT+7 (EMEA full overlap, US East AM) · Deel contractor, W-8BEN</p>
|
||||
<p class="contacts">
|
||||
<a href="mailto:usulpro@gmail.com">usulpro@gmail.com</a> ·
|
||||
Telegram <a href="https://t.me/usulpro">@usulpro</a> ·
|
||||
<a href="https://www.linkedin.com/in/oleg-proskurin-76784453/">LinkedIn</a> ·
|
||||
<a href="https://github.com/UsulPro">GitHub</a> ·
|
||||
<a href="https://dev.to/usulpro">Dev.to</a> ·
|
||||
<a href="https://focusreactive.com/blog/author/usulpro/">Blog</a>
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<section class="cv-section">
|
||||
<h2>Summary</h2>
|
||||
<p>
|
||||
Senior Node.js / TypeScript backend engineer and Tech Lead with 9 years of production
|
||||
experience, currently leading the backend and AI generation layer of PrimeUI
|
||||
(<a href="https://primeui.com/">primeui.com</a>, launched Feb 2026): an AI-native code
|
||||
generation platform for professional websites that ships customer-owned Next.js projects.
|
||||
Designed and operated consumer-scale backends on PostgreSQL and the Sanity-based Tipico US
|
||||
platform (75M requests/month, 122 CMS users). Comfortable owning services end-to-end:
|
||||
REST API design, database modeling and optimization, performance tuning, third-party
|
||||
integrations, and AI/LLM orchestration as a first-class backend concern.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section class="cv-section cv-skills">
|
||||
<h2>Skills</h2>
|
||||
<p><strong>Backend & APIs</strong>: TypeScript, Node.js, REST APIs, WebSockets, GraphQL. PostgreSQL, Drizzle ORM, SQL design and query optimization. Schema validation, retry/recovery, streaming responses. Public-API design for cross-host integrations (MCP server, CLI)</p>
|
||||
<p><strong>AI Engineering</strong>: LLM orchestration and guardrails on the backend: multi-model routing (Claude / GPT / Gemini), context engineering, prompt caching (73% Gemini context-cache hit rate), schema validation, retry recovery. Embeddings-based retrieval. MCP: custom server development; cross-host agent integration</p>
|
||||
<p><strong>Commerce & CMS</strong>: Shopify, Shopify Hydrogen, Crystallize, Stripe. Sanity, Storyblok, Contentful, Payload. Content modeling, multi-environment publishing, large-scale migrations</p>
|
||||
<p><strong>Infrastructure & Delivery</strong>: Docker, docker-compose. Vercel, Cloudflare, Serverless & Edge functions. CI/CD pipelines, NPM package publishing. Web performance: Core Web Vitals, Lighthouse, WCAG</p>
|
||||
<p><strong>Full-Stack adjacent</strong>: React, Next.js (App Router, SSR/SSG/ISR), TanStack Start/Router, Vite, Tailwind, shadcn-style design systems</p>
|
||||
</section>
|
||||
|
||||
<section class="cv-section">
|
||||
<h2>Experience</h2>
|
||||
|
||||
<article class="cv-job">
|
||||
<div class="cv-job-header">
|
||||
<span class="company">PixelPoint Ltd.</span>
|
||||
<span class="role">Tech Lead & Senior Full-Stack Engineer, PrimeUI</span>
|
||||
</div>
|
||||
<div class="cv-job-meta">
|
||||
<span>France · Remote</span>
|
||||
<span class="dates">Feb 2025 – Present</span>
|
||||
</div>
|
||||
<p class="cv-job-desc" style="font-style: normal;">
|
||||
PrimeUI (<a href="https://primeui.com/">primeui.com</a>, launched Feb 2026) is an
|
||||
AI-native platform for generating production-ready websites, spanning Studio web app,
|
||||
public API, MCP server, CLI, and code-export pipeline. Sole full-time engineer on the
|
||||
project, owning roughly 70% of platform architecture across all surfaces.
|
||||
</p>
|
||||
<ul>
|
||||
<li><strong>Architected the AI generation layer on the Node.js backend</strong>: multi-model orchestration via Mastra + Vercel AI SDK (10 agents, 17 workflows) with per-task routing across Claude, GPT, and Gemini; embeddings-based component retrieval over 1,555 chunks (OpenAI <code>text-embedding-3-small</code>) with three-tier fallback from exact key to family bucket to semantic search; prompt caching reaching 73% Gemini context-cache hit rate.</li>
|
||||
<li><strong>Public API, code-export pipeline, and CLI</strong>: generates a production-ready Next.js project repo in ~45 seconds, ~1.5 minutes end-to-end from UI Export to a running local project. The generated codebase is customer-owned, shipped as a standard Next.js project, pre-configured for 8 selectable AI coding agents.</li>
|
||||
<li><strong>Built and published <code>@primeuicom/mcp</code> on NPM</strong>: 25 tools that let any external codebase connect to PrimeUI from inside AI coding environments, with cross-host compatibility verified across 6 major coding agents (Claude Code, Cursor, Codex, others).</li>
|
||||
<li><strong>Owned the Node.js server runtime end-to-end</strong>, including WebSocket-based streaming of model responses adapted to UI rendering, schema validation, retry and recovery flows for LLM calls, and third-party API integrations.</li>
|
||||
<li><strong>Drove team AI-tooling adoption</strong>: Claude Code from project start, team transition to Codex ahead of public release. Open-sourced <a href="https://github.com/usulpro/codex-bee">codex-bee</a> and <a href="https://github.com/usulpro/epic-loop">epic-loop</a> as spinoffs.</li>
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
<article class="cv-job">
|
||||
<div class="cv-job-header">
|
||||
<span class="company"><a href="https://focusreactive.com">FocusReactive</a></span>
|
||||
<span class="role">Tech Lead & Senior Software Engineer</span>
|
||||
</div>
|
||||
<div class="cv-job-meta">
|
||||
<span>London · Remote</span>
|
||||
<span class="dates">May 2019 – Feb 2025 (5 yrs 10 mos)</span>
|
||||
</div>
|
||||
<p class="cv-job-desc" style="font-style: normal;">International web consultancy for clients in the US, UK, Europe, and Australia.</p>
|
||||
<ul>
|
||||
<li><strong>Architected the Tipico US backend on Sanity Headless CMS at consumer scale</strong>: 75M requests/month, 122 CMS users, 98 document types, 165K stored documents. 5 publishing environments, 3 datasets, white-label architecture for core + state teams.</li>
|
||||
<li><strong>Built a Claude-based content automation pipeline</strong>: JSON translation flow for 190 country-specific Storyblok pages, integrated into publishing and saving ~1 month of manual work.</li>
|
||||
<li><strong>Led migration of 15 client projects to Headless CMS and commerce platforms</strong> (Sanity, Storyblok, Contentful, Payload, Crystallize, Shopify, Hydrogen), restructuring content models and cutting update cycles from weeks to days.</li>
|
||||
<li><strong>Designed and built CMS-KIT</strong>, an open-source Headless CMS starter and component library used across 15 client projects, cutting kickoff from days to hours and accelerating development by ~30%.</li>
|
||||
<li><strong>Led technical hiring and team development</strong>: designed an assessment mirroring real working conditions, ran 30 interviews leading to 8 hires, mentored new engineers; drove team adoption of Claude.ai for research, content, and codebase analysis from 2024 onwards.</li>
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
<article class="cv-job">
|
||||
<div class="cv-job-header">
|
||||
<span class="company"><a href="https://github.com/GitNation/live-conferences">GitNation</a></span>
|
||||
<span class="role">Senior Software Engineer (Part-time, concurrent)</span>
|
||||
</div>
|
||||
<div class="cv-job-meta">
|
||||
<span>Remote</span>
|
||||
<span class="dates">May 2019 – Feb 2025</span>
|
||||
</div>
|
||||
<p class="cv-job-desc" style="font-style: normal;">Built publishing flow via Slack API and a reusable web framework for conference websites; migrated GitNation conferences to Headless CMS.</p>
|
||||
</article>
|
||||
|
||||
<article class="cv-job">
|
||||
<div class="cv-job-header">
|
||||
<span class="company"><a href="https://osome.com/sg/">Osome</a></span>
|
||||
<span class="role">Frontend Developer</span>
|
||||
</div>
|
||||
<div class="cv-job-meta">
|
||||
<span>Singapore</span>
|
||||
<span class="dates">Jun 2018 – May 2019</span>
|
||||
</div>
|
||||
<p class="cv-job-desc" style="font-style: normal;">Built fuzzy-logic search system and advanced UI animations for the corporate-services platform.</p>
|
||||
</article>
|
||||
|
||||
<article class="cv-job">
|
||||
<div class="cv-job-header">
|
||||
<span class="company"><a href="https://www.skipp.dev">Skipp</a></span>
|
||||
<span class="role">JavaScript Engineer</span>
|
||||
</div>
|
||||
<div class="cv-job-meta">
|
||||
<span>Moscow</span>
|
||||
<span class="dates">Nov 2017 – Jun 2018</span>
|
||||
</div>
|
||||
<p class="cv-job-desc" style="font-style: normal;">B2B marketplace for Skolkovo Innovation Center (100 companies); GraphQL subscriptions for real-time chat.</p>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<section class="cv-section">
|
||||
<h2>Portfolio</h2>
|
||||
<p class="cv-portfolio">
|
||||
<a href="https://primeui.com/">PrimeUI</a>,
|
||||
<a href="https://focusreactive.com/marketfinance-case-study/">MarketFinance</a>,
|
||||
<a href="https://focusreactive.com/sanity-platform-case-study/">Tipico-Platform</a>,
|
||||
<a href="https://www.iwm.org.uk/membership#membershipModal">IWM membership</a>,
|
||||
<a href="https://focusreactive.com/notsoape-case-study/">NotSoApp</a>,
|
||||
<a href="https://focusreactive.com/casino-reviews-case-study/">CasinoReviews</a>,
|
||||
<a href="https://www.vegasslotsonline.com/">VegasSlotsOnLine</a>,
|
||||
<a href="https://www.caleffionline.it/">Caleffy</a>,
|
||||
<a href="https://focusreactive.com/hardhat-case-study/">Hadhat</a>,
|
||||
<a href="https://focusreactive.com/porchlight-case-study/">Porchlight</a>,
|
||||
<a href="https://github.com/GitNation/live-conferences">Gitnation</a>,
|
||||
<a href="https://focusreactive.com/blog/">FocusReactive blog</a>,
|
||||
<a href="https://rnd.sk.ru/lk/main">Skolkovo R&D Market</a>,
|
||||
<a href="https://join.reverse.health/tour/nutrition-monthly-generic-others">Reverse Health</a>,
|
||||
<a href="https://www.firsty.app/">Firsty</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section class="cv-section">
|
||||
<h2>Open Source & Writing</h2>
|
||||
<ul>
|
||||
<li><strong>Storybook</strong>: contributor and steering team member during the 2016–2017 community revival; addon maintainer (storybook-addon-console, <strong>7M NPM downloads</strong>; storybook-addon-material-ui, <strong>18K weekly</strong>).</li>
|
||||
<li><strong>AI developer tooling</strong>: <a href="https://github.com/usulpro/codex-bee">codex-bee</a>, a wrapper for long-running Codex sessions; <a href="https://github.com/usulpro/epic-loop">epic-loop</a>, a Codex skill solving context degradation in long autonomous coding sessions via techlead/engineer role separation and durable epic state.</li>
|
||||
<li><strong>Technical writing</strong>: articles on frontend, Headless CMS, and developer tooling at <a href="https://focusreactive.com/blog/author/usulpro/">FocusReactive blog</a> and <a href="https://dev.to/usulpro">Dev.to</a>.</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section class="cv-section">
|
||||
<h2>Education</h2>
|
||||
<p><strong>Master in Engineering</strong>, Faculty of Electronic Engineering, Moscow Power Engineering University (<a href="https://mpei.ru/lang/en/Pages/default.aspx">MPEI</a>), Russia</p>
|
||||
</section>
|
||||
|
||||
<section class="cv-section">
|
||||
<h2>Languages</h2>
|
||||
<p>English C1 · Russian native</p>
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
# OLEG PROSKURIN
|
||||
**Senior Node.js Backend Engineer & Tech Lead**
|
||||
|
||||
Remote · GMT+7 (EMEA full overlap, US East AM) · Deel contractor, W-8BEN
|
||||
|
||||
usulpro@gmail.com · Telegram @usulpro · [LinkedIn](https://www.linkedin.com/in/oleg-proskurin-76784453/) · [GitHub](https://github.com/UsulPro) · [Dev.to](https://dev.to/usulpro) · [Blog](https://focusreactive.com/blog/author/usulpro/)
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
Senior Node.js / TypeScript backend engineer and Tech Lead with 9 years of production experience, currently leading the backend and AI generation layer of PrimeUI ([primeui.com](https://primeui.com/), launched Feb 2026): an AI-native code generation platform for professional websites that ships customer-owned Next.js projects. Designed and operated consumer-scale backends on PostgreSQL and the Sanity-based Tipico US platform (75M requests/month, 122 CMS users). Comfortable owning services end-to-end: REST API design, database modeling and optimization, performance tuning, third-party integrations, and AI/LLM orchestration as a first-class backend concern.
|
||||
|
||||
---
|
||||
|
||||
## Skills
|
||||
|
||||
**Backend & APIs**: TypeScript, Node.js, REST APIs, WebSockets, GraphQL. PostgreSQL, Drizzle ORM, SQL design and query optimization. Schema validation, retry/recovery, streaming responses. Public-API design for cross-host integrations (MCP server, CLI)
|
||||
|
||||
**AI Engineering**: LLM orchestration and guardrails on the backend: multi-model routing (Claude / GPT / Gemini), context engineering, prompt caching (73% Gemini context-cache hit rate), schema validation, retry recovery. Embeddings-based retrieval. MCP: custom server development; cross-host agent integration
|
||||
|
||||
**Commerce & CMS**: Shopify, Shopify Hydrogen, Crystallize, Stripe. Sanity, Storyblok, Contentful, Payload. Content modeling, multi-environment publishing, large-scale migrations
|
||||
|
||||
**Infrastructure & Delivery**: Docker, docker-compose. Vercel, Cloudflare, Serverless & Edge functions. CI/CD pipelines, NPM package publishing. Web performance: Core Web Vitals, Lighthouse, WCAG
|
||||
|
||||
**Full-Stack adjacent**: React, Next.js (App Router, SSR/SSG/ISR), TanStack Start/Router, Vite, Tailwind, shadcn-style design systems
|
||||
|
||||
---
|
||||
|
||||
## Experience
|
||||
|
||||
### PixelPoint Ltd. — Tech Lead & Senior Full-Stack Engineer, PrimeUI
|
||||
**Feb 2025 – Present** · France · Remote
|
||||
|
||||
PrimeUI ([primeui.com](https://primeui.com/), launched Feb 2026) is an AI-native platform for generating production-ready websites, spanning Studio web app, public API, MCP server, CLI, and code-export pipeline. Sole full-time engineer on the project, owning roughly 70% of platform architecture across all surfaces.
|
||||
|
||||
- **Architected the AI generation layer on the Node.js backend**: multi-model orchestration via Mastra + Vercel AI SDK (10 agents, 17 workflows) with per-task routing across Claude, GPT, and Gemini; embeddings-based component retrieval over 1,555 chunks (OpenAI `text-embedding-3-small`) with three-tier fallback from exact key to family bucket to semantic search; prompt caching reaching 73% Gemini context-cache hit rate.
|
||||
- **Public API, code-export pipeline, and CLI**: generates a production-ready Next.js project repo in ~45 seconds, ~1.5 minutes end-to-end from UI Export to a running local project. The generated codebase is customer-owned, shipped as a standard Next.js project, pre-configured for 8 selectable AI coding agents.
|
||||
- **Built and published `@primeuicom/mcp` on NPM**: 25 tools that let any external codebase connect to PrimeUI from inside AI coding environments, with cross-host compatibility verified across 6 major coding agents (Claude Code, Cursor, Codex, others).
|
||||
- **Owned the Node.js server runtime end-to-end**, including WebSocket-based streaming of model responses adapted to UI rendering, schema validation, retry and recovery flows for LLM calls, and third-party API integrations.
|
||||
- **Drove team AI-tooling adoption**: Claude Code from project start, team transition to Codex ahead of public release. Open-sourced [codex-bee](https://github.com/usulpro/codex-bee) and [epic-loop](https://github.com/usulpro/epic-loop) as spinoffs.
|
||||
|
||||
### [FocusReactive](https://focusreactive.com) — Tech Lead & Senior Software Engineer
|
||||
**May 2019 – Feb 2025** (5 yrs 10 mos) · London · Remote
|
||||
|
||||
International web consultancy for clients in the US, UK, Europe, and Australia.
|
||||
|
||||
- **Architected the Tipico US backend on Sanity Headless CMS at consumer scale**: 75M requests/month, 122 CMS users, 98 document types, 165K stored documents. 5 publishing environments, 3 datasets, white-label architecture for core + state teams.
|
||||
- **Built a Claude-based content automation pipeline**: JSON translation flow for 190 country-specific Storyblok pages, integrated into publishing and saving ~1 month of manual work.
|
||||
- **Led migration of 15 client projects to Headless CMS and commerce platforms** (Sanity, Storyblok, Contentful, Payload, Crystallize, Shopify, Hydrogen), restructuring content models and cutting update cycles from weeks to days.
|
||||
- **Designed and built CMS-KIT**, an open-source Headless CMS starter and component library used across 15 client projects, cutting kickoff from days to hours and accelerating development by ~30%.
|
||||
- **Led technical hiring and team development**: designed an assessment mirroring real working conditions, ran 30 interviews leading to 8 hires, mentored new engineers; drove team adoption of Claude.ai for research, content, and codebase analysis from 2024 onwards.
|
||||
|
||||
### [GitNation](https://github.com/GitNation/live-conferences) — Senior Software Engineer (Part-time, concurrent)
|
||||
**May 2019 – Feb 2025** · Remote
|
||||
Built publishing flow via Slack API and a reusable web framework for conference websites; migrated GitNation conferences to Headless CMS.
|
||||
|
||||
### [Osome](https://osome.com/sg/) — Frontend Developer
|
||||
**Jun 2018 – May 2019** · Singapore
|
||||
Built fuzzy-logic search system and advanced UI animations for the corporate-services platform.
|
||||
|
||||
### [Skipp](https://www.skipp.dev) — JavaScript Engineer
|
||||
**Nov 2017 – Jun 2018** · Moscow
|
||||
B2B marketplace for Skolkovo Innovation Center (100 companies); GraphQL subscriptions for real-time chat.
|
||||
|
||||
---
|
||||
|
||||
## Portfolio
|
||||
|
||||
[PrimeUI](https://primeui.com/), [MarketFinance](https://focusreactive.com/marketfinance-case-study/), [Tipico-Platform](https://focusreactive.com/sanity-platform-case-study/), [IWM membership](https://www.iwm.org.uk/membership#membershipModal), [NotSoApp](https://focusreactive.com/notsoape-case-study/), [CasinoReviews](https://focusreactive.com/casino-reviews-case-study/), [VegasSlotsOnLine](https://www.vegasslotsonline.com/), [Caleffy](https://www.caleffionline.it/), [Hadhat](https://focusreactive.com/hardhat-case-study/), [Porchlight](https://focusreactive.com/porchlight-case-study/), [Gitnation](https://github.com/GitNation/live-conferences), [FocusReactive blog](https://focusreactive.com/blog/), [Skolkovo R&D Market](https://rnd.sk.ru/lk/main), [Reverse Health](https://join.reverse.health/tour/nutrition-monthly-generic-others), [Firsty](https://www.firsty.app/)
|
||||
|
||||
---
|
||||
|
||||
## Open Source & Writing
|
||||
|
||||
- **Storybook**: contributor and steering team member during the 2016–2017 community revival; addon maintainer (storybook-addon-console, **7M NPM downloads**; storybook-addon-material-ui, **18K weekly**).
|
||||
- **AI developer tooling**: [codex-bee](https://github.com/usulpro/codex-bee), a wrapper for long-running Codex sessions; [epic-loop](https://github.com/usulpro/epic-loop), a Codex skill solving context degradation in long autonomous coding sessions via techlead/engineer role separation and durable epic state.
|
||||
- **Technical writing**: articles on frontend, Headless CMS, and developer tooling at [FocusReactive blog](https://focusreactive.com/blog/author/usulpro/) and [Dev.to](https://dev.to/usulpro).
|
||||
|
||||
---
|
||||
|
||||
## Education
|
||||
|
||||
**Master in Engineering**, Faculty of Electronic Engineering, Moscow Power Engineering University ([MPEI](https://mpei.ru/lang/en/Pages/default.aspx)), Russia
|
||||
|
||||
---
|
||||
|
||||
## Languages
|
||||
|
||||
English C1 · Russian native
|
||||
Binary file not shown.
Loading…
Reference in New Issue