Skip to content

landigf/gdgaihack-2026

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

66 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Houston

A 100% offline, AI-powered Finder alternative for macOS β€” plus a Mars Base AI Habitat Controller route that demos how Rover's RAG substrate scales from "find a file on my laptop" to "diagnose an ECLSS fault on Sol 423". Cross-platform desktop app built on Tauri 2 + Rust. Demos in airplane mode.

Built for the GDG AI Hack Milano 2026 β€” MSI "Cut the Cord" track.

Two routes, one binary

URL fragment Route Persona Killer beat
/ Rover Finder semantic file search + summarize + note + filename + image-describe bilingual query β†’ top hit at 69% similarity
/#ares Houston Mars greenhouse / survival / repair / voice on a 4-persona stack (KV-cache reuse) typed-or-spoken "Tray 4 EC sensor at 4.2 mS/cm" β†’ grounded NASA-cited diagnose + on-base parts checklist + 5-step repair procedure

Both routes share the same FAISS index, the same MLX-LM / Ollama generator, the same HOUSTON_PREFIX system prefix β€” Houston Mars is layered on top of Rover Core RAG, not a parallel build. The architecture story is concrete in the response payload (powered_by: rover-core-rag+houston-repair).

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Houston                                          local Β· offline Β· private β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Folder    β”‚  βŒ•  presentazione budget alpha         β”‚  Selected          β”‚
β”‚  ~/demo-…  β”‚                                        β”‚  alpha-budget-Q3.mdβ”‚
β”‚            β”‚  πŸ“ alpha-budget-Q3.md          69%   β”‚  …/projects/…      β”‚
β”‚  [Index]   β”‚  ~/demo-rover/projects/alpha-bud…     β”‚                    β”‚
β”‚            β”‚  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘         β”‚  Reveal Β· Open Β·   β”‚
β”‚  Try:      β”‚  Project Alpha enters Q3 with a        β”‚  Summarize Β· Note  β”‚
β”‚  budget…   β”‚  revised budget of € 184,500…         β”‚                    β”‚
β”‚  recipe…   β”‚                                        β”‚  - Total budget…   β”‚
β”‚            β”‚  πŸ“ alpha-budget-Q3.md          66%   β”‚  - Capex/Opex…     β”‚
β”‚            β”‚                                        β”‚  - Vendor X risk…  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ ● sidecar: ready Β· localhost only      gemma3:4b Β· nomic-embed Β· FAISS  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Why local

Pillar (rubric weight) Houston's pitch
Ottimizzazione tecnica (30%) Native Tauri 2 + Rust shell (~20 MB binary), single-machine, zero cloud
UtilitΓ  pratica (25%) Find any file by meaning, not filename. Summarize. Generate notes. Open in Finder.
Integrazione creativa (25%) Native folder picker, reveal-in-Finder, system file mutations gated by native confirm dialogs
Vantaggio competitivo locale (20%) Airplane mode: zero external requests at runtime. €0 inference cost. Privacy by construction.

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Houston.app  (Tauri 2 / Rust shell)          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  React renderer (Vite + Tailwind)   β”‚    β”‚
β”‚  β”‚  SearchBar Β· FileList Β· AIPanel     β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚               β”‚ invoke()      β”‚ fetch       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ Rust commands    β”‚  β”‚ Python sidecar β”‚   β”‚
β”‚  β”‚ pick_folder      β”‚  β”‚ (FastAPI)      β”‚   β”‚
β”‚  β”‚ reveal_in_finder β”‚  β”‚ /index /search β”‚   β”‚
β”‚  β”‚ open_file        β”‚  β”‚ /summarize     β”‚   β”‚
β”‚  β”‚ create_note      β”‚  β”‚                β”‚   β”‚
β”‚  β”‚ confirm_move     β”‚  β”‚ FAISS Β· pypdf  β”‚   β”‚
β”‚  β”‚ move_file        β”‚  β”‚ tiktoken       β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                  β”‚ HTTP localhost
                       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                       β”‚  Ollama (local)     β”‚
                       β”‚  gemma3:4b Β· gen    β”‚
                       β”‚  nomic-embed-text   β”‚
                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Process boundaries (deliberate):

  • Python sidecar = read-only information layer (parse Β· chunk Β· embed Β· search Β· summarize). Never touches user folders.
  • Rust main = native OS write/dialog layer. Every mutation gated by a native confirm dialog.
  • Renderer = stateless UI. Calls Python via fetch, calls Rust via invoke().

Install (end user)

