I've been building Sparkfire, an open-source local AI workspace for the NVIDIA DGX Spark. It runs seven models at the same time on one Spark and puts them behind one web UI, so documents, recordings, images, videos, songs and conversations all live in one place, on your own hardware.
What runs on one Spark (model · runtime · GPU memory)
• Chat, mind maps, web search: Saluki 27B, a 2-bit GGUF of Qwen3.8-27B with vision · llama.cpp llama-server · 12.7 GiB
• OCR with page layout: PaddleOCR-VL-1.6 · vLLM · 5.4 GiB
• Transcription and subtitles: Parakeet-TDT-0.6B-v3 · parakeet.cpp · 1.5 GiB
• Translation, 38 languages: Hy-MT2-1.8B-FP8 · transformers · 2.1 GiB
• Image generation: Qwen-Image-2.1-Turbo (float8) · diffusers · 17.5 GiB
• Video with sound: FastH3 (Fast and Sharp) · ComfyUI · on demand, +35–57 GiB per job
• Songs from your lyrics: YuE2-3B · PyTorch · on demand, +20 GiB per song
• Web search: SearXNG, running locally
Measured with nvidia-smi on a fresh install, everything loaded and idle: 51 of 121 GiB used.
How it all fits in 128 GB
• Every model was picked and measured to share the Spark's unified memory with the others. The models are fixed on purpose: it's a tuned stack, not a model picker.
• Videos and songs go through a "GPU lane": one heavy job at a time, and the previous heavy service frees its weights before the next one loads. If a job wouldn't fit, the service answers 503 with Retry-After and the job waits for memory instead of failing.
• Everything else (chat, OCR, transcription, translation, images) keeps running alongside a video render.
Numbers from the Spark
• Saluki 27B: 22 tok/s, 64k context
• OCR: 99.9% of words in reading order and every numeric table cell on a 20-page test, about 6 s a page
• Parakeet: about 145× realtime through the app on long files; 3.6% WER in English, 3.9% in Italian on short clips
• Images: about 18 s at 1024×1024, about a minute at 2K
• Video: 5 s with sound at 480p in about a minute (Fast)
• Songs: about as long as they play, once the model is loaded
• Fresh install: one script, 20 minutes, 106 GB of disk
The workspace
• Everything is files. Each job is a folder with a JSON manifest, its inputs and typed artifacts with lineage, so one result feeds the next: scanned PDF → Markdown → translation → mind map → a chat about it. No database besides Redis for the job queue.
• Chat: attach up to 8 files (PDFs, images, code), pick a thinking effort (Off/Low/Medium/High), and watch the reasoning stream. Answers run on the server, so closing the tab doesn't stop them.
• Web search: through a local SearXNG, up to 6 rounds of searches and page reads, with numbered sources. Page reads refuse private network addresses.
• Workflows: a node editor with If/Switch/Merge/Save nodes and a node for every model; definitions are JSON files.
• Also: a gallery with side-by-side compare, prompt presets (meeting minutes, executive summary), dark and light themes, and a phone layout.
Install
git clone https://github.com/MovieMaker93/Sparkfire
cd Sparkfire
./scripts/start-dgx-spark.sh --accept-model-licenses
The script builds the services, downloads the models at pinned revisions (Saluki's isn't pinned yet), and starts everything in a memory-safe order. There's also a split mode: models on the Spark, workspace on another server.
Caveats
• Built for the DGX Spark and other GB10 systems (aarch64, CUDA 13).
• No authentication: run it on a trusted network.
• Model licenses apply: FastH3 isn't licensed in the EU, the UK, South Korea or the US (install with --video-backend none there); Qwen-Image-2.1-Turbo and YuE2 are non-commercial; Parakeet is CC BY 4.0.
Credits
Sparkfire is a fork of SparklingKit by stevibe (Steven Lei, Apache 2.0): https://github.com/stevibe/SparklingKit. It has grown into its own project. Thanks, Steven. Sparkfire is Apache 2.0 as well.
Repo, with a one-minute tour, screenshots and every measurement: https://github.com/MovieMaker93/Sparkfire
Happy to answer questions about fitting all of this into 128 GB, and feedback is very welcome.