mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully written in Elixir.
What’s that?
Two weeks ago José posted this on X:
People are sleeping on Elixir for a coding harness:
Hot-code swapping allows you to build an extensible plugin system similar to Pi, which reloads live without dropping state
Designing a client-server architecture, similar to OpenCode, is basically a byproduct of the actor model (plus you get both IO/CPU concurrency)
The built-in distribution means you can easily isolate the brains (model + session) from the hands (sandbox + tools). For example, you can the agentic session on your machine which coordinates agents executing inside Docker or a remote node. Or even have one agent session coordinate multiple nodes (this is basically how Livebook works anyway)
Those can definitely be built from scratch in other languages, but in Elixir the building blocks are basically part of the runtime.
I actually was after writing my own harness since Anna Domini, but work on Cure and some other fancy pet projects (spoiler!) delayed me actually starting it. Also, there is still a freaking capitalism all around, and I need to do some boring stuff for a living too.
But two weeks ago it rang a bell. Now or never. I was never satisfied by Anthropic, Warp became too expensive, Gemini is fancy but I hate using Google products. I decided to give DeepSeek a shot.
What’s under the hood?
Well, I just implemented what José twitted (más o menos.) As my followers probably know, I am a strong believer in staic analysis, specifically in agentic era. I started working on language-agnostic static tools a year ago, and besides many others I created ragex which is good enough to be used alone as a harness (unless one needs an enhanced user interaction.) If you have GPU, ragex would benefit from it, because it creates embeddings for AST, instead of delegating this to pure text instruments, aka grep/awk.
For ragex I created dllb which is a database explicitly optimized for storing and querying AST-like structures.
DSH itself is just a CLI, knotting the remote AI model with local static analysis tools.
There is a comprehensive README, go read it if interested.
FAQ
Q. Why it’s not model-agnostic?
A. Well, technically it should be, maybe with tiny changes. Ragex is. But I don’t have any interest in making it work for Anthropic/Google for my own reasons.
Q. What’s the most exiting feature?
A. Approximately 8 hours of heavy work on my other pet project (not fairly complicated but still) cost me $1.12. The same amount of work with Warp would be $20+ approx.
Q. Does it work with PRs/diffs/git?
A. Yes. Natively.
If anyone is interested and/or wants to try, please, you know where to put issues and question. The official AI policy of all my projects is the very same: I accept any PRs, if and only if they are less than 314 LoCs. I do not care if they were created by a human, a model, or a bigfoot. I still review all PRs myself, using my eyes, though.
Here is a screenshot of the response to the question “How Brain/Hands Architecture is implemented in DSH?”
Trending in Announcing
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #security
- #performance











Most Liked- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
AstonJ
Nice - I like DeepSeek
And your thread reminds me we need a glossary so we can add things like
coding harness- so many new terms for newbies to get their head around nowadays…mudasobwa
Well, I don’t use GUI until absolutely necessary, I value my time and I genuinely think GUI would never be as aesthetically lacy and nifty as CLI. I’m still a developer, after all.
I cannot think of any application of such a sentralized server.
mudasobwa
Maybe, once I figure out how to properly do that. Basically, AST-based embeddings are a killer feature alongside with AST-based analysis. It’s incremental and should be very long only once and only on CPU. In the meanwhile you might compile
yokeyourself with custom configs:1. How to Disable Models / Embeddings
• Config Option (
:skip_bumblebee): Setconfig :ragex, skip_bumblebee: trueinyoke’s application configuration. This skips starting bumblebee.ex and vector_store.ex, saving GPU memory and ~500MB+ RAM.• Analysis Option: When running directory analysis or SCIP ingestion, pass
generate_embeddings: false(orskip_embeddings: true).• Automatic Fallback for Light Builds: If ML dependencies (bumblebee, nx, exla) are omitted from the build (e.g. for standalone CLI binaries or
mix escript.build), Ragex automatically detects that BumblebeeEmbeddings.available?() is false and gracefully bypasses vector store startup without crashing.2. Features That Work WITHOUT Models / Embeddings
The majority of Ragex’s code analysis and navigation tools function completely independently of vector embeddings:
• Precise Code Navigation (SCIP): Symbol resolution, go-to-definition, and caller lookup (find_callers).
• Graph & Topology Analysis: Structural graph queries (query_graph), path finding (find_paths), centrality analysis (betweenness_centrality, closeness_centrality), and community detection (detect_communities).
• MetaAST Pattern Search: Cross-language structural AST pattern matching (find_metaast_pattern, metaast_search).
• Code Quality & Code Smell Detection: detect_smells, find_dead_code, analyze_quality, quality_report, coupling_report, find_circular_dependencies.
• Security & Secret Scanning: scan_security, check_secrets, security_audit.
• Git & History Analysis: git_blame, git_history, co_change_analysis, and file watcher auto-reindexing.
• Refactoring & Editing: edit_file, validate_edit, rollback_edit, refactor_code, preview_refactor.
3. Impacted Features:
•
semantic_search: Requires vector embeddings. If embeddings are disabled, calling semantic_search will return a message indicating the embedding model is not active.•
hybrid_search: Combines vector similarity with graph traversal. When running without embeddings, search relies on structural AST lookups (metaast_search)and direct SCIP graph queries instead.
Last Post!
mudasobwa
The interface is being evolved alongside with the new function to perform code reviews.
/reviewcommand makes a code review, then passes all the findings through the human being. You can approve, reject, edit each finding. When you have reviewed the assistant’s review, the results might be published to github with one button.(Yeah, the screenshot is not showing the
/reviewcommand, it’s just a final report of some task.)