frembench — utvecklings-benches
frembench är en Linuxmaskin som du hyr per minut och når från din webbläsare – en utvecklings-bench (dev bench). Den har samma språkverktyg som dina CI-runners, så det som bygger på en bench bygger också i CI.
Vad det kostar
En bench-användare kostar 39 € per månad och innehåller 200 timmar körtid. Utöver poolen kostar det 0,20 € per timme, och totalen har ett fast tak – så din faktura kan aldrig överstiga 99 € per bench-användare och månad, hur hårt du än kör dem. För en enda användare nås taket vid 500 timmars körtid; därefter fortsätter benchen att köra utan extra kostnad. Alla belopp här är i EUR, vilket är den valuta som benches debiteras i – precis som resten av ditt abonnemang.
Timmarna delas mellan bench-användare, på samma sätt som CI-minuter. Kvoten är 200 timmar × användare, mätt mot allt som din organisations benches har kört, så två användare delar på 400 timmar: en flitigt använd bench tar av en lugnare kollegas kvot i stället för att gå direkt till överförbrukning. Taket delas på samma sätt – det är 99 € per bench-användare, inte per maskin, så en enskild bench i en organisation med två användare kan stå för mer än 99 € medan organisationen håller sig under 198 €.
Två storlekar
| Standard | Large | |
|---|---|---|
| Maskin | 2 vCPU, 8 GB | 4 vCPU, 16 GB |
| Användare | 39 € / månad | 78 € / månad |
| Tillför den gemensamma poolen | 200 timmar | 400 timmar |
| Pooltimmar per körd timme | 1 | 2 |
| Utöver poolen | 0,20 € / timme | 0,40 € / timme |
| Högsta kostnad per användare och månad | 99 € | 198 € |
En Large-användare räknas som två bench-användare i alla avseenden, så allt på den här sidan gäller för den med dubbla siffror: en pool för hela organisationen, samma mätning per sekund, samma tak. En lugn användare av vilken storlek som helst täcker upp för en flitig. En organisationsadministratör köper Large-användare på faktureringssidan och väljer storlek när en användare tilldelas en person; benchen skapas i samma storlek som ägarens användare.
Två detaljer som är bra att känna till, eftersom de påverkar vad du faktiskt betalar:
- Tiden mäts i sekunder och avrundas en gång, i slutet av perioden. En bench går i viloläge efter 30 minuters inaktivitet och vaknar när du ansluter, så en arbetsdag består av många korta intervall. Att avrunda varje intervall uppåt till en minut skulle debitera tjugo uppvaknanden på tio sekunder som tjugo minuter – du skulle betala för vår egen optimering av viloläget.
- 200 timmar är långt mer än en arbetsmånad av ansluten tid. Poolen är dimensionerad efter verklig tid som en bench är vaken, inte timmar du sitter vid tangentbordet; en agent som kör ett långt jobb räknas, en inaktiv editor gör det inte.
Användare periodiseras när du lägger till eller tar bort dem, precis som andra användare. På prissidan ser du hur det passar ihop med resten av planen.
Du behöver inte sköta den. Den vaknar när du ansluter och går i viloläge av sig själv när ingen är ansluten och inget körs.
Vad som överlever och vad som inte gör det
Det här är det enda du verkligen behöver förstå innan du använder en bench, eftersom det påverkar allt annat.
Din bench har två diskar. Profilvolymen, 50 GB, är din och består. Bootdisken byggs om från en ny avbild vid varje uppvaknande, och det är så du får säkerhetsuppdateringar utan servicefönster och utan att någonsin behöva starta om.
$HOME ligger på profilvolymen. Alltså:
| Vad | Överlever viloläge |
|---|---|
Din kod, dina node_modules, ditt byggresultat | ja |
| Dotfiler, skalhistorik, git-konfiguration, SSH-nycklar | ja |
npm i -g, pip --user, uv tool, pipx, cargo install, go install | ja |
| Din inloggning i Claude Code | ja |
apt install | nej |
apt är det medvetna undantaget: systempaket är vad avbilden är till för. Om du
behöver ett varje morgon hör det hemma i avbilden – öppna en issue i stället
för att skripta in det i din skalprofil, så slutar den veckovisa ombyggnaden att
vara ditt problem.
Ta med dig dina filer
Din profilvolym överlever ett viloläge, men inte din bench. När en organisationsadministratör tar bort din bench-användare tas benchen bort samtidigt:
- Den stoppas direkt, och du kan inte öppna den igen, varken i webbläsaren
eller med
fremforge bench attach. - Dess profilvolym sparas i 30 dagar. Under de 30 dagarna kan en organisationsadministratör ångra borttagningen på organisationens administrationssida Benches. Då kommer benchen tillbaka som den var, i viloläge, på samma disk och med din användare.
- Efter 30 dagar raderas profilvolymen. Den kan inte anslutas igen eller återställas, och en ny bench startar alltid med en tom profil.
Ta därför med dig det du vill behålla medan du fortfarande har benchen, till exempel innan du lämnar ett projekt eller organisationen. Om den redan har tagits bort, be en organisationsadministratör att ångra borttagningen inom de 30 dagarna, kopiera ut dina filer enligt beskrivningen nedan och låt hen ta bort den igen.
Det finns ingen scp, rsync eller SSH in till en bench: den har ingen inkommande
nätverksväg, och fremforge bench attach ger dig en terminal, inte en
filöverföring. Det du tar med dig lämnar benchen via frem.sh, på ett av de tre
sätten nedan.
Pusha ditt arbete
Kod hör hemma i git, och benchen har redan en git-autentiseringsuppgift för frem.sh. Så här hittar du varje repo under din hemkatalog som har något som ännu inte är pushat (ändringar som inte är committade, eller commits på en branch som inte finns på någon remote):
find ~ \( -name node_modules -o -name .cache \) -prune -o -name .git -print 2>/dev/null |
while read -r g; do
r=$(dirname "$g")
if [ -n "$(git -C "$r" status --porcelain)" ] ||
[ -n "$(git -C "$r" log --branches --not --remotes --oneline -1)" ]; then
echo "not pushed: $r"
fi
doneCommitta och pusha vart och ett. Om du inte kan pusha till den branch du står på,
pusha till en egen branch (git switch -c wip/<topic>, sedan git push -u origin HEAD). git stash list visar stashar, som inte följer med i en push.
Allt annat: ett privat repo
Dotfiler, anteckningar och kladdfiler som inte hör till något repo kan
läggas i ett eget privat repo. Skapa ett i din organisation från
webbgränssnittet på frem.sh (New repository, synlighet Private), till
exempel bench-files-<your-login>. Om du inte kan skapa repon i
organisationen, be en organisationsägare. Gör sedan så här på benchen:
mkdir ~/bench-files && cd ~/bench-files
cp -a ~/.bashrc ~/.tmux.conf ~/notes . # whatever you want to keep
git init -b bench-files
git add -A
git commit -m "Files from my bench"
git remote add origin https://frem.sh/<org>/bench-files-<your-login>.git
git push -u origin bench-filesBranchen heter bench-files i stället för main så att organisationens
branch-skydd, som täcker main som standard, inte avvisar pushen. På din egen
maskin:
git clone -b bench-files https://frem.sh/<org>/bench-files-<your-login>.gitTvå saker du inte ska kopiera:
~/.git-credentialsoch~/.config/fremforge/token. De är utfärdade för benchen, återkallas när den försvinner och fungerar ingen annanstans.- Dina egna hemligheter, som privata SSH-nycklar eller autentiseringsuppgifter för molnets CLI. Alla med åtkomst till repot kan läsa dem, även organisationens ägare. Skapa nya på din nästa maskin i stället.
Git passar dåligt för stora binärfiler, så håll repot till det du faktiskt behöver.
En enda liten fil: ladda ned den i webbläsaren
För en enda liten fil finns en genväg via Forwarded ports. Packa det du vill ha i en fil och servera dess katalog:
mkdir -p ~/outbox
tar -czf ~/outbox/dotfiles.tar.gz -C ~ .bashrc .tmux.conf
cd ~/outbox && python3 -m http.server 8000Port 8000 visas under Forwarded ports. Öppna den, klicka på filen för att
ladda ned den och stoppa sedan servern med Ctrl-c. Ett vidarebefordrat svar är
begränsat till 8 MB, så det här fungerar bara för små filer; använd ett repo
för något större.
Köra en agent
Codex och opencode är förinstallerade. Båda har öppen källkodslicens, så vi levererar dem.
Claude Code är inte förinstallerat, och orsaken är en licens snarare än ett förbiseende: dess villkor är inte en öppen källkodslicens, och det här är en produkt vi säljer, så att leverera den skulle innebära att vi distribuerar vidare proprietär programvara. Det är ett kommando, under ditt eget avtal med Anthropic:
frembench-install-claude-code
claudeDen installeras från det publika npm-registret via benchens utgående proxy, som alla andra paket du installerar på benchen. Du gör det bara en gång – installationen och inloggningen ligger på din profilvolym.
Ingen telemetri från de förinstallerade verktygen. Användningsrapportering och uppdateringskontroller är avstängda för de agenter och verktyg som en bench levereras med (OpenChamber, opencode, Codex, Mistral Vibe, Claude Code när du installerar det, samt moln-, bygg- och paketverktygen), och varje bygge av bench-imagen kontrollerar det. Några verktyg hämtar fortfarande innehåll de behöver för att fungera, inte data om dig: opencodes modellista, Codex plugin-katalog och Azure CLI:s versionskontroll vid första körningen. Vill du slå på rapporteringen för ett verktyg igen sätter du dess variabel själv.
Köra flera saker samtidigt
Benchens terminal är inte ett naket skal – den ansluter till en tmux-session
som heter frembench:
tmux new-session -A -s frembenchDet är det som gör att en agent överlever att du stänger laptopen, och det är
också så du kör flera samtidigt. Prefixtangenten är standardvalet Ctrl-b, och
musen är aktiverad.
| Tangenter | Vad det gör |
|---|---|
Ctrl-b c | Nytt fönster – starta en andra agent här |
Ctrl-b n / Ctrl-b p | Nästa / föregående fönster |
Ctrl-b 0 … Ctrl-b 9 | Hoppa direkt till ett fönster |
Ctrl-b w | Välj ur en lista med fönster |
Ctrl-b , | Byt namn på det aktuella fönstret – värt att göra, namnge dem per uppgift |
Ctrl-b % | Dela i paneler sida vid sida |
Ctrl-b " | Dela i paneler ovanför varandra |
Ctrl-b z | Zooma en panel till helskärm och tillbaka |
Ctrl-b d | Koppla från – allt fortsätter att köra |
En andra webbläsarflik speglar; den förgrenar inte. Varje anslutning går till
samma frembench-session, så två flikar visar samma fönster och kommer att slåss
om det. Använd fönster och paneler för parallellt arbete, inte fler flikar.
Om du vill att två flikar ska visa olika saker kan du ge den andra en egen vy av samma fönster:
Ctrl-b : new-session -t frembench -s second
Ctrl-b : switch-client -t second-t frembench grupperar den nya sessionen med originalet, så båda ser samma
fönsterlista men var och en kan stå på ett eget fönster. En nyöppnad flik hamnar
alltid på frembench, så du kör switch-client igen för varje flik.
Två detaljer som brukar överraska:
- Ett nytt fönster är ett vanligt inloggningsskal.
~/.frembench/startupkörs bara när sessionen skapas första gången, så det körs inte om per fönster. - Flikar i olika storlek krymper inte varandra.
aggressive-resizeär på, så ett fönster anpassas efter den klient som faktiskt tittar på det och inte efter den minsta som är ansluten.
Öppna en utvecklingsserver i webbläsaren
En bench har ingen inkommande nätverksväg. Ingenting på internet kan nå den, och det är inte en begränsning som vi planerar att ta bort – det är därför anslutningsytan går att försvara.
Utvecklingsservrar fungerar ändå. Starta en som du brukar:
npm run devInom några sekunder visas porten under Forwarded ports – ett eget kort på frembench-sidan, under Holds; under skalet på terminalsidan i helskärm. Klicka på den. Anslutningen går utgående över samma kanal som din terminal; ingen port exponeras och ingen tunnelbinär används.
Kortet visar vad som lyssnar och var:
| Port | Tjänst |
|---|---|
| 5173 | node |
| 8000 | python3 |
Några saker att känna till:
- Bara portar som din bench faktiskt lyssnar på erbjuds. Du kan inte begära en godtycklig port, och det kan inte heller något annat som har en länk.
- Tjänstekolumnen är processens eget korta namn, läst från benchen –
nodesnarare änvite, eftersom det är vad processen kallar sig själv. Den visarUnknownför en port vars process inte kunde identifieras, och på en bench som kör en avbild från innan funktionen kom, som plockar upp den vid nästa uppvaknande. - En server som bara är bunden till benchens privata adress listas inte,
eftersom en vidarebefordran till den skulle misslyckas. Bind till
localhosteller0.0.0.0. - SSH erbjuds aldrig. Använd terminalen.
- Hot reload fungerar. En vidarebefordrad sida serveras från benchens egen origin, och en WebSocket som öppnas från den origin följer också med – vilket är vad en utvecklingsservers live-reload-kanal behöver. Den här anteckningen sade tidigare att det inte fungerade; den skrevs innan origin per bench fanns och blev kvar efter att den kom.
Det är också så du når ett webbgränssnitt för agenter, till exempel OpenChamber.
Det är installerat på varje bench och startar varje gång benchen vaknar, på port 3000,
bakom ett lösenord som har skapats för din bench (OPENCHAMBER_UI_PASSWORD i ~/.frembench/openchamber.env): öppna den porten. Kör inte openchamber tunnel – det är en Cloudflare-tunnel,
och vidarebefordran ovan är både den suveräna vägen och den som redan
autentiserar dig.
API-autentiseringsuppgiften på en bench
En bench autentiserar sig mot frem.sh med två autentiseringsuppgifter, och att veta vilken som är vilken sparar dig en eftermiddag.
| Autentiseringsuppgift | Var | Vad den når |
|---|---|---|
| Git-autentiseringsuppgift | ~/.git-credentials | git clone / push / pull, och Forgejos eget API på /api/v1/… |
| API-autentiseringsuppgift | ~/.config/fremforge/token | fremforges API på /_app/api/v1/… |
Båda utfärdas åt dig av plattformen. Du skapar dem inte, klistrar inte in dem och förnyar dem inte, och du ska inte ersätta dem med en personlig token.
Den utfärdas vid varje uppvaknande
API-autentiseringsuppgiften är en ffp_…-token som utfärdas när din bench startar,
gäller i ungefär ett dygn och återkallas när benchen går i viloläge. Nästa
uppvaknande utfärdar en ny. Därför är det säkert att den ligger på profilvolymen:
en token som läses från en kasserad disk är redan återkallad.
Den praktiska följden: en ändring av vad din bench får göra slår igenom vid nästa uppvaknande, inte direkt. Om en förmåga just har aktiverats för dig och API:t fortfarande avvisar, låt benchen gå i viloläge och väck den innan du rapporterar ett fel.
Den agerar som du, med en snävare räckvidd
Token är knuten till din identitet, inte till en organisation. Varje begäran kontrolleras fortfarande mot ditt faktiska ägarskap i organisationer, så en bench kan aldrig nå en organisation som du inte kunde nå från din laptop.
Det den medvetet inte har: fakturering, SSO-konfiguration, ändringar av användare och möjligheten att utfärda fler tokens. Det är de scopes vars följder skulle leva kvar efter att benchen kastats. Allt annat en bench behöver i vardagen – organisationer, runners, fynd, SBOM:er, läsning av granskningsloggen, beroendeuppdateringar, driftsättningsmiljöer och hemligheter samt att starta och ladda ned en dataexport – ingår.
403 Token lacks required scope '…' från en bench betyder att endpointen finns och
att benchens autentiseringsuppgift inte har det scopet. Det betyder inte att
funktionen saknas. Formuleringen är lätt att läsa som “ingen sådan endpoint” –
kontrollera scopet innan du drar några slutsatser om API:t.Organisationens ägare kan stänga av benchens API-autentiseringsuppgift helt för hela organisationen under Organisationens administration → Autentiseringspolicy. Den är på som standard.
Använda den
curl -fsS https://frem.sh/_app/api/v1/orgs/<your-org>/environments \
-H "Authorization: Bearer $(cat ~/.config/fremforge/token)"Observera prefixet /_app. Den nakna sökvägen /api/v1/… är Forgejos eget API,
som inte accepterar den här token – och dess felmeddelande citerar den token du
skickade, så undvik att klistra in utdata från ett misslyckat anrop i ett
supportärende eller en chatt.
Viloläge, uppvaknande och vad du debiteras för
Du debiteras för de minuter din bench är vaken. En bench i viloläge kostar bara sin profilvolym, så det är värt att veta exakt vad som håller den vaken.
Vad som håller den vaken
Din bench är uppe så länge något av följande gäller:
- Någon är ansluten – en webbläsarflik eller en SSH-session som faktiskt är uppkopplad.
- En agent arbetar. Inte bara kör: se nedan.
- Du har fäst den, från bench-sidan.
När inget av dem gäller går benchen i viloläge efter 30 minuter.
Vad “en agent arbetar” betyder
En agent som väntar vid en prompt arbetar inte, och det är den skillnaden som avgör din faktura. En Claude-session som lämnas öppen över natten ser upptagen ut med alla naiva mått – den tickar fortfarande på och använder ungefär 1 % av en CPU – så vi använder inte CPU ensamt för att avgöra det.
En agent räknas som arbetande när något av följande gäller:
- den har skrivit till sin egen sessionshistorik under de senaste 10 minuterna, eller
- den eller något den har startat använder minst 10 % av en CPU-kärna.
Det andra villkoret finns för långa verktygsanrop. Om din agent startar ett bygge på trettio minuter skriver den ingenting under trettio minuter medan den väntar – men kompilatorn den startade är upptagen, så benchen förblir uppe.
En agent som verkligen är inaktiv slutar alltså hålla din bench vaken ungefär 10 minuter efter sin senaste aktivitet, och benchen går i viloläge ungefär 30 minuter efter det: ungefär 40 minuter efter din senaste interaktion, om inget annat håller den vaken.
Det enda fallet du måste tala om för oss
Ett långt jobb som du själv har startat – inte via en agent – håller inte benchen
vaken. En make -j, en dataimport, ett belastningstest: om du startar det i ett
skal och stänger laptopen går benchen i viloläge mitt under det.
Det är medvetet. Om vilken upptagen process som helst höll en maskin vaken skulle en inaktiv bench kunna fortsätta debiteras för evigt av vad som helst, och det billigaste att köra på någon annans maskin är en kryptominer. Regeln är därför att vi bara räknar arbete som vi kan härleda till en agent, och allt annat är ditt beslut: fäst benchen och lossa den när jobbet är klart.
Att förbli ansluten fungerar också, eftersom en ansluten klient i sig håller benchen vaken.
Uppvaknandet sker automatiskt – anslut så kommer den tillbaka. Dina filer ligger där du lämnade dem, och din terminallayout kommer tillbaka med dem: fönstren du hade öppna återskapas i samma kataloger, och Claude, Codex, opencode och OpenChamber startas om – var och en återupptagen i den session den var i, väntande vid en prompt. Ingenting spelas upp åt dig; en agent agerar inte medan du är borta.
Två saker kommer inte tillbaka. En session som startades utan ett id som går att
återuppta kommer tillbaka som en ny session i rätt katalog, och alla andra
långlivade processer – din egen utvecklingsserver, ett bygge – startas inte om.
Ange dem i ~/.frembench/restore-commands.txt, ett kommandonamn per rad, om du
vill att de ska göra det.
Fäst en bench från bench-sidan när du har ett långt jobb som vår spårning inte skulle se. En fästning är inte permanent: en bench som har gått för länge utan att byggas om uppdateras ändå, eftersom en maskin utan säkerhetsuppdateringar på internet inte är något som en fästning ska kunna köpa.
Skaffa en
Utvecklings-benches aktiveras per tenant. Om din organisation har dem finns sidan under Inställningar → Dev benches; om inte, säger sidan det. Din organisationsadministratör bestämmer hur många benches din tenant får köra samtidigt.
En bench per organisation
En bench tillhör en organisation, inte dig. Om du är medlem i flera organisationer som har bench-användare får du en bench i var och en – separata maskiner, separata profiler, som debiteras separat till den organisation som tilldelade användaren. Du kan inte skapa en bench i en organisation som inte har köpt användare, så ingen organisation kan debiteras för en maskin den inte har gått med på.
Profiler följer inte med dig mellan organisationer. Varje bench har sin egen profilvolym, så de verktyg, den skalkonfiguration och de autentiseringsuppgifter du installerar på en bench finns inte på en bench i en annan organisation. Konfigurera var och en som du använder.
Det är en följd av tenantgränsen snarare än en begränsning vi planerar att ta bort: en delad profil skulle innebära att en organisation betalar för att lagra en annan organisations arbete, och den skulle föra filer över en gräns som kunderna förlitar sig på.
Benches går i viloläge oberoende av varandra efter trettio minuters inaktivitet, så benches i flera organisationer håller inte flera maskiner igång – bara den du faktiskt använder förblir vaken.
Varför Claude Code inte är förinstallerat
Benchens avbild levererar codex (Apache-2.0) och opencode (MIT) klara att
använda. Claude Code är inte förinstallerat, och det är ett licensbeslut snarare
än ett förbiseende: dess licens är inte öppen källkod, och frembench är en produkt
vi säljer. Att leverera det i vår avbild skulle innebära att vi distribuerar det
vidare som en del av något vi tar betalt för.
Att installera det själv är ett kommando, och det körs då under ditt avtal med Anthropic i stället för vårt – vilket också är varför det överlever ett viloläge: din profilvolym behåller det, så du installerar det en gång per bench.
Det är samma regel som gäller överallt i produkten: beroenden som vi levererar är suveräna, aktuella och helt licensierade som öppen källkod. Allt som inte klarar det testet är något du tar med dig, inte något vi paketerar.