Software

2 projects
Screenshot of Shadowstage app.shadowstage.io ↗

Shadowstage

Most tools that claim to give you "API visibility" quietly depend on one of two things: you changing your code (SDKs, agents, middleware), or you routing traffic through a proxy or gateway. Both have the same blind spot — the encrypted, internal, service-to-service traffic that never touches the edge. That's exactly the traffic that matters most, and it's exactly what nobody can see.

ShadowStage takes a different approach. Using eBPF, it observes traffic from inside the kernel: syscall tracepoints capture plaintext sockets, and uprobes on the TLS library capture HTTPS/gRPC after it's decrypted and before it's encrypted — the plaintext, at the boundary, without ever terminating the connection. A shared kernel map coordinates the two so nothing is double-captured. The result is a faithful, language-agnostic view of what your services actually said to each other — with no proxy in the data path, no certificate to install, and not a single line of application code changed.

From that capture layer, ShadowStage reconstructs protocol-aware messages (HTTP/1, HTTP/2 with stream multiplexing, MySQL, WebSocket, and more), stores them in a compact format, and streams them to a backend. The longer-term vision builds on this foundation: replay captured production traffic against a new build, and diff the behavior to catch regressions that tests and canaries miss — turning passive visibility into a way to verify that a change did what it was supposed to.

  • Go
  • C
  • eBPF
  • cilium/ebpf
  • CO-RE/BTF
  • clang/LLVM
  • OpenSSL uprobes
  • XDP
  • gopacket
  • gRPC
  • Protocol Buffers
  • msgpack
  • zstd
  • Amazon S3
  • MinIO
  • Prometheus
  • Grafana
  • MySQL
  • Ruby on Rails
  • Hotwire
  • Docker
  • Kubernetes
  • Kamal
Screenshot of ChessMade

ChessMade

ChessMade is a chess analytics platform that answers the question every improving player asks: "why do I keep losing?" Instead of generic puzzles or one-off engine reviews, it mines a player's entire game history for recurring, fixable patterns — then closes the loop with personalized training.

The system imports a player's complete archive from the Chess.com public API and runs every move through an analysis pipeline backed by a Stockfish evaluation pool. Each half-move is distilled into a 120+ dimension feature vector — engine eval and eval drop, material balance, tactical motifs, king safety, pawn structure, game phase, and clock usage. On top of these vectors, the platform runs two complementary diagnostic layers: a suite of deterministic weakness detectors (15 named patterns like poor conversion of winning positions or time-pressure collapses, each backed by concrete example moves), and unsupervised KMeans clustering that groups lost games into phase-stratified "loss patterns" — each cluster reduced to a 19-feature fingerprint and rendered as a plain-English diagnosis with representative games.

Diagnostics feed a full training loop rather than a static report. Blunders become spaced-repetition puzzles drawn from the player's own games. An "engine practice" mode drops players back into positions where they squandered a winning advantage and makes them convert it against a rating-calibrated Stockfish. An opening trainer builds a repertoire tree from the player's actual games, annotated with engine best moves, Lichess masters-database statistics, and ECO book theory, with per-position miss tracking. Finally, an LLM layer (OpenAI or Anthropic, behind a provider abstraction) composes the structured findings — weakness reports, cluster stats, rating trends, example positions — into a written coaching report with prioritized action items. Notably, LLMs are used only for prose generation; every diagnostic claim comes from deterministic analysis, so the coaching never hallucinates a weakness.

  • Ruby on Rails 8
  • MySQL
  • Redis
  • Sidekiq
  • Hotwire (Turbo + Stimulus)
  • Python
  • FastAPI
  • Stockfish
  • scikit-learn
  • OpenAI/Anthropic APIs
  • Docker