01 The problem, and why "just use an API" wasn't the answer
Commercial LLMs are brilliant and borrowed: your prompts leave the building, your assistant lives in someone else's pricing tier, and nothing runs when the internet doesn't. I wanted an assistant that lives on my desk, answers in milliseconds, knows nothing leaves the room, and keeps working during power-cut-induced network blackouts. That constraint set points exactly one direction: small models, local hardware.
The stakeholders here are unusual but real:
- Me, as the user, an assistant that handles reminders, timers, Q&A, IoT toggles, and tool routing without phoning home.
- Developers like me, who want a compact coding model specialized for TypeScript backend work, inspectable and Apache 2.0 licensed.
- The edge itself, Raspberry Pis and old desktops deserve useful AI without 24GB VRAM.
02 My role
Sole researcher-engineer. Dataset collection and curation, tokenizer strategy, training-loop implementation in PyTorch, evaluation harnesses, and deployment packaging, the full pipeline from raw text to a model with a job. This is research discipline applied to product instincts: every experiment logged, every checkpoint versioned, every failure kept as evidence.
03 Why BitNet for Vini, and not for Tini
BitNet b1.58 quantizes weights to three values, −1, 0, +1, replacing most multiplications with additions. The payoff is brutal efficiency: dramatically smaller memory footprint and energy-per-token, which is precisely the currency of edge devices. For an assistant meant to live on a Raspberry Pi, ternary weights aren't a compromise, they're the enabling technology. Tini took the other road: a dense transformer (RoPE, RMSNorm, SwiGLU, grouped-query attention), because code quality at ~85M parameters needed every bit of precision it could get.
04 Training them
- Vini (the assistant): pretrained on ~1.05B tokens (FineWeb-Edu, StarCoder TypeScript and Dart, tool traces, OpenHermes) for ~17.6h on a single L4, then curriculum-staged instruction data for chat, IoT commands, and tool routing, built one verified batch at a time, because an assistant's real skill is deciding which tool.
- Tini (the coder): ~257k cleaned TypeScript samples from The Stack, with MinHash dedupe and secret scrubbing, a 32k SentencePiece tokenizer, and 15 epochs on a T4 for ~46h. Validation loss fell from 2.07 to 1.31.
- Evaluation: qualitative probes and loss tracking. The gap, no pass@k and no task-level benchmark, is the main lesson carried into v2.
05 Shipping it
Vini's model card and training configs are public at jayptl-rq/vini-pico on my Hugging Face profile. Tini's weights are not public yet. Vini was designed to plug into my self-hosted stack: Ollama-based local inference, n8n workflows with MCP connectors for tool calls, and Qdrant vector storage for retrieval over my own corpora. Both v1 models are now retired on purpose. Their postmortems, dense-first architecture, instruction-tuning gates, real evals, drive the multi-expert rebuild.
06 What it proves
- ML engineering beyond API consumption: tokenizers, training loops, quantization-aware training, and architecture choices, owned end to end.
- Open-source contribution with real hygiene: license, docs, reproducibility artifacts.
- Systems thinking across the full AI stack, training, serving (FastAPI/Hono), orchestration (n8n + MCP), and retrieval (Qdrant/Chroma).
- Judgment about trade-offs: knowing when 1.58-bit ternary weights earn their place, and when they don't.
07 What I learned
Data quality beats architecture cleverness more often than Twitter admits. Evaluation is the actual product, a model without a benchmark you trust is a vibe. And there's something clarifying about hardware limits: when your model has to fit on a board the size of a credit card, every design choice becomes honest. So do the results: ~50M ternary parameters on ~1B tokens is not a fluent assistant, which is exactly why the rebuild starts dense.
