diff --git a/CLAUDE.md b/CLAUDE.md index 2991d76..fbc0e88 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -137,13 +137,15 @@ maskinrommet deler verktøykasse. - **Root-login:** Deaktivert - **Server-filer:** `/srv/synops/` (docker-compose.yml, .env, config/, data/) - **Domener (synops.no er primær):** - - `synops.no` — Plattform (app + landingsside + /pub/) + - `synops.no` — Offentlig landingsside + /pub/* + /media/* (Caddy → statisk + maskinrommet) + - `ws.synops.no` — Appen (SvelteKit + /api/* → maskinrommet). Krever login. - `auth.synops.no` — Authentik SSO - - `api.synops.no` — Maskinrommet API + - `api.synops.no` — Maskinrommet direkte (CLI, webhooks, eksternt) - `git.synops.no` — Forgejo (SSH port 222) - - `sidelinja.org` — Tenant-redirect til synops.no - - `vegard.info` — Personlig nettsted - - `*.sidelinja.org` — bakoverkompatible aliaser (auth, api, git) + - `vegard.info` — Personlig nettsted (statisk) + - `sidelinja.org` — Redirect til synops.no + - `workspace.synops.no` — Legacy redirect til ws.synops.no + - `*.sidelinja.org` — Legacy aliaser (auth, api, git) ## Git - **Repos i Forgejo:** diff --git a/frontend/.env.example b/frontend/.env.example index 2ed806e..1dc5fb2 100644 --- a/frontend/.env.example +++ b/frontend/.env.example @@ -1,9 +1,10 @@ # Authentik OIDC -AUTHENTIK_ISSUER=https://auth.sidelinja.org/application/o/sidelinja/ +AUTHENTIK_ISSUER=https://auth.synops.no/application/o/sidelinja/ AUTHENTIK_CLIENT_ID= AUTHENTIK_CLIENT_SECRET= AUTH_SECRET= AUTH_TRUST_HOST=true +ORIGIN=https://ws.synops.no # Maskinrommet API -MASKINROMMET_URL=https://api.sidelinja.org +MASKINROMMET_URL=http://127.0.0.1:3100 diff --git a/frontend/src/auth.ts b/frontend/src/auth.ts index 5400bc1..3c837a5 100644 --- a/frontend/src/auth.ts +++ b/frontend/src/auth.ts @@ -15,7 +15,7 @@ interface AuthentikProfile { * Called once at sign-in so the node_id is cached in the JWT for future requests. */ async function fetchNodeId(accessToken: string): Promise { - const url = env.MASKINROMMET_URL ?? 'https://api.sidelinja.org'; + const url = env.MASKINROMMET_URL ?? 'http://127.0.0.1:3100'; try { const res = await fetch(`${url}/me`, { headers: { Authorization: `Bearer ${accessToken}` } @@ -36,7 +36,7 @@ async function fetchNodeId(accessToken: string): Promise { * Stores Authentik preferred_username in auth_identities.username. */ async function syncUsername(accessToken: string, username: string): Promise { - const url = env.MASKINROMMET_URL ?? 'https://api.sidelinja.org'; + const url = env.MASKINROMMET_URL ?? 'http://127.0.0.1:3100'; try { const res = await fetch(`${url}/auth/sync`, { method: 'POST', diff --git a/frontend/src/hooks.server.ts b/frontend/src/hooks.server.ts index e95b3f5..0acc4a7 100644 --- a/frontend/src/hooks.server.ts +++ b/frontend/src/hooks.server.ts @@ -2,36 +2,18 @@ import { redirect, type Handle } from '@sveltejs/kit'; import { handle as authHandle } from './auth'; import { sequence } from '@sveltejs/kit/hooks'; -/** Protect all routes except /signin and /auth/* (OIDC callback paths). */ +/** Protect all routes except /auth/* (OIDC callback paths). */ const authorizationHandle: Handle = async ({ event, resolve }) => { const path = event.url.pathname; - // Allow auth-related routes and signin through without session check + // Auth-ruter trenger ikke session-sjekk if (path.startsWith('/auth/') || path === '/signin') { return resolve(event); } const session = await event.locals.auth(); - - // Landing page: only on synops.no (not workspace.synops.no) - if (path === '/') { - const host = event.url.hostname; - if (host.startsWith('workspace.')) { - // workspace.synops.no: uautentisert → login, autentisert → vis direkte - if (!session?.user) { - throw redirect(303, '/auth/signin'); - } - return resolve(event); - } - // synops.no: vis landingsside for alle - if (session?.user) { - throw redirect(303, '/workspace'); - } - return resolve(event); - } - if (!session?.user) { - throw redirect(303, '/signin'); + throw redirect(303, '/auth/signin'); } return resolve(event); diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 0c5f9f6..6e9f038 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -1,7 +1,6 @@ /** * Client for maskinrommet intentions API. - * Uses the Vite dev proxy (/api → api.sidelinja.org) in development. - * In production, set VITE_API_URL to the maskinrommet URL. + * Uses /api which Caddy proxies to maskinrommet (127.0.0.1:3100). */ const BASE_URL = import.meta.env.VITE_API_URL ?? '/api'; diff --git a/frontend/src/lib/components/LandingPage.svelte b/frontend/src/lib/components/LandingPage.svelte deleted file mode 100644 index fe836b6..0000000 --- a/frontend/src/lib/components/LandingPage.svelte +++ /dev/null @@ -1,92 +0,0 @@ -
-
-
- - -
- -
-

Stappfull av features
(hvorav et fåtall virker som forutsatt)

-

En useriøs plattform for kommunikasjon, redaksjonelt arbeid, podcastproduksjon og egentlig alt du vil. Bygget med uvitenhet, overmot og en urimelig mengde AI-assistanse.

- Kom i gang → -
- -
- -
-

Alt er noder

Meldinger, oppgaver, lydfiler, dokumenter, mennesker — alt er samme ting med ulike relasjoner. Elegansen i dette vil slå deg en dag. Eller forvirre deg. Sannsynligvis begge.

-

Podcast-studio

Spill inn med kolleger via nettleseren. Lydmixer, sound pads, stemmeeffekter og en AI som dytter fakta på deg mens du snakker. Om den finner noen.

-

Publiseringsplattform

Skriv en chatmelding. Se den vokse til en artikkel. Publiser den på nettet med et tema som ser ut som du brukte måneder på det. Du brukte sekunder.

-

Spatial arbeidsflate

Dra verktøy rundt på en uendelig flate. Chat ved siden av kanban ved siden av kalender ved siden av lydstudio. Det er som et skrivebord, bare at du aldri finner noe.

-

@bot overalt

Skriv @bot i en hvilken som helst samtale. En AI svarer, diskuterer og fanger opp oppgaver i bakgrunnen. Hvilken AI? Den som tilfeldigvis er oppe akkurat nå.

-

Kunnskapsgraf

Alt du skriver, sier og lenker bygger en levende graf av kunnskap. Synops husker sammenhenger du selv har glemt. Eller fabrikkerer nye. Vanskelig å si.

-
- -
- -
-

Er Synops sikkert?

Hahaha. Overhodet ikke. Vi kjører på én server, med én utvikler, og en AI som committer kode uten tilsyn. Men dataene dine er i hvert fall kryptert i transit. Og vi mener det godt.

-

Kan jeg stole på at ting fungerer?

Du kan stole på at vi prøver. Og at PostgreSQL er mer pålitelig enn resten av stacken. Sannsynligheten for at akkurat den funksjonen du trenger virker akkurat nå er statistisk sett overraskende høy.

-

Hvem er dette for?

Folk som lager podcast, skriver tekster, eller driver redaksjonelt arbeid — og som har en uforklarlig toleranse for betaversjoner. Tålmodige optimister. Eventyrlystne journalister. Eller folk som bare vil pludre med noen kompiser og kanskje ha en videosamtale.

-

Koster det noe?

Nei.. altså, aah. Hvis du har for mye penger så skal vi finne en måte å ta imot? Det koster utvikleren søvn og penger, men deg koster det ingenting. Foreløpig. Muligens for alltid. Vi har ikke kommet så langt i forretningsplanen.

-

Er det open source?

Koden bor på en Forgejo-instans som er omtrent like tilgjengelig som resten av plattformen. Vi har intensjoner om åpenhet. Intensjoner er det vi er best på.

-
- -
- -
-
★★☆☆☆
«Jeg trodde virkelig dette hadde potensiale!»
— Anonym betatester
-
★★★☆☆
«Ideen var ok. Gjennomføringen... original.»
— En som prøvde
-
- -
- -
-

Hva kan du forvente?

-

Som bruker av Synops kan du forvente en dønn ustabil plattform som er i stadig endring, men som du likevel tenker at det er en grunn til å være på. Nye features dukker opp uten forvarsel. Gamle features forsvinner uten forvarsel. Og en og annen gang fungerer alt samtidig — og da er det ganske magisk.

- -
- -

synops.no — et hobbyprosjekt med ambisjoner over evne

-
-
- - diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index 1f534d8..f8c4fa9 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -7,8 +7,6 @@ import NewChatDialog from '$lib/components/NewChatDialog.svelte'; import AudioPlayer from '$lib/components/AudioPlayer.svelte'; import { createNode, createEdge, createCommunication, casUrl } from '$lib/api'; - import LandingPage from '$lib/components/LandingPage.svelte'; - const session = $derived($page.data.session as Record | undefined); const nodeId = $derived(session?.nodeId as string | undefined); const accessToken = $derived(session?.accessToken as string | undefined); @@ -294,9 +292,6 @@ } -{#if !$page.data.session?.user} - -{:else}
@@ -540,4 +535,3 @@ /> {/if}
-{/if} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 9bd428f..5de404d 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -7,7 +7,7 @@ export default defineConfig({ server: { proxy: { '/api': { - target: 'https://api.sidelinja.org', + target: 'http://127.0.0.1:3100', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') }