frembench – utviklerbencher
frembench er en Linux-maskin du leier per minutt og når fra nettleseren, en utviklerbench. Den har den samme språkverktøykjeden som CI-runnerne dine, så noe som bygger på en bench, bygger også i CI.
Hva det koster
En bench-bruker koster 39 € per måned og inkluderer 200 timer kjøretid. Utover potten koster det 0,20 € per time, og totalen har et absolutt tak, så regningen din kan aldri overstige 99 € per bench-bruker i måneden, uansett hvor hardt du kjører benchene. Med én bench-bruker slår taket inn ved 500 timer kjøretid; etter det kjører benchen videre uten ekstra kostnad. Alle beløp her er i EUR, som er valutaen bencher faktureres i, akkurat som resten av abonnementet ditt.
Timene deles mellom bench-brukerne i en pott, på samme måte som CI-minutter. Kvoten er 200 timer × antall bench-brukere, målt mot alt organisasjonens bencher har kjørt, så to bench-brukere deler 400 timer: én travel bench trekker på en roligere kollegas kvote i stedet for å gå rett over i overforbruk. Taket deles på samme måte: det er 99 € per bench-bruker, ikke per maskin, så én enkelt bench i en organisasjon med to bench-brukere kan stå for mer enn 99 € mens organisasjonen holder seg innenfor 198 €.
To størrelser
| Standard | Large | |
|---|---|---|
| Maskin | 2 vCPU, 8 GB | 4 vCPU, 16 GB |
| Bench-bruker | 39 € / måned | 78 € / måned |
| Legger til i den felles potten | 200 timer | 400 timer |
| Potttimer brukt per kjøretime | 1 | 2 |
| Utover potten | 0,20 € / time | 0,40 € / time |
| Det meste en bench-bruker kan koste i en måned | 99 € | 198 € |
En Large-bench-bruker teller som to bench-brukere i alle henseender, så alt på denne siden gjelder for den med doble tall: én pott for hele organisasjonen, den samme målingen per sekund, det samme taket. En rolig bench-bruker av hvilken som helst størrelse dekker en travel en. En administrator i organisasjonen kjøper Large-bench-brukere på faktureringssiden og velger størrelsen når en bench-bruker tildeles en person; benchen opprettes i størrelsen til eierens bench-bruker.
To detaljer som er verdt å vite, fordi de endrer hva du faktisk betaler:
- Tiden måles i sekunder og avrundes én gang, ved slutten av perioden. En bench suspenderes etter 30 minutter uten aktivitet og våkner når du kobler til, så en arbeidsdag består av mange korte intervaller. Å runde hvert av dem opp til et minutt ville fakturert tjue oppvåkninger på ti sekunder som tjue minutter, og dermed latt deg betale for vår egen suspenderingsoptimalisering.
- 200 timer er langt mer enn en arbeidsmåned med tilkoblet tid. Potten er dimensjonert etter klokketiden en bench er våken, ikke timene du sitter ved tastaturet; en agent som står og kjører en lang jobb, teller, en editor uten aktivitet gjør det ikke.
Bench-brukere beregnes forholdsmessig når du legger dem til eller fjerner dem, som alle andre brukere. Se prissiden for hvordan det passer inn ved siden av resten av planen.
Du administrerer den ikke. Den våkner når du kobler til, og suspenderer seg selv når ingen er tilkoblet og ingenting kjører.
Hva som overlever, og hva som ikke gjør det
Dette er det ene som er verdt å forstå før du bruker en bench, fordi det former alt annet.
Benchen din har to disker. Profilvolumet på 50 GB er ditt og består. Oppstartsdisken bygges på nytt fra et ferskt image ved hver oppvåkning, og det er slik du får sikkerhetsoppdateringer uten et vedlikeholdsvindu og uten at noen ber deg starte på nytt.
$HOME ligger på profilvolumet. Derfor:
| Hva | Overlever en suspendering |
|---|---|
Koden din, node_modules, byggeresultatene dine | ja |
| Dotfiler, skallhistorikk, git-konfigurasjon, SSH-nøkler | ja |
npm i -g, pip --user, uv tool, pipx, cargo install, go install | ja |
| Innloggingen din i Claude Code | ja |
apt install | nei |
apt er det bevisste unntaket: systempakker er det imaget er til for. Hvis du
trenger en hver morgen, hører den hjemme i imaget. Opprett en issue i stedet for å
skripte det inn i skallprofilen din, så sørger den ukentlige gjenoppbyggingen for
at det ikke er ditt problem.
Ta med deg filene dine
Profilvolumet ditt overlever en suspendering, men ikke benchen din. Når en administrator i organisasjonen fjerner bench-brukeren din, fjernes benchen sammen med den:
- Den stopper med en gang, og du kan ikke åpne den igjen, verken i nettleseren
eller med
fremforge bench attach. - Profilvolumet beholdes i 30 dager. I de 30 dagene kan en administrator i organisasjonen angre fjerningen på adminsiden Bencher for organisasjonen. Det henter benchen tilbake slik den var, i dvale, på den samme disken, med bench-brukeren din.
- Etter 30 dager slettes profilvolumet. Det kan ikke kobles til igjen eller gjenopprettes, og en ny bench starter alltid med en tom profil.
Ta derfor med deg det du vil beholde mens du fortsatt har benchen, for eksempel før du forlater et prosjekt eller organisasjonen. Hvis den allerede er fjernet, ber du en administrator i organisasjonen angre fjerningen innen de 30 dagene, kopierer filene dine ut som beskrevet nedenfor, og lar dem fjerne den igjen.
Det finnes ingen scp, rsync eller SSH inn til en bench: den har ingen innkommende
nettverksvei, og fremforge bench attach gir deg en terminal, ikke filoverføring.
Det du tar med deg, går ut gjennom frem.sh, på en av de tre måtene nedenfor.
Push arbeidet ditt
Kode hører hjemme i git, og benchen har allerede en git-legitimasjon for frem.sh. Slik finner du hvert repository under hjemmekatalogen din som har noe som ikke er pushet (endringer som ikke er committet, eller commits på en branch som ikke finnes på noen 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
doneCommit og push hvert av dem. Hvis du ikke kan pushe til branchen du står på, pusher
du til en egen branch (git switch -c wip/<topic>, deretter git push -u origin HEAD). git stash list viser stasher, som en push ikke tar med seg.
Alt annet: et privat repository
Dotfiler, notater og kladdefiler som ikke hører til noe repository, kan legges i et
eget privat repository. Opprett et i organisasjonen din fra nettgrensesnittet på
frem.sh (Nytt repository, synlighet Privat), for eksempel
bench-files-<your-login>. Hvis du ikke kan opprette repositoryer i organisasjonen,
spør du en eier av organisasjonen. Deretter, 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 stedet for main, slik at branchbeskyttelsen i
organisasjonen din, som dekker main som standard, ikke avviser pushen. På din
egen maskin:
git clone -b bench-files https://frem.sh/<org>/bench-files-<your-login>.gitTo ting du ikke skal kopiere:
~/.git-credentialsog~/.config/fremforge/token. De er laget for benchen, tilbakekalles når den forsvinner, og virker ingen andre steder.- Dine egne secrets, som private SSH-nøkler eller legitimasjon for sky-CLI-er. Alle med tilgang til repositoryet kan lese dem, også eierne av organisasjonen. Lag nye på din neste maskin i stedet.
Git egner seg dårlig for store binærfiler, så begrens repositoryet til det du faktisk trenger.
Én enkelt liten fil: last den ned i nettleseren
For én liten fil finnes det en snarvei gjennom Forwarded ports. Pakk det du vil ha, i én fil og server katalogen den ligger i:
mkdir -p ~/outbox
tar -czf ~/outbox/dotfiles.tar.gz -C ~ .bashrc .tmux.conf
cd ~/outbox && python3 -m http.server 8000Port 8000 dukker opp under Videresendte porter. Åpne den, klikk på filen for å laste
den ned, og stopp deretter serveren med Ctrl-c. Et videresendt svar er begrenset
til 8 MB, så dette virker bare for små filer; bruk et repository for alt som er
større.
Kjøre en agent
Codex og opencode er forhåndsinstallert. Begge har åpen kildekode-lisens, så vi leverer dem.
Claude Code er ikke forhåndsinstallert, og grunnen er en lisens, ikke en forglemmelse: vilkårene er ikke en åpen kildekode-lisens, og dette er et produkt vi selger, så å levere det ville vært å videredistribuere proprietær programvare. Det er én kommando, under din egen avtale med Anthropic:
frembench-install-claude-code
claudeDen installeres fra det offentlige npm-registeret gjennom benchens utgående proxy, som enhver annen pakke du installerer på benchen. Du gjør dette bare én gang: installasjonen og innloggingen ligger på profilvolumet ditt.
Ingen telemetri fra de forhåndsinstallerte verktøyene. Bruksrapportering og oppdateringssjekker er slått av for agentene og verktøyene en bench kommer med (OpenChamber, opencode, Codex, Mistral Vibe, Claude Code når du installerer det, og sky-, bygge- og pakkeverktøyene), og hvert bygg av bench-imaget kontrollerer det. Noen få verktøy henter fortsatt innhold de trenger for å fungere, ikke data om deg: modellisten til opencode, plugin-katalogen til Codex og versjonssjekken til Azure CLI første gang den kjøres. Vil du slå på rapporteringen for et verktøy igjen, setter du variabelen selv.
Kjøre mer enn én ting samtidig
Terminalen på benchen din er ikke et nakent skall: den kobler seg til en
tmux-sesjon som heter frembench:
tmux new-session -A -s frembenchDet er dette som gjør at en agent overlever at du lukker den bærbare maskinen, og
det er også slik du kjører flere samtidig. Prefikstasten er standard Ctrl-b, og
musen er slått på.
| Taster | Hva det gjør |
|---|---|
Ctrl-b c | Nytt vindu: start en agent nummer to her |
Ctrl-b n / Ctrl-b p | Neste / forrige vindu |
Ctrl-b 0 … Ctrl-b 9 | Hopp rett til et vindu |
Ctrl-b w | Velg fra en liste over vinduer |
Ctrl-b , | Gi det gjeldende vinduet nytt navn; verdt å gjøre, gi dem navn etter oppgave |
Ctrl-b % | Del i ruter side om side |
Ctrl-b " | Del i ruter over hverandre |
Ctrl-b z | Forstørr én rute til fullskjerm, og tilbake |
Ctrl-b d | Koble fra: alt fortsetter å kjøre |
En fane nummer to i nettleseren speiler, den forgrener ikke. Hver tilkobling
går til den samme frembench-sesjonen, så to faner viser det samme vinduet og vil
slåss om det. Bruk vinduer og ruter til parallelt arbeid, ikke flere faner.
Hvis du vil ha to faner som viser forskjellige ting, gir du den andre sin egen visning av de samme vinduene:
Ctrl-b : new-session -t frembench -s second
Ctrl-b : switch-client -t second-t frembench grupperer den nye sesjonen med den opprinnelige, så begge ser den
samme vinduslisten, men hver kan stå på et eget vindu. En nyåpnet fane havner alltid
på frembench, så du kjører switch-client på nytt per fane.
To detaljer som overrasker folk:
- Et nytt vindu er et vanlig innloggingsskall.
~/.frembench/startupkjører bare når sesjonen opprettes første gang, så den kjøres ikke på nytt per vindu. - Faner i forskjellig størrelse krymper ikke hverandre.
aggressive-resizeer på, så et vindu får størrelse etter klienten som faktisk ser på det, ikke etter den minste som er tilkoblet.
Åpne en utviklingsserver i nettleseren
En bench har ingen innkommende nettverksvei. Ingenting på internett kan nå den, og det er ikke en begrensning vi planlegger å fjerne: det er grunnen til at tilkoblingsflaten kan forsvares.
Utviklingsservere virker likevel. Start en som du pleier:
npm run devI løpet av noen sekunder dukker porten opp under Videresendte porter, et eget kort på frembench-siden, under Holds; under skallet på terminalsiden i fullskjerm. Klikk på den. Forbindelsen går utgående over den samme kanalen som terminalen din; ingen port eksponeres, og ingen tunnelprogrammer er involvert.
Kortet viser hva som lytter, i tillegg til hvor:
| Port | Tjeneste |
|---|---|
| 5173 | node |
| 8000 | python3 |
Noen ting du bør vite:
- Bare porter benchen din faktisk lytter på, tilbys. Du kan ikke be om en vilkårlig port, og det kan heller ikke noe annet som har en lenke.
- Tjenestekolonnen er prosessens eget korte navn, lest fra benchen:
nodei stedet forvite, fordi det er det prosessen kaller seg selv. Den viserUnknownfor en port der prosessen ikke kunne identifiseres, og på en bench som kjører et image fra før dette kom, som får det ved neste oppvåkning. - En server som bare er bundet til benchens private adresse, vises ikke, fordi en
videresending til den ville feilet. Bind til
localhosteller0.0.0.0. - SSH tilbys aldri. Bruk terminalen.
- Hot reload virker. En videresendt side leveres fra benchens eget origin, og en WebSocket som åpnes fra det originet, videresendes også, og det er det en utviklingsservers kanal for live-reload trenger. Denne merknaden sa tidligere at det ikke virket; det ble skrevet før origin per bench fantes, og ble stående etter at det kom.
Det er også slik du når et nettgrensesnitt for agenter som OpenChamber. Det er
installert på hver bench og starter hver gang benchen våkner, på port 3000, bak et passord
som er laget for benchen din (OPENCHAMBER_UI_PASSWORD i ~/.frembench/openchamber.env): åpne den porten.
Ikke kjør openchamber tunnel: det er en Cloudflare-tunnel, og videresendingen over
er både den suverene veien og den som allerede autentiserer deg.
API-legitimasjonen på en bench
En bench autentiserer seg mot frem.sh med to typer legitimasjon, og å vite hvilken som er hvilken, sparer deg for en ettermiddag.
| Legitimasjon | Hvor | Hva den når |
|---|---|---|
| Git-legitimasjon | ~/.git-credentials | git clone / push / pull, og Forgejos eget API på /api/v1/… |
| API-legitimasjon | ~/.config/fremforge/token | fremforge-API-et på /_app/api/v1/… |
Begge lages for deg av plattformen. Du oppretter dem ikke, limer dem ikke inn og fornyer dem ikke, og du bør ikke erstatte dem med et personlig token.
Den lages ved hver oppvåkning
API-legitimasjonen er et ffp_…-token som lages når benchen din starter, er gyldig i
omtrent ett døgn, og tilbakekalles når benchen suspenderes. Neste oppvåkning lager et
nytt. Derfor er det trygt at det ligger på profilvolumet: et token som leses fra en
kassert disk, er allerede tilbakekalt.
Den praktiske konsekvensen: en endring i hva benchen din har lov til, trer i kraft ved neste oppvåkning, ikke med en gang. Hvis en funksjon nettopp er slått på for deg og API-et fortsatt avviser, suspenderer og vekker du benchen før du rapporterer en feil.
Den handler som deg, med kortere rekkevidde
Tokenet er bundet til identiteten din, ikke til en organisasjon. Hver forespørsel kontrolleres fortsatt mot ditt faktiske eierskap i organisasjoner, så en bench kan aldri nå en organisasjon du ikke kunne nådd fra den bærbare maskinen din.
Det den bevisst ikke har: fakturering, SSO-konfigurasjon, endringer av brukere og muligheten til å lage flere tokener. Det er de scopene der konsekvensene ville levd lenger enn benchen som kastes. Alt annet en bench trenger til daglig, organisasjoner, runnere, funn, SBOM-er, lesing av revisjonsloggen, avhengighetsoppdateringer, utrullingsmiljøer og secrets, og å starte og laste ned en dataeksport, er inkludert.
403 Token lacks required scope '…' fra en bench betyr at endepunktet finnes og at
bench-legitimasjonen din ikke har det scopet. Det betyr ikke at funksjonen mangler.
Formuleringen er lett å feiltolke som «endepunktet finnes ikke»; sjekk scopet før du
konkluderer noe om API-et.Eiere av organisasjonen kan slå av benchens API-legitimasjon helt for hele organisasjonen under administrasjon → Autentiseringspolicy. Den er på som standard.
Bruke den
curl -fsS https://frem.sh/_app/api/v1/orgs/<your-org>/environments \
-H "Authorization: Bearer $(cat ~/.config/fremforge/token)"Merk prefikset /_app. Den nakne stien /api/v1/… er Forgejos eget API, som ikke
godtar dette tokenet, og avvisningsmeldingen derfra siterer tokenet du sendte, så
unngå å lime inn utskriften fra et mislykket kall i en ticket eller en chat.
Suspendering, oppvåkning og hva du betaler for
Du betaler for minuttene benchen din er våken. En suspendert bench koster bare profilvolumet, så det er verdt å vite nøyaktig hva som holder den våken.
Hva som holder den våken
Benchen din holder seg oppe så lenge noe av dette er sant:
- Noen er tilkoblet: en fane i nettleseren eller en SSH-sesjon som faktisk er koblet til.
- En agent jobber. Ikke bare kjører: se nedenfor.
- Du har festet den, fra bench-siden.
Når ingen av dem gjelder, suspenderes benchen etter 30 minutter.
Hva «en agent jobber» betyr
En agent som står ved en ledetekst, jobber ikke, og det er dette skillet som avgjør regningen din. En Claude-sesjon som står åpen over natten, ser travel ut etter alle naive mål, den går fortsatt og bruker omtrent 1 % av en CPU, så vi bruker ikke CPU alene til å avgjøre det.
En agent regnes som i arbeid når en av disse er sann:
- den har skrevet til sin egen sesjonshistorikk de siste 10 minuttene, eller
- den eller noe den har startet, bruker minst 10 % av en CPU-kjerne.
Det andre punktet finnes for lange verktøykall. Hvis agenten din starter et bygg som tar tretti minutter, skriver den ingenting i tretti minutter mens den venter, men kompilatoren den startet, er travel, så benchen holder seg oppe.
En agent som virkelig ikke gjør noe, slutter derfor å holde benchen din omtrent 10 minutter etter siste aktivitet, og benchen suspenderes omtrent 30 minutter etter det: omtrent 40 minutter etter siste gang du gjorde noe, hvis ingenting annet holder den.
Det ene tilfellet du må si fra om
En lang jobb du har startet selv, ikke gjennom en agent, holder ikke benchen
våken. En make -j, en dataimport, en belastningstest: hvis du starter den i et
skall og lukker den bærbare maskinen, suspenderes benchen mens jobben kjører.
Det er med vilje. Hvis enhver travel prosess holdt en maskin våken, kunne en bench uten aktivitet holdes fakturerende for alltid av hva som helst, og det billigste å kjøre på noen andres maskin er en kryptominer. Regelen er derfor at vi bare teller arbeid vi kan knytte til en agent, og alt annet er ditt valg: fest benchen, og løsne den når jobben er ferdig.
Å holde seg tilkoblet virker også, siden en tilkoblet klient i seg selv holder benchen våken.
Oppvåkningen er automatisk: koble til, så kommer den tilbake. Filene dine er der du la dem, og terminaloppsettet ditt kommer tilbake sammen med dem: vinduene du hadde åpne, gjenskapes i de samme katalogene, og Claude, Codex, opencode og OpenChamber startes på nytt, hver gjenopptatt i sesjonen den var i, og venter ved en ledetekst. Ingenting spilles av for deg; en agent handler ikke mens du er borte.
To ting kommer ikke tilbake. En sesjon som ble startet uten en id som kan
gjenopptas, kommer tilbake som en ny sesjon i riktig katalog, og alle andre
langvarige prosesser, din egen utviklingsserver, et bygg, startes ikke på nytt. Oppgi
dem i ~/.frembench/restore-commands.txt, ett kommandonavn per linje, hvis du vil at
de skal det.
Fest en bench fra bench-siden når du har en lang jobb som sporingen vår ikke ville sett. En festing er ikke permanent: en bench som har gått for lenge uten gjenoppbygging, oppdateres uansett, fordi en maskin uten sikkerhetsoppdateringer på internett ikke er noe en festing skal kunne kjøpe.
Få en
Utviklerbencher slås på per kunde. Hvis organisasjonen din har dem, ligger siden under Innstillinger → Dev benches; hvis ikke, sier den siden det. Administratoren i organisasjonen din bestemmer hvor mange bencher kunden kan kjøre samtidig.
Én bench per organisasjon
En bench tilhører en organisasjon, ikke deg. Hvis du er medlem av flere organisasjoner som har bench-brukere, får du én bench i hver: separate maskiner, separate profiler, fakturert hver for seg til organisasjonen som tildelte bench-brukeren. Du kan ikke opprette en bench i en organisasjon som ikke har kjøpt bench-brukere, så ingen organisasjon kan faktureres for en maskin den ikke har sagt ja til.
Profiler følger deg ikke mellom organisasjoner. Hver bench har sitt eget profilvolum, så verktøyene, skallkonfigurasjonen og legitimasjonen du installerer på én bench, finnes ikke på en bench i en annen organisasjon. Sett opp hver av dem du bruker.
Dette er en følge av grensen mellom kunder, ikke en begrensning vi planlegger å fjerne: en delt profil ville betydd at én organisasjon betaler for å lagre en annen organisasjons arbeid, og ville ført filer over en grense kundene stoler på.
Bencher suspenderes uavhengig av hverandre etter tretti minutter uten aktivitet, så å ha bencher i flere organisasjoner holder ikke flere maskiner i gang: bare den du faktisk bruker, holder seg våken.
Hvorfor Claude Code ikke er forhåndsinstallert
Bench-imaget leverer codex (Apache-2.0) og opencode (MIT) klare til bruk. Claude
Code er ikke forhåndsinstallert, og det er en lisensbeslutning, ikke en
forglemmelse: lisensen er ikke åpen kildekode, og frembench er et produkt vi selger.
Å levere det i imaget vårt ville vært å videredistribuere det som del av noe vi tar
betalt for.
Å installere det selv er én kommando, og det kjører da under din avtale med Anthropic, ikke vår. Det er også grunnen til at det overlever en suspendering: profilvolumet ditt beholder det, så du installerer det én gang per bench.
Dette er den samme regelen som gjelder overalt i produktet: avhengigheter vi leverer, er suverene, oppdaterte og har fullt ut åpen kildekode-lisens. Alt som ikke består den testen, er noe du tar med selv, ikke noe vi pakker med.