statichoster lar deg publisere målrettet, kortvarig informasjon som en HTML-side — tilpasset målgruppen, pedagogisk oppsatt, klar på sekunder. Ikke permanente docs. Ikke Confluence. Informasjon som løser opp en situasjon og utløper når den har gjort jobben.
Forstå dette, så forstår du alt.
Statichoster er nøytral — den bryr seg ikke om innholdet, bare at det utløper. Men her er de vanligste brukergruppene.
Tommelfingerregel: Hvis du ville slettet det etter sprinten, eller det er feil innen fredag — bruk statichoster.
De dekker ulike faser av informasjonens livsløp. Statichoster er «nå». Confluence er «for alltid».
statichoster.
Hvis du ikke spesifiserer noe, er siden privat — bare ansatte som er logget inn med Entra ID i REMA 1000, kan åpne den. Gjestekontoer får avslag. Public krever at du aktivt velger det, og at du forstår risikoen.
Krever Entra ID-innlogging
?k=…) står bare i eierlenken og gir rett til å endre, slette og dele. Del aldri eierlenken# utelat visibility, eller eksplisitt:
"visibility": "private"
Alle med URL-en kan lese
"visibility": "public""visibility": "public" // bevisst valg
Tatt feil valg? PATCH /api/upload/{slug} endrer synlighet i ettertid. Men: hvis URL-en allerede er kopiert mens siden var public, har du ingen garanti for at innholdet ikke alt er lest eller kopiert. Slett siden hvis du frykter lekkasje.
Ingen oppsett, ingen API-nøkkel, ingen konfigurasjon. POST HTML + TTL, få en URL tilbake.
# Publiser en privat side med 7 dagers levetid (default) curl -X POST https://rema-statichoster-test.azurewebsites.net/api/upload \ -H "Content-Type: application/json" \ -d { "html": "<!DOCTYPE html><html>...</html>", "ttl": 604800 // visibility utelatt → "private" som default } # Svar: { "url": "https://rema-statichoster-test.azurewebsites.net/api/p/xK9mPq2R", "ownerUrl": "https://rema-statichoster-test.azurewebsites.net/api/p/xK9mPq2R?k=pW7mKqLs", // bare for deg "password": "pW7mKqLs", // Ta vare på dette! "visibility": "private", "expiresAt": "2026-04-21T10:00:00Z" } # Mottaker logger inn med Entra ID — klikker URL-en — ser siden. # Etter 7 dager: 404, og innholdet slettes. Ingen opprydding. # For en public side (alle med URL kan lese, ingen pålogging): # legg til "visibility": "public" i body. Les /#synlighet først.
Alt i statichoster er designet rundt én idé: informasjon har en holdbarhetsdato.
Hver side får en levetid ved opprettelse. Når den utløper, returnerer lenken 404, og innholdet slettes innen fem minutter. Ingen manuell opprydding. Ingen «hvem eier denne Confluence-siden?»-diskusjoner.
Siden du publiserer er full HTML — du har total kontroll over presentasjonen. Lag en teknisk deep-dive for arkitekten, eller en visuell oppsummering for lederen. Samme data, forskjellig presentasjon.
Det finnes ingen admin-panel og ingen liste over alle sider. Når levetiden er ute, sletter tjenesten selv innholdet og engangslenkene, uten ekstra oppbevaringstid. Sider lever, brukes, og dør. Systemet er designet for å glemme.
PUT til samme slug oppdaterer innholdet uten å endre URL. Mottakere med bokmerke ser alltid siste versjon. Perfekt for ukentlige rapporter eller løpende status.
Hver side får et unikt eierpassord ved opprettelse. Det står bare i eierlenken og gir rett til å endre, slette og dele siden. Mottakeren trenger bare å klikke — private sider krever Entra ID-innlogging.
Azure Functions (Consumption), Table Storage, Blob Storage. Hele tjenesten koster under en kaffekopp — per kvartal. Managed Identity, ingen hemmeligheter i kode.
Alt kjører i Støperiet-subscriptionen i Norway East. Bicep IaC. RBAC. Consumption plan.
Ingen API-nøkkel. Ingen autentisering. POST HTML + TTL, få en delbar URL tilbake. Alt du trenger er HTTP.
https://rema-statichoster-test.azurewebsites.net
password fra POST-svaret. Du trenger det for PUT, PATCH, DELETE og status.
url, behold ownerUrl. url er for mottakere og har aldri passord; private sider krever Entra ID-innlogging. ownerUrl er for deg — den viser et eier-overlay med del-funksjon.
visibility → siden krever Entra ID-innlogging. Sett "visibility": "public" kun når mottakeren ikke har Entra ID OG du har vurdert at innholdet tåler at URL-en lekker. Anta da at innholdet kan ende på offentlig internett.
Skriv slides som markdown, eksporter til standalone HTML med Marp CLI, post til statichoster. Et PowerPoint-vedlegg blir til en delbar URL.
Marp-frontmatter på toppen, én slide per ---. Velg default, gaia eller uncover som tema.
Marp CLI baker slides, CSS og tastaturnavigasjon inn i én fil. Ingen eksterne avhengigheter — perfekt for statichoster sitt 4 MB-tak.
Post HTML-en til /api/upload. Du får en URL. Mottaker blærer med piltaster i nettleseren.
# Installer Marp CLI — engangskjent npm install -g @marp-team/marp-cli # Skriv slides.md med frontmatter --- marp: true theme: gaia paginate: true --- # Q1-resultater Hovedpunkter for styremøtet --- ## Tre nøkkeltall - Omsetning +12% - Marginer stabile - Nye butikker: 8 --- # Neste kvartal Fokus på vareflyt og digitalt # Eksporter til selvstendig HTML marp slides.md --html -o slides.html # Publiser via statichoster — 7 dagers TTL, privat (default) curl -X POST https://rema-statichoster-test.azurewebsites.net/api/upload \ -H "Content-Type: application/json" \ -d "{\"html\":$(jq -Rs . < slides.html),\"ttl\":604800}" # Del URL-en. Mottakeren bruker ← → for å navigere.
Denne landingssiden er åpent tilgjengelig — Claude kan WebFetche den direkte, eller du kan peke på URL-en i CLAUDE.md. Eksempel-prompt:
"Lag en 5-slides presentasjon for ledergruppen om Q1-resultatene
basert på rapporten i denne tråden. Bruk Marp med gaia-tema,
eksporter til HTML, publiser via statichoster med 14 dagers TTL.
Returner URL-en når du er ferdig."
Slides er talepunkter, ikke essay. Skriver du i markdown er det fristende å pakke hver slide full — ikke gjør det.
Har du to poenger, lag to slides. Slides er gratis — oppmerksomhet er ikke.
Ingen hele setninger. Ingen avsnitt. Bullets er hint, ikke skript.
Lesbar fra bakerst i rommet. Hvit luft er det som gjør innholdet leselig.
Kan du vise det, ikke skriv det. Tabeller på slides er nesten alltid feil.
Hvert endepunkt med request/response, feltbeskrivelser og feilkoder. Kopier curl-eksemplene direkte.
Opprett en ny side med HTML-innhold og TTL. Returnerer to URL-er: url for deling og ownerUrl for administrasjon. Opplasting skal kreve et Entra ID-token med app-rollen Statichoster.Publish som Authorization: Bearer. Til kravet slås på, virker opplasting uten token som før. Et token som sendes, sjekkes allerede: ugyldig gir 401, uten rollen 403.
| Felt | Type | Beskrivelse | |
|---|---|---|---|
html | string | påkrevd | Full HTML. Maks 4 MB. Selvforsynt (inline CSS/JS). |
ttl | integer | påkrevd | Levetid i sekunder. Min 1, maks 31536000 med Entra-token, 2592000 uten. |
visibility | string | valgfri | "private" (default, krever Entra ID) eller "public". |
| Felt | Beskrivelse |
|---|---|
url | Del denne. Ren URL uten passord. Private sider krever Entra ID-innlogging. |
ownerUrl | URL med ?k= — viser eier-overlay med del-funksjon. Bruk denne selv, ikke del denne. |
password | Passordet — ta vare på dette for PUT/PATCH/DELETE |
slug | 8-tegns unik identifikator for siden. |
visibility | "public" eller "private" |
expiresAt | ISO 8601 utløpstidspunkt |
curl -X POST https://rema-statichoster-test.azurewebsites.net/api/upload \ -H "Content-Type: application/json" \ -d '{"html":"<!DOCTYPE html><html><body><h1>Hei</h1></body></html>","ttl":86400,"visibility":"public"}' # Svar (public): { "url": "https://rema-statichoster-test.azurewebsites.net/api/p/xK9mPq2R", "ownerUrl": "https://rema-statichoster-test.azurewebsites.net/api/p/xK9mPq2R?k=pW7mKqLsNtRv", "password": "pW7mKqLsNtRv", "slug": "xK9mPq2R", "visibility": "public", "expiresAt": "2026-04-15T12:00:00Z" } # url = del med mottaker (public: uten passord) # ownerUrl = din admin-lenke (viser eier-overlay)
Tre måter å åpne en side på:
| URL | Beskrivelse |
|---|---|
/api/p/{slug} | Public sider: åpen tilgang uten passord. Del denne med mottakere. |
/api/p/{slug}?k={passord} | Eier-modus: viser eier-overlay med del-funksjon. Bruk for administrasjon. |
/api/p/{slug}?t={token} | Engangslenke: fungerer én gang, for private sider uten Entra ID. |
| Status | Betingelse |
|---|---|
200 | Public side, gyldig passord, eller gyldig engangstoken |
401 | Private side uten credentials, feil passord, eller brukt/utløpt token |
404 | Slug finnes ikke, eller TTL har utløpt |
Erstatt HTML-innholdet på en eksisterende side. URL-en forblir den samme. Passordet fra opprettelsen beviser eierskap. Valgfritt: forleng TTL.
| Felt | Type | Beskrivelse | |
|---|---|---|---|
html | string | påkrevd | Ny HTML. Erstatter eksisterende umiddelbart. |
password | string | påkrevd | Passordet fra opprettelsen. |
ttl | integer | valgfri | Ny levetid fra nå. Utelat for å beholde eksisterende utløp. |
| Felt | Beskrivelse |
|---|---|
url | Samme URL som før (uendret) |
expiresAt | Nytt utløpstidspunkt (hvis TTL ble gitt) |
401 feil passord · 404 ikke funnet/utløptcurl -X PUT https://rema-statichoster-test.azurewebsites.net/api/upload/xK9mPq2R \ -H "Content-Type: application/json" \ -d '{"html":"<html>Oppdatert innhold</html>","password":"pW7mKqLsNtRv","ttl":604800}'
Oppdater TTL, synlighet eller eierpassordet uten å røre HTML-innholdet. Minst én av ttl, visibility, rotatePassword eller revokeShareLinks må oppgis. En side som alt er utløpt, kan ikke forlenges: PATCH og PUT svarer 404, og innholdet slettes.
| Felt | Type | Beskrivelse | |
|---|---|---|---|
password | string | påkrevd | Eierskapsbevis. |
ttl | integer | valgfri | Ny levetid fra nå. |
visibility | string | valgfri | "public" eller "private". |
rotatePassword | boolean | valgfri | true gir siden et nytt eierpassord. Det gamle slutter å virke med en gang. Sidenavnet, url og engangslenker som alt er laget, er de samme. |
revokeShareLinks | boolean | valgfri | true trekker tilbake alle ubrukte engangslenker som er laget til nå; de gir 404. Sidenavnet og url er de samme, og nye engangslenker virker. Sammen med rotatePassword skjer begge deler i én skriving. |
200 med url, visibility, expiresAt. Med rotatePassword også slug, det nye password og ny ownerUrl; ta vare på dem, de vises bare én gang. Med revokeShareLinks også shareLinksRevokedAt.curl -X PATCH https://rema-statichoster-test.azurewebsites.net/api/upload/xK9mPq2R \ -H "Content-Type: application/json" \ -d '{"password":"pW7mKqLsNtRv","ttl":2592000,"visibility":"public"}'
Slett en side og dens innhold permanent. Passord beviser eierskap. Returnerer 204 No Content. Ingen gjenoppretting mulig.
| Felt | Type | |
|---|---|---|
password | string | påkrevd |
curl -X DELETE https://rema-statichoster-test.azurewebsites.net/api/upload/xK9mPq2R \ -H "Content-Type: application/json" \ -d '{"password":"pW7mKqLsNtRv"}'
Sjekk om en side fortsatt er aktiv, når den utløper, og synligheten. Nyttig for AI-agenter som vil vite om de skal oppdatere eller opprette en ny side.
| Felt | Beskrivelse |
|---|---|
slug | Sidens identifikator |
isExpired | true/false — om TTL har utløpt |
visibility | "private" eller "public" |
expiresAt | ISO 8601 utløpstidspunkt |
createdAt | Opprettelsestidspunkt |
updatedAt | Siste PUT/PATCH-tidspunkt (null hvis aldri oppdatert) |
| Status | Betingelse |
|---|---|
401 | Feil passord |
404 | Slug finnes ikke |
isExpired: true, deretter 404. En utløpt side kan ikke forlenges eller oppdateres; opprett en ny side.
curl "https://rema-statichoster-test.azurewebsites.net/api/upload/xK9mPq2R/status?k=pW7mKqLsNtRv" # Svar: { "slug": "xK9mPq2R", "isExpired": false, "visibility": "public", "expiresAt": "2026-04-21T12:00:00Z", "createdAt": "2026-04-14T12:00:00Z", "updatedAt": null }
POST /api/upload med HTML, TTL og visibilityurl fra svaret — klar til å klikkePUT for å oppdatere, eller la TTL gjøre jobben