Gantry
En skrivebordsapp for å jobbe med KI. Chat med hvilken som helst modell, la en kodeagent jobbe i mappene dine, og koble den til verktøyene du bruker, alt med dine egne API-nøkler.

Gantry er en skrivebordsapp for å jobbe med KI. I ett vindu får du en chatteklient som fungerer med alle modeller, en kodeagent som kan jobbe i dine egne mapper, og koblinger til verktøy som GitHub, Linear, Notion og Sentry. Alle tre bruker det samme tillatelsessystemet og den samme lokale databasen.
Det finnes ingen konto og ingen server fra meg bak appen, og den sender ingen telemetri. Du legger inn dine egne API-nøkler og betaler leverandørene direkte. Chattene dine blir på datamaskinen din. Det eneste som forlater den, er forespørslene du sender til modellene og tjenestene du har satt opp.
Jeg begynte på Gantry i august 2026 og ga ut versjon 0.1.0 for Linux og Windows 22. september. Det er det største jeg har laget så langt, med rundt 110 000 linjer Rust og TypeScript.
Hvorfor jeg laget den
Jeg bruker KI til nesten alt, og jeg møtte stadig det samme problemet. De fine appene fra de store selskapene fungerer bare med deres egne modeller, og alt du gjør i dem lagres på deres servere. De åpne alternativene jeg prøvde, var enten et enkelt chattevindu, eller en kodeagent i terminalen som kunne gjøre nesten hva som helst på maskinen min uten særlig kontroll.
Jeg ville ha én app der jeg kunne bytte mellom Claude, GPT, Gemini og Grok midt i en samtale, gi modellen ekte verktøy, og likevel se nøyaktig hva den gjorde og bestemme hva den fikk lov til. Jeg ville også at chattene mine skulle ligge i en fil på min egen disk. Jeg fant ikke den appen, så jeg laget den.
Funksjoner
Alle modeller
Gantry har egne klienter for Anthropic, OpenAI, Google og xAI. Den fungerer også med OpenRouter og alle OpenAI-kompatible endepunkter, så lokale modeller gjennom Ollama går også. Du kan bytte modell eller leverandør midt i en chat. Gantry lagrer samtalen i sitt eget format og gjør den om for den modellen som svarer neste gang, så du kan starte en oppgave med Claude og la Gemini gjøre den ferdig.
Svarene strømmer inn mens de skrives, og du kan også se modellens resonnering. Du kan stoppe et svar, prøve igjen, gi det en vurdering, søke i alle meldinger du har sendt, og eksportere en chat som Markdown eller JSON. Priser, kontekststørrelse og hva hver modell støtter, hentes fra leverandørenes egne modellister. Det finnes også et privat vindu som ikke lagrer noe.
Jobbe i mappene dine
Kode-visningen er den samme appen, satt opp for programmering. Du velger en mappe før første melding. Agenten kan da lese filer, endre dem og kjøre kommandoer, og utdataene strømmer inn linje for linje. Et sidepanel viser hver fil den har endret, med diff og en Angre-knapp for hver av dem. Alle endringer logges, så når du angrer, får du tilbake nøyaktig det som stod i filen før.
Bestemme hvor mye du stoler på den
Dette brukte jeg mer tid på enn noe annet i appen. Hver chat har én av fire moduser, og du kan bytte når som helst:
| Modus | Hva som kjører uten å spørre |
|---|---|
| Manuell | Ingenting. Du godkjenner hvert verktøykall, også når den bare leser en fil. |
| Auto-redigering | Filendringer i mappene du har lagt til, siden Gantry kan angre dem. Kommandoer og endringer andre steder spør fortsatt først. |
| Plan | Ingenting som endrer noe. Modellen får ikke engang de verktøyene. Den ser seg rundt, skriver en plan og spør om den skal sette i gang. |
| Auto | Alt, men en ekstra «vakt»-modell sjekker hvert risikabelt kall først og kan stoppe det. |
Vakten er en liten og billig modell fra den samme leverandøren du allerede bruker, så du trenger ingen ekstra nøkkel. Noen enkle regler kjører før den: alt utenfor mappene dine blokkeres, lesing er lov, og hvis det samme kallet feiler tre ganger på rad, blir det stoppet. Alt annet går til vakten. Den får et kort sammendrag av oppgaven, kallet og det som har skjedd nylig, og svarer med tillat eller avslå, hvor sikker den er, og hvorfor. Er den usikker på noe som kan ødelegge noe, blir du spurt i stedet.
I tillegg til modusene finnes det en liste med sperrer som alltid gjelder. Noen ting blokkeres alltid, som rm -rf /. Noen spør alltid, som en force-push. Stier som SSH-nøklene dine er beskyttet, og alt som ser ut som en hemmelighet, blir flagget. Du kan lese og endre listen selv. Når du gir tillatelse til noe, gjelder den bare den ene mappen eller kommandoen i den ene chatten, og du kan se og fjerne tillatelsene dine senere.
Alle verktøykall vises i chattens aktivitetsliste med argumentene, hele resultatet og hvor lang tid de tok.
Koblinger
Gantry kommer med 67 koblinger. Seks er innebygd: filer, editor, skall, nett, mediegenerering og underagenter. Ni kjører lokalt på Node, Python eller Docker, og 52 er eksterne MCP-servere, blant annet GitHub, Linear, Figma, Supabase og Stripe. Før du installerer en kobling, forteller den hva den vil få tilgang til, og alle verktøyene dens går gjennom det samme tillatelsessystemet som alt annet.
Koblinger installeres aldri automatisk. Hvis modellen trenger en du ikke har, kan den foreslå den, men det er du som trykker installer. Innlogging hos eksterne tjenester bruker OAuth 2.1 med en lokal omdirigering, og Gantry identifiserer seg med en liten metadatafil på mitt eget domene, som er den nyere måten MCP-klienter registrerer seg på.
Artefakter
Dokumenter, kode, SVG, HTML-sider, Mermaid-diagrammer og React-komponenter åpnes i et panel ved siden av chatten, med versjonshistorikk og eksport. HTML, SVG og React kjører kode, så de kjører i en låst sandkasse uten nettverk, uten filtilgang og uten mulighet til å nå resten av appen.
Siden sandkassen er en sikkerhetsfunksjon, ville jeg ha tester som faktisk beviser at den virker. Testene laster 34 artefakter som er skrevet for å bryte seg ut, hver på sin måte: kalle appens interne API, laste et skript fra internett, navigere vinduet, lese lagring eller informasjonskapsler, registrere en service worker eller åpne et popup-vindu. Alle må feile. Det finnes også en test som slår av sandkassen og sjekker at de andre testene merker det. Uten den kunne et ødelagt testoppsett ha bestått i all evighet uten at noen visste det.
Ferdigheter, hukommelse, prosjekter og underagenter
Ferdigheter er enkle SKILL.md-filer med instruksjoner som lastes inn når de er relevante. Hukommelse er en liste med korte fakta modellen har plukket opp om deg. Du godkjenner hver av dem før de lagres, og du kan endre eller slette dem senere. Prosjekter samler chatter med felles instruksjoner, filer og innstillinger. Underagenter lar modellen gi deler av en oppgave til mindre hjelpere, og du kan se hva hver av dem gjorde. Mediekoblingen kan også lage bilder, tale og video med de samme API-nøklene.
Nøkler og data
Gantry lager én tilfeldig hovednøkkel og lagrer den i operativsystemets passordlager: Keychain på macOS, Credential Manager på Windows eller Secret Service på Linux. Alle API-nøkler og innloggingstokens krypteres med den nøkkelen (XChaCha20-Poly1305) og lagres i den lokale databasen. Brukergrensesnittet får aldri se en hemmelighet. De blir i Rust-delen av appen hele tiden.
Det var et bevisst valg å bare ha én nøkkel i operativsystemet og alt annet kryptert i SQLite. Windows begrenser hvor store lagrede hemmeligheter kan være, macOS viser tillatelsesvinduer, og noen Linux-oppsett har ikke nøkkelring i det hele tatt. På denne måten spiller ikke det noen rolle. Har Linux-maskinen din ingen nøkkelring, sier Gantry ifra og bruker i stedet en fil som bare brukeren din kan lese.
Alt annet, som chatter, meldinger, verktøykall, artefakter, ferdigheter, minner og innstillinger, ligger i én SQLite-database og en mappe med filer i appens datamappe. I innstillingene kan du se hvor alt ligger, ta sikkerhetskopi, komprimere databasen eller åpne mappen.
Hvordan den fungerer
Gantry er laget med Tauri 2. Backenden er skrevet i Rust og tar alle avgjørelser, og frontenden i React 19 viser bare det backenden sier. Jeg holdt meg til tre regler hele veien:
- All viktig tilstand ligger i backenden. Chatter, tillatelser, hemmeligheter og koblingsstatus lagres aldri bare i grensesnittet.
- Hver agenttur kjører som en egen bakgrunnsoppgave. Grensesnittet lytter bare på den, så å lukke en visning, bytte chat eller laste på nytt stopper ikke agenten.
- Koblinger og modeller snakker aldri direkte med hverandre. Agenten står mellom dem, og hvert kall går gjennom tillatelsessjekken.
Rust-koden er delt i ni «crates»: kjernetyper, databasen, hemmeligheter, modelleverandørene, koblinger, arbeidsområdet (filtilgang, endringsloggen, differ og kjøring av kommandoer), en terminal, lesing av dokumenter og agenten. Agenten er den største, med rundt 22 000 linjer. TypeScript-typene frontenden bruker, genereres fra Rust-koden, og en test feiler hvis de noen gang kommer ut av synk.
Omtrent dette skjer når du sender en melding. Meldingen lagres, og agenten begynner å jobbe i bakgrunnen. Den henter samtalen, chattens innstillinger og verktøyene fra koblingene du har lagt til, og korter ned samtalen hvis den begynner å bli for lang for modellen. Mens svaret strømmer inn, sendes teksten til grensesnittet i små porsjoner hvert 16. millisekund, så det går jevnt. Når modellen vil bruke et verktøy, går kallet gjennom tillatelsessjekken: mappeomfang, sperrer, risikonivå, modus, lagrede tillatelser, vakten og til slutt deg. Godkjente kall kjøres, flere samtidig når det er trygt, og resultatene sendes tilbake til modellen. Dette gjentas til modellen er ferdig. Krasjer appen midt i, oppdager den det ved neste oppstart, markerer turen som avbrutt, og du kan fortsette derfra.
Planlegging
Før jeg skrev noe kode, skrev jeg en plan. Den endte opp som atten dokumenter om modelleverandørene, koblinger, tillatelser, strømming, databasen, artefakter, ferdigheter og hukommelse, designet og de to hovedvisningene. Den har også en liste over beslutninger og en liste med over tjue steder der kravene mine motsa hverandre, og hva jeg valgte i hvert tilfelle. Etter det bygde jeg appen milepæl for milepæl, fra en tom app til lanseringen.
Jeg holdt planen oppdatert underveis. Når koden endte opp annerledes enn et dokument, oppdaterte jeg dokumentet i samme commit. Veikartet noterer hver gang jeg endret retning og hvorfor. Ganske mange av dem var tilfeller der planen tok feil, og det å bygge den viste meg en bedre løsning.
Testing
- 761 Rust-tester, i tillegg til frontend-tester, typesjekk og linting ved hver push.
- Sandkassetestene for artefakter som jeg beskrev over, kjørt i en ekte nettlesermotor.
cargo denysjekker lisenser, kjente sikkerhetshull og hvor avhengighetene kommer fra. Utgivelsen bygges heller ikke hvis listen over tredjepartslisenser ikke er oppdatert.- Windows-bygget typesjekkes fra Linux, og det finnes en sjekkliste for det som krever en ekte Windows-maskin.
- En side i innstillingene viser hvor lang tid vinduet brukte på å åpne seg, hvor lang tid hver dialog brukte på å vises, og hvor lang tid hvert backend-kall tok.
Litt tall
| Linjer kode | rundt 110 000 (73 000 Rust, 36 000 TypeScript) |
| Rust-crates | 9, pluss 5 for de innebygde koblingene |
| Koblinger | 67 (6 innebygde, 9 lokale, 52 eksterne) |
| Leverandører | Anthropic, OpenAI, Google, xAI, OpenRouter og OpenAI-kompatible endepunkter |
| Rust-tester | 761 |
| Utbruddsforsøk sandkassen må stoppe | 34 |
| Databasemigreringer | 16 |
| Plandokumenter | 18 |
Hvordan jeg bygde den
Jeg designet Gantry og skrev den med Claude Code som kodeverktøy. Min del var alt som avgjør om et prosjekt av denne størrelsen faktisk fungerer: å skrive planen, ta arkitekturvalgene, bestemme hva som skulle skje når kravene kolliderte, gå gjennom koden, teste mot ekte leverandører og ekte MCP-servere, og kaste ting som ikke var gode nok. Nettsiden er et godt eksempel. Den første versjonen hadde en 3D-scene og mange farger. Jeg likte den ikke, så den ble kastet og laget på nytt med en enklere layout og én oransje aksentfarge.
Å lage noe så stort med et KI-kodeverktøy er en egen ferdighet. Det fungerer bare hvis det finnes en tydelig skriftlig plan, små commits, strenge tester og noen som vet hva hver del skal gjøre og sjekker det. Det er nok det viktigste jeg lærte av dette prosjektet.
Status og lisens
Versjon 0.1.0 er ute for Linux (AppImage, .deb og .rpm) og Windows (installasjonsprogram). Koden støtter macOS, men jeg har ikke gitt ut et signert Mac-bygg ennå. Jeg jobber fortsatt aktivt med den, og de siste commitene og utgivelsene fra GitHub vises under.
Kildekoden er offentlig under Functional Source License. Du kan bruke Gantry til hva som helst, lese og endre koden, forke den og dele den. Det eneste du ikke kan, er å selge den som et konkurrerende produkt. To år etter hver utgivelse blir den versjonen automatisk Apache 2.0, som er en vanlig åpen kildekode-lisens.
Hva jeg lærte
De tidligere prosjektene mine lærte meg hver sin ting. Yapp lærte meg databaser, agent-eyes lærte meg hvordan KI-agenter bruker verktøy, og de første nettsidene lærte meg å gjøre noe ferdig og få det ut. Gantry trengte alt dette samtidig, pluss mye jeg aldri hadde gjort før: en stor Rust-kodebase, strømming av data mellom Rust og TypeScript, kryptering og nøkkellagring, OAuth, en sandkasse jeg kunne bevise var sikker, og et tillatelsessystem som må være riktig hver gang, fordi det bestemmer hva en KI kan gjøre på noens datamaskin.
Den største lærdommen var at i denne størrelsen er det ikke kodingen som er vanskelig. Det vanskelige er å finne ut hva appen skal være, skrive det tydelig ned, og holde koden og planen i synk i ukevis.
Siste commits
Se på GitHub- Henter commits fra GitHub…