Full-stack AI engineer. I build at the seam between LLMs and Solana, and I ship the whole thing: agents, APIs, and the frontend that wraps them.
Right now I am building SolHunt, tooling that helps people recover forgotten SOL, sweep dust, revoke risky approvals, and reclaim rent without giving up custody. I also turn that work into AI agent skills so a model can read wallet health and give plain, actionable advice instead of noise.
Open to full-stack AI engineering roles and small, useful teams.
- Design and ship AI agents (RAG, evals, tool use) that solve real tasks, not toy demos
- Build full-stack apps in TypeScript with React up front and Bun or Node behind
- Ship on Solana: Solidity and Rust programs, wallet tooling, trustless recovery flows
- Automate the boring parts with scheduled agents, MCP servers, and CI
- SolHunt: recover forgotten SOL, sweep dust, reclaim rent, and revoke approvals without custody.
- solhunt-skill: AI agent skill for wallet health checks and approval auditing.
- Yellex: AI pickup-line game built around Solana legends and historical figures.
TypeScript · React / Next.js · Bun / Node · Postgres / Prisma · Solana / Solidity / Rust · Docker · Cloudflare · AWS · GitHub Actions
- X: @solhuntdev
Live, automated full-stack AI engineering micro-lessons. 90 entries, 32-day streak (last: 2026-08-12).
- 2026-08-12: Use a serializable plan object to separate agent reasoning from tool execution
- 2026-08-12: Stream structured tool results to the client as typed events
- 2026-08-12: Compile prompt templates into typed TypeScript functions
- 2026-08-11: Avoid async context leakage by binding task-scoped data to the async call chain
- 2026-08-11: Route each task to the smallest model that meets your quality threshold
- 2026-08-10: Offload CPU-bound work in async agent loops to a dedicated thread pool
- 2026-08-10: Set per-call LLM timeouts that respect your total request budget and fail fast on slow providers
- 2026-08-10: Validate structured LLM output with a schema gate and retry on failure
- 2026-08-09: Prompt versioning with git-style diffs catches regressions before deploy
- 2026-08-09: Stream LLM responses with an AbortController so the client can cancel mid-flight
- 2026-08-09: Structured concurrency with task groups prevents leaked agent tasks
- 2026-08-08: Version prompt templates and log the rendered prompt so evals can reproduce exact model inputs
- 2026-08-08: Trace ID Propagation Across Async Boundaries
- 2026-08-07: Attach a unique request ID to every LLM call to correlate retries, timeouts, and cost
- 2026-08-07: Rate limits are contracts not suggestions
- 2026-08-07: Request-scoped caches dedupe identical in-flight LLM calls
- 2026-08-06: Request-scoped context with contextvars propagates trace IDs across async boundaries
- 2026-08-06: Idempotent webhook handlers with a dedupe key prevent duplicate processing when retries arrive out of order
- 2026-08-05: Deterministic agent replay lets you re-run a failed session with the exact same LLM outputs to debug without burning tokens or hitting rate limits
- 2026-08-05: An eval harness that runs on every PR catches agent regressions before they reach production
- 2026-08-04: Batch database writes from agent tool calls into a single transaction to reduce round trips and avoid partial commits on failure
- 2026-08-04: Store the raw LLM response alongside the parsed output so evals can catch parsing drift without re-running the model
- 2026-08-04: Fan out independent LLM calls with a bounded semaphore and collect results in order
- 2026-08-03: Propagate trace IDs and user identity through async call chains with a request-scoped context
- 2026-08-03: Use Postgres advisory locks to coordinate distributed agent workers
- 2026-08-02: A circuit breaker around external API calls in agent tools prevents cascade failures when a downstream service degrades
- 2026-08-02: A typed event bus lets you observe agent behavior without coupling instrumentation to business logic
- 2026-08-02: Eval-driven prompt iteration beats manual tuning
- 2026-08-01: Prefetch and cache embeddings for known query patterns
- 2026-08-01: Stream partial tool-call results to the client instead of buffering everything
- 2026-08-01: Structured error envelopes make agent failures debuggable
- 2026-07-31: Agent checkpointing
- 2026-07-30: Structured logging with correlation IDs traces a request across service boundaries
- 2026-07-30: Bounded concurrency for parallel tool execution prevents resource exhaustion
- 2026-07-30: Backpressure on LLM token streams keeps memory bounded
- 2026-07-29: Graceful degradation keeps your agent useful when the primary LLM provider degrades
- 2026-07-29: Handle partial tool-call failures with compensating actions
- 2026-07-29: Execute independent tool calls in parallel to reduce agent loop latency
- 2026-07-28: Optimistic UI Updates with Server Reconciliation for Chat
- 2026-07-28: Use a Typed Tool Layer So Agents Never Guess a Schema
- 2026-07-27: Prefill the Assistant Message to Steer JSON Output Reliably
- 2026-07-27: Stream partial tool-call results to the client instead of buffering the full response
- 2026-07-27: Register Tool Schemas at Startup and Validate Every Agent Call Against Them
- 2026-07-26: Use a Request-Scoped Dedupe Cache for Identical In-Flight LLM Calls
- 2026-07-26: Stream Tool-Call Results to the Client Instead of Buffering the Full Response
- 2026-07-26: Run Async LLM Calls in Batches with a Bounded Semaphore
- 2026-07-25: Validate Tool-Call Arguments Against a JSON Schema Before Execution
- 2026-07-25: Prefill the Assistant Message to Steer JSON Output Reliably
- 2026-07-25: Batch LLM Calls with a Bounded Semaphore
- 2026-07-24: Circuit Breaker for LLM Provider Failures
- 2026-07-24: Structured Output Validation with Pydantic and Retry Logic
- 2026-07-23: Rate-limit LLM calls per user with a token bucket
- 2026-07-23: Semantic caching cuts LLM costs for near-duplicate prompts
- 2026-07-23: Token budgets keep agent loops from spiraling
- 2026-07-22: Validate structured LLM output with a strict schema before it reaches your database
- 2026-07-22: Use a request-scoped cache to deduplicate identical LLM calls within a single user request
- 2026-07-21: Stream partial JSON from LLMs with a tolerant parser so the UI updates token by token
- 2026-07-21: Coalesce identical in-flight LLM requests to share one upstream call
- 2026-07-21: Stream tool-call results to the client instead of buffering the full response
- 2026-07-20: Eval-driven prompt design beats prompt engineering by feel
- 2026-07-20: Stream tool-call results to the client instead of buffering the full response
- 2026-07-19: Ship a typed tool layer so agents never guess a schema
- 2026-07-19: Keep your RAG retriever honest with a score floor
- 2026-07-18: Backend idempotency keys stop duplicate writes from retries
- 2026-07-18: Cache your LLM responses at the edge to cut cost and latency
- 2026-07-17: Design idempotent webhook handlers with a dedupe key
- 2026-07-17: Backend idempotency keys stop duplicate writes under retry storms
- 2026-07-17: Gzip your server-sent-event stream, or you pay 10x for tokens you never read
- 2026-07-16: Cache LLM tool-call schemas at the gateway, not per request
- 2026-07-16: Backpressure saves your LLM service when a downstream API throttles you
- 2026-07-16: Colocate compute with data to avoid shipping rows you never render
- 2026-07-15: A prompt cache turns repeat questions into instant, free hits
- 2026-07-15: Constrain LLM output with a JSON schema instead of parsing prose
- 2026-07-15: Order a composite Postgres index to match your query shape
- 2026-07-14: Bounded concurrency beats Promise.all for LLM batches
- 2026-07-14: Idempotency keys keep LLM retries from double-firing
- 2026-07-14: Deduplicate near-duplicate chunks before embedding to cut RAG cost and retrieval noise
- 2026-07-13: Retry LLM calls with jittered exponential backoff, not fixed sleeps
- 2026-07-13: Cut LLM cost and latency with prompt caching
- 2026-07-13: Make agent tool calls idempotent with a deterministic key
- 2026-07-12: Idempotent API endpoints with an idempotency key
- 2026-07-12: Streaming LLM tokens to the browser with the Fetch API
Updated automatically every 8 hours. Full archive in the entries folder.


