[{"data":1,"prerenderedAt":358},["ShallowReactive",2],{"work-\u002Fwork\u002Fvt-academy":3,"work-nav-\u002Fwork\u002Fvt-academy":46},{"id":4,"title":5,"body":6,"description":31,"extension":32,"featured":33,"meta":34,"navigation":33,"order":35,"path":36,"role":37,"seo":38,"status":39,"statusTone":40,"stem":41,"tagline":42,"url":43,"year":44,"__hash__":45},"work\u002Fwork\u002F6.vt-academy.md","vt-academy",{"type":7,"value":8,"toc":27},"minimark",[9,18,21,24],[10,11,12,13,17],"p",{},"Reading about a vulnerability and exploiting one are unrelated skills. vt-academy is\nbuilt on the assumption that the lab ",[14,15,16],"em",{},"is"," the lesson and the writing is supporting\nmaterial.",[10,19,20],{},"Every exercise gives the learner a real, deliberately vulnerable target to attack,\nisolated and disposable. Coding exercises are graded on what they actually produce\nrather than pattern-matched against the source. And because security knowledge decays\nbadly — you learn a class of bug, then do not see it for eight months — the whole thing\nruns on a spaced-repetition schedule that stretches as recall proves reliable and\ncollapses when it does not.",[10,22,23],{},"Ten chapters, from web fundamentals through to AI security.",[10,25,26],{},"Honest status: the platform is well ahead of the content. The labs, grader and review\nscheduler work; the curriculum is still filling in behind them.",{"title":28,"searchDepth":29,"depth":29,"links":30},"",2,[],"Reading about a vulnerability and exploiting one are unrelated skills. vt-academy is\nbuilt on the assumption that the lab is the lesson and the writing is supporting\nmaterial.","md",true,{},6,"\u002Fwork\u002Fvt-academy","Solo build",{"title":5,"description":31},"In development","build","work\u002F6.vt-academy","A hands-on security engineering curriculum built around disposable vulnerable labs rather than video lectures.",null,"2026","20uVUEk-9WAriMkSmQOSKoZ5KDb9mdJKOAIJvlLkQRs",[47,77,106,133,158,186,203,230,257,284,311,334],{"id":48,"title":49,"body":50,"description":54,"extension":32,"featured":33,"meta":66,"navigation":33,"order":67,"path":68,"role":69,"seo":70,"status":71,"statusTone":72,"stem":73,"tagline":74,"url":75,"year":44,"__hash__":76},"work\u002Fwork\u002F1.oky.md","OKY",{"type":7,"value":51,"toc":64},[52,55,58,61],[10,53,54],{},"Phishing defence usually lives inside the mail server, invisible to the person actually\nbeing attacked. OKY puts the verdict where the user already is — in the mail thread, the\nbrowser, the phone — and explains in plain language why something looks wrong. A silent\nfilter teaches nobody anything; a good explanation makes the next attempt easier to spot.",[10,56,57],{},"I built all of it alone: the product, the analysis engine, seven client surfaces across\nfive platforms, and the operations behind them.",[10,59,60],{},"It is live with real users and published on the Chrome Web Store. Early — a small cohort\nrather than scale — and beta is the honest word.",[10,62,63],{},"I do not write publicly about how it decides, what it inspects, or how it is deployed.\nFor a live security product that is just a map for its adversaries. Happy to go deep in\nconversation.",{"title":28,"searchDepth":29,"depth":29,"links":65},[],{},1,"\u002Fwork\u002Foky","Founder & solo developer",{"title":49,"description":54},"Live · Beta","live","work\u002F1.oky","An AI-driven email and messaging security platform that stops phishing, credential theft and impersonation before they reach the inbox.","https:\u002F\u002Foky.ai","gvScMAOoDGKrEYJ_TmnHgUoKAqgsFUmPo2aXINoD1JA",{"id":78,"title":79,"body":80,"description":84,"extension":32,"featured":33,"meta":96,"navigation":33,"order":29,"path":97,"role":98,"seo":99,"status":100,"statusTone":101,"stem":102,"tagline":103,"url":43,"year":104,"__hash__":105},"work\u002Fwork\u002F2.zentro-wallet.md","Zentro Wallet",{"type":7,"value":81,"toc":94},[82,85,88,91],[10,83,84],{},"The largest system I have been responsible for: a wallet holding both fiat and crypto\nbalances, moving money between users, and settling with merchants — around twenty\nservices with web and mobile clients on top.",[10,86,87],{},"I owned the architecture and led the team of seven who built it, while staying hands-on\nin the code and in review.",[10,89,90],{},"The hard part was never any single feature. It was that every feature touches the same\nbalance, and that balance has to stay correct under concurrency, partial failure and\nretry — while fiat and crypto settle on completely different terms, one reversible and\nscheduled, the other irreversible and at nobody's pace. Telling a user \"this is your\nmoney\" honestly across both is a modelling problem long before it is a UI one.",[10,92,93],{},"The product has since been discontinued. Employer work, so there is no repository, no\nscreenshots, and nothing here about its internals.",{"title":28,"searchDepth":29,"depth":29,"links":95},[],{},"\u002Fwork\u002Fzentro-wallet","Architect & team lead — Stratech Corp",{"title":79,"description":84},"Discontinued","archive","work\u002F2.zentro-wallet","A twenty-microservice fiat and crypto wallet platform — top-up, withdrawal, P2P transfer, scan-to-pay and a merchant marketplace, across web and mobile.","2024 — 2026","AQneCUfZyfURG7W69yOGGeKzRBt9Zw440E-c4tk_yPc",{"id":107,"title":108,"body":109,"description":113,"extension":32,"featured":33,"meta":125,"navigation":33,"order":126,"path":127,"role":128,"seo":129,"status":100,"statusTone":101,"stem":130,"tagline":131,"url":43,"year":104,"__hash__":132},"work\u002Fwork\u002F3.juegalo-predictor.md","Juegalo — Predictor",{"type":7,"value":110,"toc":123},[111,114,117,120],[10,112,113],{},"Predictor was a sports-prediction game: players called outcomes ahead of real fixtures\nand were scored against what actually happened. I built it and the partner-programme\nsite alongside it.",[10,115,116],{},"The interesting constraint was live sport. Fixtures move, matches get abandoned, results\nget corrected hours later — and every one of those events has to resolve fairly for\npeople who already committed a prediction. Handling that without either freezing the\ngame or quietly changing someone's result was most of the work.",[10,118,119],{},"It settled at 500–1,500 daily active players before being discontinued.",[10,121,122],{},"Employer work, so there is no code to show and nothing here about its internals.",{"title":28,"searchDepth":29,"depth":29,"links":124},[],{},3,"\u002Fwork\u002Fjuegalo-predictor","Built & maintained — Stratech Corp",{"title":108,"description":113},"work\u002F3.juegalo-predictor","A sports-prediction game that ran at 500–1,500 daily active players, plus the partner-programme site behind it.","FNnRMdM6XdlZIX-JUMo-SynDIbpkCpAspp0DfCmqz24",{"id":134,"title":135,"body":136,"description":140,"extension":32,"featured":33,"meta":149,"navigation":33,"order":150,"path":151,"role":37,"seo":152,"status":153,"statusTone":72,"stem":154,"tagline":155,"url":156,"year":44,"__hash__":157},"work\u002Fwork\u002F4.neon-nights.md","Neon Nights",{"type":7,"value":137,"toc":147},[138,141,144],[10,139,140],{},"Real-money gaming has an unforgiving property: the game is the easy part, and the money\nboundary is where everything actually goes wrong. Networks drop mid-bet, aggregators\nretry, rollbacks arrive for rounds that already settled. If the accounting is not\nprovably correct, the operator eats the difference.",[10,142,143],{},"So I built the whole thing from nothing — game engine, server, and a deliberately\nhostile fake wallet whose entire job is to break it: dropping responses, duplicating\ncallbacks, settling out of order, reversing what the server believes is final. You\ncannot prove fault tolerance by hoping, and you do not get to make a real counterparty\nmisbehave on demand.",[10,145,146],{},"It is playable with play money. A demonstrator rather than a licensed operation — no\nreal money moves through it and it has not been certified.",{"title":28,"searchDepth":29,"depth":29,"links":148},[],{},4,"\u002Fwork\u002Fneon-nights",{"title":135,"description":140},"Playable","work\u002F4.neon-nights","A certifiable slot game server built from scratch — provably fair, money-correct, and stress-tested against a deliberately hostile wallet simulator.","https:\u002F\u002Fneon.vardanov.me","Gqi-imhFuQBtxh9rCF-rj3jFS_JSVQbHnKq2c6uQACc",{"id":159,"title":160,"body":161,"description":165,"extension":32,"featured":33,"meta":178,"navigation":33,"order":179,"path":180,"role":69,"seo":181,"status":182,"statusTone":40,"stem":183,"tagline":184,"url":43,"year":44,"__hash__":185},"work\u002Fwork\u002F5.minishop.md","MiniShop",{"type":7,"value":162,"toc":176},[163,166,169],[10,164,165],{},"MiniShop resells digital goods sourced on demand from overseas marketplaces. The\nstorefront was never the interesting part — payment custody was.",[10,167,168],{},"Buyers fund a balance in crypto, and the server holds no private keys at all. That is a\nstructural guarantee rather than a policy promise: compromising the application does not\ncompromise anyone's funds. I started with a third-party payment processor and removed it\nin favour of settling directly on-chain — fewer intermediaries, no custody, and one less\ncompany able to freeze a balance.",[10,170,171,172,175],{},"The other hard problem was disputes. Buyers speak one language, upstream vendors speak\nanother, and these conversations rarely end with a clean signal — they trail off. An AI\nlayer reads the running thread and judges whether it actually resolved, but what it is\nallowed to ",[14,173,174],{},"do"," with that judgement stays bounded, reversible and logged. An automated\nremediation path is an attack surface if anyone can work out how to trigger it.",{"title":28,"searchDepth":29,"depth":29,"links":177},[],{},5,"\u002Fwork\u002Fminishop",{"title":160,"description":165},"Near production","work\u002F5.minishop","A crypto-settled storefront for imported digital goods, with an AI layer that resolves cross-language vendor disputes.","YlXfZ7-yQmJWG1qEtgutoMqZp3G5bO0jkbHgzAjTfF4",{"id":4,"title":5,"body":187,"description":31,"extension":32,"featured":33,"meta":201,"navigation":33,"order":35,"path":36,"role":37,"seo":202,"status":39,"statusTone":40,"stem":41,"tagline":42,"url":43,"year":44,"__hash__":45},{"type":7,"value":188,"toc":199},[189,193,195,197],[10,190,12,191,17],{},[14,192,16],{},[10,194,20],{},[10,196,23],{},[10,198,26],{},{"title":28,"searchDepth":29,"depth":29,"links":200},[],{},{"title":5,"description":31},{"id":204,"title":205,"body":206,"description":210,"extension":32,"featured":33,"meta":222,"navigation":33,"order":223,"path":224,"role":69,"seo":225,"status":226,"statusTone":40,"stem":227,"tagline":228,"url":43,"year":44,"__hash__":229},"work\u002Fwork\u002F7.amplix.md","Amplix",{"type":7,"value":207,"toc":220},[208,211,214,217],[10,209,210],{},"Amplix automates the genuinely repetitive part of social media management: producing\non-brand content for several brands across several markets, then getting it out on\nschedule.",[10,212,213],{},"The real problem is not scheduling one post — it is keeping distinct brand voices\ncoherent across different regions and channels without a human rewriting everything by\nhand.",[10,215,216],{},"The decision I would defend is putting content generation behind an editable workflow\nrather than hard-coding it. That side of the product changes constantly, and it should\nnot take a deploy to change how a post gets written.",[10,218,219],{},"My second product taken from empty repository to running system alone. An MVP — the\nbackbone, scheduling and publishing work; broader channel coverage does not yet.",{"title":28,"searchDepth":29,"depth":29,"links":221},[],{},7,"\u002Fwork\u002Famplix",{"title":205,"description":210},"MVP","work\u002F7.amplix","AI-powered social media automation — generating, scheduling and publishing on-brand content across multiple brands and markets.","JLXrzAIpBZ8VZ_7kt9OcZcKWouJqlOqN0-MbhzKjYyI",{"id":231,"title":232,"body":233,"description":237,"extension":32,"featured":33,"meta":249,"navigation":33,"order":250,"path":251,"role":37,"seo":252,"status":253,"statusTone":40,"stem":254,"tagline":255,"url":43,"year":44,"__hash__":256},"work\u002Fwork\u002F8.pm-mcp.md","pm-mcp",{"type":7,"value":234,"toc":247},[235,238,241,244],[10,236,237],{},"AI coding agents are amnesiac. Every session starts from zero, so the context that\nmatters — what was decided last week, what is half-finished, what is deliberately\npaused — either gets re-explained or gets lost.",[10,239,240],{},"pm-mcp gives them a project board they can read and write natively, with a live kanban\ndashboard for the human side and a hook that injects the current state into every\nsession automatically.",[10,242,243],{},"The consequential decision was storing the board as plain Markdown files rather than in\na database. A database would have been easier to query and completely wrong: the whole\nvalue is that the board is diffable, versionable alongside the code, and editable by\nhand when the tool is not running.",[10,245,246],{},"It also ships a triage workflow that checks the board against the actual repository,\nbecause boards rot. I use it on my own projects daily, including this website.",{"title":28,"searchDepth":29,"depth":29,"links":248},[],{},8,"\u002Fwork\u002Fpm-mcp",{"title":232,"description":237},"Working tool","work\u002F8.pm-mcp","A single binary that gives AI coding agents persistent project memory — board, dashboard and session hook in one.","cnIDjJaChK7neczTHICqJyNqem7OUIfDoTeiWUE0hFM",{"id":258,"title":259,"body":260,"description":264,"extension":32,"featured":276,"meta":277,"navigation":33,"order":278,"path":279,"role":37,"seo":280,"status":39,"statusTone":40,"stem":281,"tagline":282,"url":43,"year":44,"__hash__":283},"work\u002Fwork\u002F9.compliance-mcp.md","compliance-mcp",{"type":7,"value":261,"toc":274},[262,265,268,271],[10,263,264],{},"When an organisation rolls out AI coding tools, someone has to answer what people are\nactually doing with them — and answer it without shipping the sensitive material\nsomewhere else to find out.",[10,266,267],{},"That constraint is the entire design. The collector makes no external AI calls at all. A\ncompliance tool that forwards the material it is inspecting to a third party has\nrecreated the exact exposure it exists to prevent, so evaluation happens locally and\nhuman judgement stays in the analyst's own session, where the data already is.",[10,269,270],{},"It runs against a mock mode too, so it can be developed and demonstrated without a live\ntenant or any real organisation's data.",[10,272,273],{},"Early: the collection layer works, the rest is designed but unbuilt.",{"title":28,"searchDepth":29,"depth":29,"links":275},[],false,{},9,"\u002Fwork\u002Fcompliance-mcp",{"title":259,"description":264},"work\u002F9.compliance-mcp","A compliance layer for enterprise AI usage that deliberately makes no external AI calls of its own.","bq9rrz7N51y38VfnOoxKKXIkqzz4NC1qCjEbq5TwPcM",{"id":285,"title":286,"body":287,"description":291,"extension":32,"featured":276,"meta":303,"navigation":33,"order":304,"path":305,"role":37,"seo":306,"status":226,"statusTone":40,"stem":307,"tagline":308,"url":43,"year":309,"__hash__":310},"work\u002Fwork\u002F10.qr-driver-connect.md","QR Driver Connect",{"type":7,"value":288,"toc":301},[289,292,295,298],[10,290,291],{},"Blocked someone in? Left your lights on? The usual fix is a phone number on a card\nbehind the windscreen, which hands it permanently to every passer-by.",[10,293,294],{},"QR Driver Connect puts a scannable sticker on the car instead. Scanning it opens a\nchannel to the driver that never exposes the number, and closes again shortly after.",[10,296,297],{},"Built solo, front and back, with native mobile builds for both stores.",[10,299,300],{},"An MVP built to prove the idea end to end rather than a finished product — verification\nis mocked and it was never deployed.",{"title":28,"searchDepth":29,"depth":29,"links":302},[],{},10,"\u002Fwork\u002Fqr-driver-connect",{"title":286,"description":291},"work\u002F10.qr-driver-connect","A QR sticker for your windscreen that lets anyone reach you without ever seeing your phone number.","2025","Kue2vdNWRLKq4Wcd_WgdSWEbarHFmpRwa8sT2jpDO6M",{"id":312,"title":313,"body":314,"description":318,"extension":32,"featured":276,"meta":327,"navigation":33,"order":328,"path":329,"role":37,"seo":330,"status":39,"statusTone":40,"stem":331,"tagline":332,"url":43,"year":44,"__hash__":333},"work\u002Fwork\u002F11.femidai.md","Femid.ai",{"type":7,"value":315,"toc":325},[316,319,322],[10,317,318],{},"A hallucinated citation in legal research is worse than no answer at all, because it is\nan answer a lawyer might rely on. So the whole system is built around a single\nnon-negotiable constraint: every response resolves to a specific statute or decision, or\nit declines to answer.",[10,320,321],{},"That rule is easy to state and expensive to honour. It rules out the fluent,\nconfident-sounding output people now expect from these tools, and it means the system\nsays \"I don't know\" in situations where a less careful product would guess. For\nprofessional use that trade is the entire point.",[10,323,324],{},"In development.",{"title":28,"searchDepth":29,"depth":29,"links":326},[],{},11,"\u002Fwork\u002Ffemidai",{"title":313,"description":318},"work\u002F11.femidai","Legal research for Armenian lawyers, built on one rule — no source, no answer.","hIRH3UmjG7Le-PZJfn8W6pkJC89HklB3XXs6YAO0SB4",{"id":335,"title":336,"body":337,"description":341,"extension":32,"featured":276,"meta":350,"navigation":33,"order":351,"path":352,"role":37,"seo":353,"status":354,"statusTone":101,"stem":355,"tagline":356,"url":43,"year":309,"__hash__":357},"work\u002Fwork\u002F12.droplix-cms.md","Droplix CMS",{"type":7,"value":338,"toc":348},[339,342,345],[10,340,341],{},"Built to scratch a specific itch: most lightweight CMS options treat structured SEO data\nas an afterthought, so it ends up bolted on and inconsistent across a site.",[10,343,344],{},"Droplix models it properly — metadata and structured data are fields on the content\nitself, not an extension. Pages, posts, menus, roles and a live theme customiser sit on\ntop of that.",[10,346,347],{},"An honest prototype. The admin, auth and content APIs work; it was never finished or\ndeployed, and I stopped when the thing I wanted to prove was proven.",{"title":28,"searchDepth":29,"depth":29,"links":349},[],{},12,"\u002Fwork\u002Fdroplix-cms",{"title":336,"description":341},"Prototype","work\u002F12.droplix-cms","A small headless CMS built to treat SEO metadata as a first-class field rather than a plugin.","K_2qWi2u44yS7y78PuYUtniNyq4kOr1_ZoxaH_kSt7Q",1784965943886]