Hoppa till huvudinnehållet

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

StandardLarge
Maskin2 vCPU, 8 GB4 vCPU, 16 GB
Användare39 € / månad78 € / månad
Tillför den gemensamma poolen200 timmar400 timmar
Pooltimmar per körd timme12
Utöver poolen0,20 € / timme0,40 € / timme
Högsta kostnad per användare och månad99 €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 byggresultatja
Dotfiler, skalhistorik, git-konfiguration, SSH-nycklarja
npm i -g, pip --user, uv tool, pipx, cargo install, go installja
Din inloggning i Claude Codeja
apt installnej

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
done

Committa 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-files

Branchen 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>.git

Två saker du inte ska kopiera:

  • ~/.git-credentials och ~/.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 8000

Port 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
claude

Den 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 frembench

Det ä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.

TangenterVad det gör
Ctrl-b cNytt fönster – starta en andra agent här
Ctrl-b n / Ctrl-b pNästa / föregående fönster
Ctrl-b 0 … Ctrl-b 9Hoppa direkt till ett fönster
Ctrl-b wVä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 zZooma en panel till helskärm och tillbaka
Ctrl-b dKoppla 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/startup kö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 dev

Inom 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:

PortTjänst
5173node
8000python3

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 – node snarare än vite, eftersom det är vad processen kallar sig själv. Den visar Unknown fö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 localhost eller 0.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.

AutentiseringsuppgiftVarVad den når
Git-autentiseringsuppgift~/.git-credentialsgit clone / push / pull, och Forgejos eget API på /api/v1/…
API-autentiseringsuppgift~/.config/fremforge/tokenfremforges 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.