Gå til hovedinnhold

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

StandardLarge
Maskin2 vCPU, 8 GB4 vCPU, 16 GB
Bench-bruker39 € / måned78 € / måned
Legger til i den felles potten200 timer400 timer
Potttimer brukt per kjøretime12
Utover potten0,20 € / time0,40 € / time
Det meste en bench-bruker kan koste i en måned99 €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:

HvaOverlever en suspendering
Koden din, node_modules, byggeresultatene dineja
Dotfiler, skallhistorikk, git-konfigurasjon, SSH-nøklerja
npm i -g, pip --user, uv tool, pipx, cargo install, go installja
Innloggingen din i Claude Codeja
apt installnei

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
done

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

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

To ting du ikke skal kopiere:

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

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

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

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

TasterHva det gjør
Ctrl-b cNytt vindu: start en agent nummer to her
Ctrl-b n / Ctrl-b pNeste / forrige vindu
Ctrl-b 0 … Ctrl-b 9Hopp rett til et vindu
Ctrl-b wVelg 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 zForstørr én rute til fullskjerm, og tilbake
Ctrl-b dKoble 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/startup kjø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-resize er 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 dev

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

PortTjeneste
5173node
8000python3

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: node i stedet for vite, fordi det er det prosessen kaller seg selv. Den viser Unknown for 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 localhost eller 0.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.

LegitimasjonHvorHva den når
Git-legitimasjon~/.git-credentialsgit clone / push / pull, og Forgejos eget API på /api/v1/…
API-legitimasjon~/.config/fremforge/tokenfremforge-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.