One inference engine per model, Metal only, forked from antirez/ds4 (DwarfStar).
ds4 runs several large open models on several backends from one codebase. It
is excellent and it is also a lot to hold in your head. StarForge produces
children: full forks of ds4 reduced to one model on Apple Metal, each
a normal GitHub repo you can build, read and modify without the other models
and backends in the way. Children keep merging upstream through plain git merge, so fixes and speedups from ds4 keep flowing in.
| Child | Model | Binary | Server port | Speculative decoding |
|---|---|---|---|---|
sf-ds4flash | DeepSeek V4 Flash | sf-ds4flash | 8001 | DSpark only; separate 0731 support GGUF; no legacy MTP |
sf-ds4-1flash | DeepSeek V4.1 Flash | sf-ds4-1flash | 8002 | none |
sf-glm5-3flash | GLM 5.3 Flash | sf-glm5-3flash | 8003 | built-in MTP |
sf-q3-8flash | Qwen3.8 Flash Next | sf-q3-8flash | 8004 | built-in MTP |
Each child is a separate repository. This repository is the orchestrator: rules, procedures, tools, and a read-only mirror of upstream. No inference code lives here.
ds4 is built around a few models rather than as a general GGUF runner, and it is meant to be read and changed with a coding agent: a working template to adapt to your model and hardware, not a product that covers every setup. StarForge pushes both ideas to the end and makes the result repeatable, one child per model:
SPEC.md decides what every child
deletes and what it must keep, so each child shrinks the same way. What is
left is a tree a person or a coding agent can load whole and reason about,
which makes it cheap to try an idea on one model, measure it and keep or
drop it.upstream/main with plain git merge, rerere and the parity oracle, so
ds4's fixes and speedups keep flowing into a tree that stays small.docs/upstream-prs.md), not
here.Go to the child's repo. Its README tells you make, ./download.sh <quant>,
./sf-<model>. download.sh uses the Hugging Face CLI and creates a gguf/
symlink to the shared Hugging Face cache; it does not duplicate the model in
the repo. You do not need this repo.
git clone https://github.com/Chida82/StarForge && cd StarForge
tools/clone-all.sh # upstream/ds4 (full) + children/* (those that exist on GitHub)
tools/status.sh # where each child stands vs upstream/main
| I want to… | Read | Run |
|---|---|---|
| understand the rules | AGENTS.md (short), then SPEC.md (the law) | |
| create a child | BOOTSTRAP.md | tools/new-child.sh <child> <org> then the checklist |
| see what upstream changed for a child | SYNC.md §1 | tools/sync-preview.sh [child] (no arg = all) |
| pull upstream into a child | SYNC.md | tools/sync-start.sh <child> → resolve → trace → parity → explicit commit/push request → PR → tools/sync-finish.sh <child> --push |
| prove a child still matches upstream | SPEC.md §F.4 | tools/parity-check.sh <child> [model.gguf] |
| work with a coding agent | open children/<child> (it has its own AGENTS.md) or this folder |
All bash + git + coreutils, in tools/:
| Script | Does |
|---|---|
clone-all.sh | clone/fetch upstream/ds4 and every child in the registry; sets upstream remote and rerere |
status.sh | per child: upstream merge-base, last sync-* tag, commits behind, dirty tree |
new-child.sh <child> [org] | fresh child clone with remotes, rerere, rendered AGENTS.md, parity prompts. No commit/tag/push |
sync-preview.sh [child] | classify pending upstream commits: only-removed / docs-only / touches-live / HOT. No argument: every cloned child |
sync-start.sh <child> | branch sync/<sha7>, apply upstream/main as an uncommitted merge, list conflicts |
rm-deleted-conflicts.sh <child> | resolve modify/delete conflicts by keeping the child's deletions |
parity-check.sh <child> [gguf] | build upstream at the child's merge-base and the child; same cache-backed GGUF/symlink, same prompts, greedy; token-identical + speed ±2% |
speed-compare.sh <child> <gguf> | same bench sweep on the child, a 3-minute rest, then upstream at the child's base (SF_SPEED_FLAGS, default --ssd-streaming); CSVs and per-frontier deltas in tools/speed/out/; informational, gates nothing |
sync-finish.sh <child> --push | after the PR is merged and push explicitly authorized: tag main as sync-<sha7>, push |
parity/<child>.txt | prompt sets for the oracle (TAB → extra flags: steering plus DSpark or MTP per child) |
lib.sh | shared helpers and the registry (keep in sync with AGENTS.md) |
AGENTS.md SPEC.md BOOTSTRAP.md SYNC.md README.md
templates/child-AGENTS.md copied into a child at bootstrap
tools/ scripts + parity prompt sets
children/<name>/ plain clones (gitignored)
upstream/ds4/ plain full clone of ds4 (gitignored, read-only)
Children and upstream are plain clones, not submodules: each child already
records its own upstream position (tags, merge-base). There is deliberately no
central SHA/status file; tools/status.sh derives live state from Git. See
SPEC.md §H.
git merge upstream/main is how it stays current.ds4_* file names and identifiers never change; only binary names, paths and help do.#ifdef. Cuts inside live files carry /* sf-ablate(...) */.git rerere replays conflict resolutions, so ablated regions stop hurting after the first sync.Always kept in every child: steering, TP/RDMA, CPU reference path, server,
CLI, bench, eval. Speculative decoding follows the table: notably,
sf-ds4flash keeps DSpark but deletes legacy MTP. Never in a child:
ds4-agent, CUDA, ROCm, other models.
Agents may prepare and test changes, but commit and push only after an explicit user request.
sf-q3-8flash and sf-ds4-1flash are bootstrapped, published and synced, and
each now carries its own performance work. sf-ds4flash and sf-glm5-3flash
have not been started.
Which upstream commit each child sits on is deliberately not written here --
tools/status.sh reads it from Git (SPEC.md §A, §H).
Tools and documents in this repository: MIT. Children inherit ds4's MIT
licence and keep its LICENSE file, including the GGML notice, unchanged.
Everything works because of ds4, llama.cpp and GGML.
Shell
100.0%
One inference engine per model, Metal only, forked from antirez/ds4 (DwarfStar).
ds4 runs several large open models on several backends from one codebase. It
is excellent and it is also a lot to hold in your head. StarForge produces
children: full forks of ds4 reduced to one model on Apple Metal, each
a normal GitHub repo you can build, read and modify without the other models
and backends in the way. Children keep merging upstream through plain git merge, so fixes and speedups from ds4 keep flowing in.
| Child | Model | Binary | Server port | Speculative decoding |
|---|---|---|---|---|
sf-ds4flash | DeepSeek V4 Flash | sf-ds4flash | 8001 | DSpark only; separate 0731 support GGUF; no legacy MTP |
sf-ds4-1flash | DeepSeek V4.1 Flash | sf-ds4-1flash | 8002 | none |
sf-glm5-3flash | GLM 5.3 Flash | sf-glm5-3flash | 8003 | built-in MTP |
sf-q3-8flash | Qwen3.8 Flash Next | sf-q3-8flash | 8004 | built-in MTP |
Each child is a separate repository. This repository is the orchestrator: rules, procedures, tools, and a read-only mirror of upstream. No inference code lives here.
ds4 is built around a few models rather than as a general GGUF runner, and it is meant to be read and changed with a coding agent: a working template to adapt to your model and hardware, not a product that covers every setup. StarForge pushes both ideas to the end and makes the result repeatable, one child per model:
SPEC.md decides what every child
deletes and what it must keep, so each child shrinks the same way. What is
left is a tree a person or a coding agent can load whole and reason about,
which makes it cheap to try an idea on one model, measure it and keep or
drop it.upstream/main with plain git merge, rerere and the parity oracle, so
ds4's fixes and speedups keep flowing into a tree that stays small.docs/upstream-prs.md), not
here.Go to the child's repo. Its README tells you make, ./download.sh <quant>,
./sf-<model>. download.sh uses the Hugging Face CLI and creates a gguf/
symlink to the shared Hugging Face cache; it does not duplicate the model in
the repo. You do not need this repo.
git clone https://github.com/Chida82/StarForge && cd StarForge
tools/clone-all.sh # upstream/ds4 (full) + children/* (those that exist on GitHub)
tools/status.sh # where each child stands vs upstream/main
| I want to… | Read | Run |
|---|---|---|
| understand the rules | AGENTS.md (short), then SPEC.md (the law) | |
| create a child | BOOTSTRAP.md | tools/new-child.sh <child> <org> then the checklist |
| see what upstream changed for a child | SYNC.md §1 | tools/sync-preview.sh [child] (no arg = all) |
| pull upstream into a child | SYNC.md | tools/sync-start.sh <child> → resolve → trace → parity → explicit commit/push request → PR → tools/sync-finish.sh <child> --push |
| prove a child still matches upstream | SPEC.md §F.4 | tools/parity-check.sh <child> [model.gguf] |
| work with a coding agent | open children/<child> (it has its own AGENTS.md) or this folder |
All bash + git + coreutils, in tools/:
| Script | Does |
|---|---|
clone-all.sh | clone/fetch upstream/ds4 and every child in the registry; sets upstream remote and rerere |
status.sh | per child: upstream merge-base, last sync-* tag, commits behind, dirty tree |
new-child.sh <child> [org] | fresh child clone with remotes, rerere, rendered AGENTS.md, parity prompts. No commit/tag/push |
sync-preview.sh [child] | classify pending upstream commits: only-removed / docs-only / touches-live / HOT. No argument: every cloned child |
sync-start.sh <child> | branch sync/<sha7>, apply upstream/main as an uncommitted merge, list conflicts |
rm-deleted-conflicts.sh <child> | resolve modify/delete conflicts by keeping the child's deletions |
parity-check.sh <child> [gguf] | build upstream at the child's merge-base and the child; same cache-backed GGUF/symlink, same prompts, greedy; token-identical + speed ±2% |
speed-compare.sh <child> <gguf> | same bench sweep on the child, a 3-minute rest, then upstream at the child's base (SF_SPEED_FLAGS, default --ssd-streaming); CSVs and per-frontier deltas in tools/speed/out/; informational, gates nothing |
sync-finish.sh <child> --push | after the PR is merged and push explicitly authorized: tag main as sync-<sha7>, push |
parity/<child>.txt | prompt sets for the oracle (TAB → extra flags: steering plus DSpark or MTP per child) |
lib.sh | shared helpers and the registry (keep in sync with AGENTS.md) |
AGENTS.md SPEC.md BOOTSTRAP.md SYNC.md README.md
templates/child-AGENTS.md copied into a child at bootstrap
tools/ scripts + parity prompt sets
children/<name>/ plain clones (gitignored)
upstream/ds4/ plain full clone of ds4 (gitignored, read-only)
Children and upstream are plain clones, not submodules: each child already
records its own upstream position (tags, merge-base). There is deliberately no
central SHA/status file; tools/status.sh derives live state from Git. See
SPEC.md §H.
git merge upstream/main is how it stays current.ds4_* file names and identifiers never change; only binary names, paths and help do.#ifdef. Cuts inside live files carry /* sf-ablate(...) */.git rerere replays conflict resolutions, so ablated regions stop hurting after the first sync.Always kept in every child: steering, TP/RDMA, CPU reference path, server,
CLI, bench, eval. Speculative decoding follows the table: notably,
sf-ds4flash keeps DSpark but deletes legacy MTP. Never in a child:
ds4-agent, CUDA, ROCm, other models.
Agents may prepare and test changes, but commit and push only after an explicit user request.
sf-q3-8flash and sf-ds4-1flash are bootstrapped, published and synced, and
each now carries its own performance work. sf-ds4flash and sf-glm5-3flash
have not been started.
Which upstream commit each child sits on is deliberately not written here --
tools/status.sh reads it from Git (SPEC.md §A, §H).
Tools and documents in this repository: MIT. Children inherit ds4's MIT
licence and keep its LICENSE file, including the GGML notice, unchanged.
Everything works because of ds4, llama.cpp and GGML.
Shell
100.0%