NURDISM.DEV
BIOS v20.26 · PHOSPHOR OK
▶ CLICK TO START
>set display
PHOSPHOR
MODE
BOOT SCREEN
SOUND

CRAIG
BETTERLY

Full-stack web engineer. Self-taught, been at it 15 years.
CONNECTION ESTABLISHED_
Open to work right now
I build web applications end to end. The TypeScript front end, the API behind it, the Postgres underneath, and the deploy that ships it. I was a senior software developer at Cyfrin until July. Right now I'm looking.
Craig working at the bench under a lamp
FIG. 00 · AT THE BENCH
Work
Roles · 2013→2026
cygent.dev homepage
01 · 2026 · PLATFORM
Cygent, and the multi-tenant platform behind it
A security reviewer that only lives in its own web app gets opened twice and forgotten. Cygent reads smart-contract codebases, finds the vulnerabilities, writes the fix and opens the PR, so it had to answer wherever the review already happens: GitHub, Slack, Discord, Telegram, and whatever MCP client someone turns up with. Five wire formats and five ways to fail, against one set of service contracts. Customer code raised the bar again, so every team got an isolated environment with its own compute, services and data boundaries instead of a shared tenant and a WHERE clause. I built and operated that platform. It launched in April 2026 and it is live. In July, Cyfrin laid off the engineering team and took the company a different direction, so I handed it over still running.
LAUNCHED APR 2026 · LIVE · CYGENT.DEV ↗
02 · 2026 · APP + CHAIN
BattleChain, a bridge portal and the chain under it
A game economy needs a chain of its own and a way to move tokens on and off it, and neither exists until someone stands both up. I shipped the portal, a Vue and TypeScript bridge and token manager, plus the block explorer and its deploy pipeline. Standing the chain up underneath meant reading enough of the sequencer to find a bug, and that fix went upstream into ZKsync OS. Testnet was live seven weeks after my first commit.
TESTNET MAR 2026 · UPSTREAM PR ↗
BattleChain block explorer
Cyfrin Updraft
03 · 2025 · WEB PLATFORM
A year inside Updraft and the Cyfrin platform
Updraft teaches 200,000+ people to write secure smart contracts, and past a certain size you cannot tell a learner anything without a system deciding who actually needs to hear it. I built the backend APIs and the notification system behind that, wrote Svelte on the front end, and ran the infra and deployments across Updraft, CodeHawks and Solodit. Docker images, Coolify pipelines, devcontainers. I hit two bugs in Coolify on the way through and fixed those too, both merged upstream.
200K+ STUDENTS · UPDRAFT ↗
04 · 2020–23 · CTO
CLOSEM, a CRM that did the following-up for you
Small businesses lose deals to silence. Nobody called back on Tuesday, the lead went cold, and no one found out until the quarter was over. CLOSEM did the following-up instead, on every channel a small business actually uses: SMS and MMS, email, voice, physical mail, appointments, contact validation, and a Zapier-style layer so it hooked into whatever they already ran. Queue-driven against a dozen third-party APIs that each fail differently, which is the part that decides whether a system like this is trusted or quietly ignored. Three years as CTO. I built the platform and ran the engineering team.
FEB 2020 – MAY 2023 · NAMED IN THE SEC FORM C
ROLE RECORD · CLOSEM.AI
ROLE
Chief Technology Officer
SPAN
Feb 2020 → May 2023
BUILT
Full CRM · omni-channel follow-up · appointments · contact validation · integrations
TEAM
Engineering, led
ROLE RECORD · YADA YADA MARKETING
ROLE
Web designer / developer
SPAN
Jan 2013 → Jan 2022
RAN
50+ WordPress sites
BUILT
Landing pages · funnels · campaign integrations
05 · 2013–22 · AGENCY
The technical half of a marketing firm
Campaign people describe what they want, which is rarely the thing they need, and somebody has to sit in the room and work out the difference. For nine years at the family firm in Tampa I was that somebody and the half of it that wrote code. 50+ WordPress sites to keep online, plus the custom pieces the campaigns actually ran on: landing pages, funnels, and whatever had to talk to whatever else. Most of the job was fixing things I didn't build, which turned out to be the useful part and is still how I read an unfamiliar codebase fast.
JAN 2013 – JAN 2022 · TAMPA, FL
Products
Real users, real constraints, and what happened after
A knurled knob modeled in NekoCAD, with the cat mascot in the corner of the viewport
FIG. 01 · NEKOCAD, EARLY ACCESS
FOUNDER · NEKOCAD LLC · 2026 → NOW
NekoCAD
Makers who outgrow Tinkercad end up picking between a subscription, a cloud account, or FreeCAD's learning curve. NekoCAD is parametric CAD for them: sketch, constrain, extrude, assemble with mates, then hand the part to the printer with resin and FDM supports built in. Buy it once, it works offline, and the files stay on your disk. A Rust engine and OpenCascade compiled to WebAssembly, one app in Electron and the browser, and a Laravel site that sells the licenses. The proof of concept took a day. The rest I built with LLM agents writing most of the code, which moved my job to planning the work and checking what came back.
It is also the first company I've set up from nothing: its own LLC and bank account, a dedicated server, a self-hosted CI runner that builds and signs the Windows installer from Linux, and a store on the roadmap where makers sell the things they design.
2,184 commits
~480K lines of Rust, TS, PHP
Dec 2 launch
OPEN SOURCE · 2020
neko
I wanted to watch anime with my friends and nothing out there did it properly, so I put a Linux desktop in a Docker container and streamed it over WebRTC, with everyone able to take turns driving. Go and pion, hand-rolled GStreamer cgo bindings, Vue client. Sixteen days from the first commit to v1.0.0. I handed it to the community in 2021 and it has grown about 10× past where I left it, which is the right ending for a tool like this and not one I had any part in.
"Neko seriously feels like magic the first time you run it." SEAN DUBOIS, CREATOR OF PION, POSTING IT TO SHOW HN HIMSELF
21,361★ community fork
145,118 Docker pulls
16 days to v1.0.0
Moe the tabby cat
FIG. 02 · MOE, CHIEF MORALE OFFICER, PROJECT NAMESAKE
ticketeer.bot homepage
FIG. 03 · TICKETEER.BOT, LIVE · 4.31/5 ON TOP.GG
FOUNDER · 2021 → NOW
Ticketeer
Every Discord community past a certain size ends up doing support in DMs, where nobody else on staff can see it and the thread dies the moment whoever was handling it goes to bed. Ticketeer turns that into tickets with a transcript nobody had to screenshot. Forms, a message editor, analytics and premium tiers on Laravel and Vue in Docker, sole engineer, five years in production. The transcripts render Discord-flavored markdown properly, which sounds like a small thing until you try it, and it is the most common reason people upgrade.
726 → 4,200+ communities since '24
3.4M+ users
337K+ tickets
Projects
Side projects, tools, and what comes off the bench
Three sixish app screens: the event feed, an event detail for a wheel-throwing class showing seats taken, and the table card listing who is coming tonight
LARAVEL · EXPO · POSTGRES · STRIPE · IN DEV
sixish
Every app for meeting people locally is a grid of faces to scroll, and nobody ever leaves the house. sixish is a social club instead, four to eight people at a real table, with no browsing in it at all. Staff approve an event, the app opens the seats, and four hours before it starts the chat opens and you find out who else is coming.
A Laravel API and Filament console, an Expo app, and two Cloudflare Workers, built solo on my own time. Most of the interesting work is attendance: a seat holds $13.50 and costs $3.50 if you turn up, and the class that decides whether you did needs two of three weak signals to agree before it touches a card. Nine sprints in, opening in Tampa Bay.
hackceptor kiosk in hand, Add machine credit screen for the Tampa Hackerspace bill acceptor
HARDWARE + WEB · ESP32-P4 · NUXT · STRIPE
hackceptor
The vending machine at Tampa Hackerspace only took cash, so I built it a card reader. Scan a QR, pay by card, and a kiosk pulses the "$1 accepted" line into the bill acceptor through an opto-isolator.
grit engine sandbox: lava pouring along the top of the map while the word Friends, drawn in sand, comes apart
RUST · WGPU · MULTIPLAYER · IN DEV
grit engine
A multiplayer combat falling sand game in Rust, and a passion project I've been at on and off for years. Noita's simulated pixels, ROUNDS' stacking cards, Soldat's multiplayer. 16 players on a map that's simulated per pixel, so terrain falls, liquids flow, and an explosion takes a bite out of whatever was in the way. 34 materials and 44 reactions so far.
Most of the work right now is the sandbox. It has a control for every engine constant and writes them back to a toml, so when I find a number that feels right it stays found. This is the second attempt, the first got to 18,400 lines of Rust without any gameplay in it, so I kept the design and started the code over.
esp_sand_sim on the round ESP32-S3 AMOLED: an hourglass scene with sand pouring through the neck
FIRMWARE · C · ESP-IDF · QSPI AMOLED
esp_sand_sim
Falling sand on a round 466×466 AMOLED. Twelve materials sorted by density, and that ordering is the physics, a cell moves into any neighbour holding something lighter than it is. Tilt the board and the sand pours toward the low edge, touch the glass to paint, set the wood on fire.
No LVGL, and no framebuffer in PSRAM either. It paints a band at a time out of internal DMA memory and only pushes the rows that actually changed. Scenes come in as PNGs over USB, which is where the hourglass came from.
esp_radar in hand
FIRMWARE · C · ESP-IDF · LVGL
esp_radar
A live flight radar for my desk. A round ESP32-S3 display plotting real ADS-B aircraft on an ATC-style scope. I ended up writing the drivers myself, and sent some of that work upstream to Espressif.
libpyro transmitter internals: RF board, Pi Zero, and battery in a 3D-printed enclosure
OPEN SOURCE · PYROTECHNICS · LIBPYRO
Fireworks show control
I rewrote the show editor and the timeline in BackyardHero and got it merged. libpyro is the open-source side of it, ignition systems and my own transmitter, currently coming off SolidWorks and onto the bench.
Antweight battle bot
ROBOTICS · SOLIDWORKS · TEAM LEAD
Battle bots · Tampa Hackerspace
I lead the robotics team. Current build is an antweight, CAD the whole way through to combat. It weighed in at 452.76 g against a 453.59 limit, which was closer than I'd have liked.
Skills
Web first, then whatever the problem needed
"Web is where I live. The rest of it is there because a web app doesn't stop at the browser, and somebody has to follow the bug the rest of the way down."
Toolkit · top rows are the day job
LANGUAGES
TypeScriptJavaScriptHTML/CSS · SASSPHPSQLGoPython (intermediate)BashRust (intermediate)C (intermediate)
FRONT-END
VueNuxtSvelteReact (intermediate)ElectronTailwindViteLVGL (intermediate)
BACKEND & DATA
Node.jsFastifyLaravelGraphQL · Apollo (intermediate)PostgreSQLMySQLRedisTypeORMDrizzleWebSocketsWebRTC · pionGStreamer (intermediate)StripeTwilio
INFRA & OPS
Docker · ComposeCoolifyAWSAzureVercelCloudflareTailscaleHeadscalegitGitHub ActionsGitLab CIDatadogSentrydevcontainersshell scriptingNginx / reverse proxiesWordPress ops
AI TOOLING
MCP serversAgent workflowsLLM APIs
GAMES & MODDING
Garry's Mod · GLuas&boxArma · SQFMinecraft · ForgeEnfusionRCON toolingGodot
HARDWARE & CAD
ESP-IDFESP32 · S3 · P4ArduinoI2C · SPI · I2S · QSPISolidWorksBlender
MERGED UPSTREAM · I FIX THE TOOLS I USE
discord.js '17nuxt/awesome '18TypeORM '21Vuelidate '22–23unplugin-vue-components '22modeltyper ×3 '23laravel/vite-plugin '23Coolify ×2 '25ZKsync OS '26BackyardHero ×2 '26
Timeline
How I got here
early '00s
Grew up in my dad's computer repair shop. First code at 14, PHP and VB.NET, and I dropped out to do it full-time. Sysadmin by my late teens.
2007
Became the technical half of Yada Yada Marketing, the family firm. 50+ WordPress sites and the products behind them. Their About page called me "the geek king," which I never asked them to take down.
2017–19
First PR into discord.js. Minecraft modpacks on CurseForge, Farmers Market got to 17.8K downloads. Dockerized Arma servers before that was a normal thing to do. Shipped battleye and nuxtjs-electron.
2020
Built neko, sixteen days to v1.0.0, and Pion's creator posted it to Show HN himself. Became CTO at CLOSEM, built the CRM platform, led the team.
2021–24
Launched Ticketeer. Handed neko over to the community, where it's since gotten about 10× bigger than I left it, which is the right outcome. Ticketeer grew into a full SaaS. Started libpyro.
2025–26
Joined Cyfrin. Updraft backend and notifications first, then the BattleChain L2 and the Cygent platform. PRs merged into Coolify, ZKsync OS, Espressif. Wrapped up in July 2026.
now
Open to work, looking for full-stack web. Launching NekoCAD, CAD for makers, under its own LLC. Building sixish, a social club for small local meetups, opening in Tampa Bay. Leading the robotics team at Tampa Hackerspace, still at the grit engine, and learning pottery, which I am not good at.
SEND ME A MESSAGE
Full-stack web work is what I'm after. Product engineering, the API and data layer behind it, and owning a feature all the way to production. If the problem runs deeper than the app, I can follow it there too.
I'm human
Spam check by Turnstile
All fields required