The fastest path: download a signed-by-no-one-but-it-works .dmg from the latest tagged release.

  1. Download the latest Houston_*.dmg from the Releases page. (No login required β€” picks up .app.zip + .dmg from CI.)

  2. Open the .dmg, drag Houston into /Applications.

  3. First launch: macOS will say "Houston is damaged and can't be opened" or "unidentified developer". This is not corruption β€” it's Gatekeeper blocking unsigned apps (we didn't pay for an Apple notarization cert). Two ways to fix in 5 seconds:

    Recommended (one-liner in Terminal):

    xattr -cr /Applications/Houston.app
    open /Applications/Houston.app

    This strips the macOS quarantine flag from the bundle and launches it.

    GUI alternative:

    • Right-click Houston.app β†’ Open β†’ Open in the dialog. Or
    • System Settings β†’ Privacy & Security β†’ scroll down to "Houston was blocked from use…" β†’ Open Anyway.
  4. Make sure Ollama is running locally with the models pulled:

    brew install ollama
    ollama serve &
    ollama pull gemma3:4b nomic-embed-text
  5. Open Rover. First launch creates the Python venv at ~/Library/Application Support/app.houston.demo/backend/.venv (~150 MB, ~1 min). The status footer goes green when ready.

  6. Pick a folder via the toolbar's folder picker β†’ click Index folder.

  7. Click "Mars Habitat" in the sidebar to see the on-device Mars Habitat AI demo (greenhouse drill-in, voice loop, repair assist).

Voice + STT (optional)

To use push-to-talk to Houston, drop the whisper.cpp model at ~/.local/whisper-models/ggml-base.en.bin (one-time, ~140 MB):

mkdir -p ~/.local/whisper-models
curl -L -o ~/.local/whisper-models/ggml-base.en.bin \
  https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin

Text-to-speech ships natively (/usr/bin/say). No download needed.

Install (developer)

If you want to hack on Rover, clone the repo and run:

./scripts/setup.sh        # pulls models + creates backend/.venv
bash scripts/dev.sh       # launches the live-reload dev stack
                          # (kills zombies, sets LLM_BACKEND=ollama,
                          #  caffeinate so wifi/sleep don't kill it)

Open http://127.0.0.1:1420 (Finder) or http://127.0.0.1:1420/#ares (Mars demo).

Prereqs: macOS 12+, Rust 1.95, Node 22, Python 3.12, Ollama.

setup.sh is idempotent and pulls these models if missing:

  • gemma3:4b β€” generation (~3.3 GB) β€” default GEN_MODEL
  • nomic-embed-text β€” embeddings, 768 dim (~274 MB)

Build (.app + .dmg) locally

. "$HOME/.cargo/env"
npx tauri build

Outputs:

  • src-tauri/target/release/bundle/macos/Houston.app
  • src-tauri/target/release/bundle/dmg/Houston_0.1.0_aarch64.dmg

