Yoke - the DeepSeek Harness (former DSH)

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?”

15 Likes

Nice - I like DeepSeek :whale:

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…

2 Likes

WOW! this is amazing dude, you dont know how happy this had made me, I was thinking of trying to realize something like this, but I lack the technical prowess, so I will be reading your code this evening. I really like the AST thing and I was thinking could one use it for prompt caching gains

So got around to setting things up, im confused why v3 and not v4? is this a typo?

It would help to answer if you drop a hint what are you referring to.

Deepseek model?

I havent dug in yet, but is this a client/server model or do you spin up a full instance per session?

If its client/server, a ui that lets you work on multiple folders would be rad.

The harness is built around the DeepSeek API (api.deepseek.com), and the model is just a string sent in the API request body ("model" => config.model in deep_seek_api.ex). There is no hard validation — the harness will happily send any model string to the API. However, there is a hardcoded alias table in the /model slash command (repl.ex).

Harness means it’s a client. By multiple folders you mean several directories outside of the umbrella? Like /foo/bar and /zoo/zar? It’s not so hard to add, but I doubt I want to do that, because it would break the clarity: now dllb database is located at the known place within the project directory and can even be version controlled if desired.

I have stopped using clis and use only desktop apps, so going back to cli feels like the stone age, thats the main reason I asked.

Also multi agent coordination in a centralized server world where each thread/folder is a client would be nice too

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.

1 Like

In you documentation you mention deepseek v3 and composer, I was wondering why the old models instead of v4 and v4 flash

The harness obviously works with all the models provided by DeepSeek transparently, the model is just another string parameter passed to their API.

Im wording my question in a roundabout way, I assumed you found some way to supercharge the old models intelligence with your harness, now I see its just a default choice and that v3 doesnt have magical properties thanks to the elixir fork of the harness

To some extent I did, actually. The harness drastically decreases the needed number of frictions and interactions, so I am good with v3 most of the time.

1 Like

Nice, but not sure whether you have seen this GitHub - deepseek-ai/deepseek-harness: DeepSeek Harness: Everything is a Plugin. · GitHub

I am not sure what this project has in common with mine, save for words “DeepSeek” and “Harness.”

A post was split to a new topic: Do we need a glossary section for all the new lingo?

Well, that’s a pretty significant similarity. I almost skipped your post because I thought it was the same harness from DeepSeek that I looked at last week. Both projects also use the same acronym, DSH. It might be worth considering a name change to avoid confusion. That said, it looks pretty interesting.

Is it hard to make this work with OpenRouter? How commited are you to having this only work with the DeepSeek API?

I would second the advice to change the name. If it does catch on that will become an issue at some point.

If you don’t have another name you like, maybe we could brain storm some ideas and help out?

AFAIK this is why it’s not model agnostic but maybe I missed anywhere in this thread where we’re heading into a different direction

1 Like