The Python backend/*.py source ships inside the .app as a Tauri resource. On first launch, src-tauri/src/sidecar.rs copies it to ~/Library/Application Support/app.houston.demo/backend/ and creates the venv there β€” no setup.sh needed for end users.

For tagged releases, build-mac.yml auto-publishes both files to the GitHub Release page. To cut a new release:

git tag v0.1.0-demo && git push origin v0.1.0-demo
gh run watch        # watch the macOS runner build (~10 min)
gh release view v0.1.0-demo

Demo script (3 minutes for judges)

Demo corpus lives at /Users/fp/demo-rover/ (8 files, ~10 chunks):

demo-rover/
β”œβ”€β”€ projects/
β”‚   β”œβ”€β”€ alpha-budget-Q3.md          ← target of the headline query
β”‚   β”œβ”€β”€ alpha-notes.md
β”‚   β”œβ”€β”€ alpha-contract-draft.docx
β”‚   └── beta-roadmap.md             ← semantic distractor (different project)
β”œβ”€β”€ meetings/
β”‚   β”œβ”€β”€ standup-2026-05-08.md
β”‚   └── retro-2026-04-30.md
└── random/
    β”œβ”€β”€ ricetta-tiramisu.txt        ← Italian distractor
    └── vacanze-2025.md             ← bilingual distractor with budget tables
  1. Open Houston. Footer dot turns green when sidecar is ready (~2 s warm).
  2. Pick ~/demo-rover/ via the native folder picker.
  3. Click "Index folder" β€” 8 files / 11 chunks / under 1 s.
  4. Type "presentazione budget progetto alpha" β€” hit Enter.
    • Top hit: alpha-budget-Q3.md at score 0.69. Italian query, English doc β€” semantic match across languages.
  5. Click the result β†’ Summarize. 6 s on warm gemma3:4b. Markdown bullets in the AI Panel.
  6. Click "Create Note" β€” a summary-of-alpha-budget-Q3.md-…md lands next to the source. Confirm via the macOS Finder.
  7. Click "Reveal in Finder" β€” Finder window opens, file selected.
  8. Toggle Wi-Fi off and re-do steps 4–7. Identical behavior. Show ./scripts/airplane-check.sh returning 0.

Mars Habitat AI Β· open /#ares

The same window also runs an on-device Mars Base AI Habitat Controller β€” the Cut the Cord physics-enforced offline argument: 78 million km from the closest data center, 14-day blackouts every 26 months, Earth-Mars one-way light time 4–24 minutes. We didn't choose offline; Mars chose for us.

Live numbers β€” MLX-LM Qwen2.5-3B-4bit + tile cache + code-as-action (measured on the demo machine, M3 Pro 18 GB):

Metric Naive baseline Optimized stack Win
Decode tok/s (RAG prefill, 100 tokens) 43.1 tok/s (Ollama gemma3:4b) 57.6 tok/s (MLX 3B) +34 %
TTFT (RAG prefill, 100 tokens) 2249 ms 1668 ms βˆ’26 %
Greenhouse + procedure A2A (warm) 8124 ms 4050 ms 2.0Γ— speedup
Sensor cache trace 50d→20d→70d 2104 ms 72 ms 29.2× speedup
Code-as-action python_exec (would need 2nd LLM round) 438 ms LLM answers quantitative Q without 2nd decode
RAM under load 10.2 / 18 GB 9.09 / 18 GB (50 %) 9.86 GB headroom
Outbound packets during demo 0 0 airplane-check exit 0

Endpoints (additive under /ares):

  • POST /ares/houston/greenhouse β€” narrate per-tray status, cite Veggie / APH chunks
  • POST /ares/houston/greenhouse/stream β€” same, streamed via SSE (TTFT < 2 s)
  • POST /ares/houston/survival β€” habitat / ECLSS tip + severity (NASA-STD-3001)
  • POST /ares/houston/repair β€” the killer query. Free-text fault β†’ diagnose + parts_needed + parts_missing (cross-checked against on-base inventory) + 3-5 step procedure + optional macOS-say TTS
  • POST /ares/voice/houston β€” whisper.cpp + LLM + macOS say round-trip
  • POST /ares/voice/houston/text β€” same pipeline minus ASR (demo-friendly text path)
  • GET /ares/sensor/query β€” tile-lattice cached (29Γ— speedup)
  • GET /ares/perf β€” psutil snapshot + active backend label

Demo flow (90 s, all offline):

  1. Open http://127.0.0.1:1420/#ares (or click the route toggle in the header)
  2. Click HABITAT β†’ Inventory drill-in (6 bars + 4-crew roster + Houston survival tip)
  3. Click πŸ›  HOUSTON REPAIR ASSIST (bottom-right amber button) β†’ modal with 3 quick-pick faults
  4. Send "Tray 4 EC sensor reading 4.2 mS/cm β€” fertilizer overdose"
  5. Houston replies in ~3.8 s warm: WATCH severity, diagnosis with [S1] citation that opens the actual NASA Veggie PDF in macOS Preview, parts checklist (βœ“ available / βœ— REORDER NEXT RESUPPLY), 5-step procedure, optional spoken summary via say

Reproduce the benchmark plots (light-theme, no sudo, no internet):

. backend/.venv/bin/activate
python benchmarks/houston/make_light_figures.py
# β†’ benchmarks/houston/out/light/{throughput,cache_lattice,houston_latency,
#                                 voice_breakdown,perf_timeline,a2a_kv_cache}.png

WhatsApp / Slides bundle of all 7 figures: doc/plots-whatsapp/light/ (plus a REPRO_PROMPT.md you can paste into another Claude / Codex on any other machine).

The 2-page tech writeup (doc/TECHNICAL_WRITEUP.{md,pdf}) defends each of the four MSI rubric sub-criteria β€” model selection, quantization, memory management, inference speed β€” with a measured number per claim.

Airplane mode proof

./scripts/airplane-check.sh
# β†’ OK β€” no external network references in source.

Greps every .py / .ts / .tsx / .rs source file for https?:// outside the localhost / Tauri schema allow-list. Exit 0 means clean.

Tech stack & footprint

Layer What Footprint
Shell Tauri 2.11 Β· Rust 1.95 Β· WebKit ~20 MB
Renderer React 18 Β· Vite 6 Β· TypeScript 5 Β· Tailwind 3 ~200 KB
Sidecar Python 3.12 Β· FastAPI Β· uvicorn Β· faiss-cpu venv ~150 MB
Models gemma3:4b (Q4_K_M) + nomic-embed-text via Ollama ~3.6 GB on disk Β· ~3 GB resident

Tests

# Python sidecar
cd backend && . .venv/bin/activate && pytest -v
# β†’ 14 passed

# Rust (smoke)
cd src-tauri && . "$HOME/.cargo/env" && cargo build
# β†’ Finished `dev` profile

# Airplane mode
./scripts/airplane-check.sh
# β†’ OK

Out of scope (deliberate)

File watcher Β· auto-tagging Β· batch rename Β· TTS/STT Β· multi-folder simultaneous indexing Β· drag&drop Β· cloud anything Β· authentication Β· multi-user Β· code signing / notarization Β· PyInstaller standalone sidecar.

These are all plausible features that would dilute the demo. Houston does one thing β€” semantic file search with local AI actions β€” and does it properly.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors