Repo: github.com/tpbillund/SentinelEDU-shield
AI-Free • Secure • Focused Lokal, privatlivsvenlig indholdsfiltrering til skoler og virksomheder.
⚠️ Status: MVP / v0.1.0. Dette er en fungerende startkodebase, ikke den fulde enterprise-løsning beskrevet i det oprindelige produktspec. Se Roadmap for hvad der mangler, og Scope-noter for hvorfor.
(Kommer snart - se docs/screenshots/README.md for instruktioner til at tilføje jeres egne.)
- ✅ AI-svar filter: skjuler Google AI Overviews/AI Mode, Bing Copilot, DuckDuckGo AI Chat/Assist, Ecosia AI-svar og Yahoo AI-snippets - uden at blokere almindelig søgning, ordbog, lommeregner, kort, oversættelse, vejr eller videnspaneler. Rent kosmetisk - blokerer ikke noget.
- ✅ AI-chatbots (distraktionskategori, slået til som standard):
hård blokering (fuld blokeringsskærm + "Anmod om adgang", ligesom
spil) af selvstændige AI-chatbots (ChatGPT, Claude, Gemini, Copilot,
Perplexity) samt søgemaskiners AI-chat-sider specifikt (fx Ecosias
/ai-search, DuckDuckGos/aichat, Bings/chat) - adskilt fra AI-svar filteret ovenfor, som kun skjuler UI-elementer og aldrig blokerer. Findes kun i denne kategori-liste, ikke automatisk i eksisterende installationers gemte indstillinger - seCHANGELOG.md. - ✅ Distraktionsfilter: domænelister for spil/cloud gaming samt en adfærdsbaseret heuristik (Canvas+fullscreen, Gamepad API, Pointer Lock) der kan fange spil, der ikke står på en liste.
- ✅ 100% lokal filtrering: intet netværkskald, ingen telemetri, ingen
browserhistorik eller søgninger forlader enheden. Al politik gemmes i
chrome.storage(sync/local) på selve profilen. - ✅ Admin-dashboard (options-side): AI/distraktions-toggles, kategori-filtre, whitelist/blacklist, og en "Request Access"-kø hvor en lærer/admin kan give 15 minutters midlertidig adgang.
- ✅ Fokus-tilstand: planlagte tidsvinduer (fx skoletid) der tilføjer ekstra blokerede kategorier (sociale medier, streaming, shopping) oven på de permanente - kun i det angivne tidsrum.
- ✅ "Test en URL"-værktøj: se om en given URL ville blive blokeret lige nu (og hvorfor) uden at skulle besøge siden.
- ✅ Firefox-understøttelse (128+): fælles kodebase med Chrome/Edge/
Brave/Vivaldi/Opera via Mozillas
webextension-polyfillog en manifest, der virker i begge browser-familier uden separate builds. - ✅ Tamperbeskyttelses-værktøjer (ikke reel forhindring - se
begrundelse i "Tamperbeskyttelse"-fanen og
ADMIN.md): genererede policy-skabeloner til Chrome/Firefox enterprise-administration, samt en "sidst aktiv"-heartbeat der afslører (efter faktum) om udvidelsen har været slået fra. - ✅ Dansk/engelsk sprogtoggle: popup, admin-dashboard og selve
blokeringsskærmen kan skifte sprog uafhængigt af browserens egen
sprogindstilling (
src/shared/i18n.js). Dækker al UI-tekst i extension'en - dækker bevidst ikkeREADME.md/ADMIN.md/CHANGELOG.md, som forbliver projektdokumentation på dansk. - ✅ Signerede regelpakker: opdatér domænelisten via en URL, I selv
angiver, uden at skulle udgive en ny version af udvidelsen. Kun
aktivt hvis I sætter en URL (ellers ingen netværkskald); pakker
bliver kun anvendt, hvis de er ECDSA-signeret med jeres egen nøgle,
og kan kun tilføje domæner oven på den indbyggede liste, aldrig
fjerne eller overskrive noget. Se
ADMIN.mdpunkt 7 for fuld opsætning -tools/generate-rulepack-keypair.jsogtools/sign-rulepack.jsfølger med. - ✅ Versionstjek (fanen "Opdatering"): tjekker om der findes en
nyere GitHub Release af selve udvidelsen, og viser en besked med link
til den, både i dashboardet og popup'en - inkl. hvor mange versioner
man reelt er bagud (fx "3 versioner bagud"), ikke kun at der findes én
nyere. Kun aktivt hvis I angiver jeres repo. Installerer ikke
automatisk - det kan browseren ikke for en "Load unpacked"/"Load
Temporary Add-on"-installation, uanset hvad udvidelsen selv gør. Ren
besked, ikke en opdaterings-mekanisme.
- Tjekker automatisk med det samme ved installation/browser-genstart (ikke kun én gang i døgnet), samt manuelt via knappen i dashboardet.
- OS-besked (kræver
notifications-tilladelse): vises uden for selve extension'en, uanset hvad brugeren laver i browseren, når en ny version findes - én gang pr. ny version, ikke hver dag. Kan slås fra i "Opdatering"-fanen, men kræver en eksplicit bekræftelse af en advarsel om risikoen ved at gøre det, og viser en permanent påmindelse i fanen, mens den er slået fra.
- ✅ TypeScript: hele kodebasen er strikt type-tjekket, ingen bundler - se "Udvikling: TypeScript + build" nedenfor.
- ✅ Test-suite + CI: 45 automatiserede tests via Node's indbyggede test-runner (ingen ekstra dependencies), inkl. regressionstests for tidligere fundne bugs (netflix.com/x.com-fejlmatchet) og en reel gennemtest af regelpakke-signaturverificeringen. Kører automatisk i GitHub Actions ved hvert push/PR - se "Tests + CI" nedenfor.
- ✅ Popup: hurtig status og on/off for de to hovedfiltre.
Se Scope-noter og Roadmap - herunder Manifest V2-kompatibilitet (ældre Firefox <128 og Safari), proxy/VPN- detektion (Ultraviolet, Rammerhead m.fl.), Google Workspace/Intune/Entra ID-integration, og e2e/browser-integrationstests (den nuværende test-suite dækker unit-niveau, ikke en rigtig browser).
Al kildekode ligger som TypeScript i src/**/*.ts og bygges til
almindelig JavaScript med tsc - ingen bundler (esbuild/webpack) er
brugt. Det er ikke en tilfældighed: arkitekturen deler allerede kode
mellem filer via globale objekter (window.SentinelRules,
window.SentinelI18n) i stedet for ES-imports, netop fordi MV3 content
scripts kører isoleret pr. fil. tsc alene, uden bundling, matcher den
arkitektur perfekt - hver .ts-fil kompilerer 1:1 til den tilsvarende
.js-fil, ingen sammenfletning nødvendig. Se src/shared/types.d.ts for
de delte typer (Policy, RulePack, browser.*-API'et m.fl. - håndskrevet,
da vi ikke har adgang til @types/webextension-polyfill her).
npm install # kun typescript som dev-dependency
npm run typecheck # tsc --noEmit, ingen filer skrives
npm run build # kompilerer + kopierer HTML/ikoner/manifest-filer ind i build/
npm run clean # rm -rf buildnpm run build gør build/ til en komplet, indlæsningsklar udvidelse -
kompileret JS side om side med popup.html/options.html, ikonerne,
den vendorede polyfill, og begge manifest-filer. build/ er nu det,
man indlæser i browseren - ikke projektroden længere, siden
src/ kun indeholder .ts-kilder uden en build. npm run build bruger
tsconfig.build.json (kun src/**/*.ts) og rydder altid build/ først,
så testfilerne aldrig ender med i den faktiske, leverede udvidelse -
selv hvis npm test er kørt lige forinden.
Test-suiten (test/**/*.test.ts) bruger Node.js' indbyggede
test-runner (node:test/node:assert - tilgængelig fra Node 18+,
stabil fra Node 20+), samme "ingen unødvendige afhængigheder"-filosofi
som resten af projektet. Ingen Jest/Vitest/Mocha nødvendig.
npm test # tsc (inkl. testfilerne) + kører hele test-suitenDækker bl.a.:
- domæne/sti-matching (
hostMatches/domainCategory) - inkl. en regressionstest for det tidligere netflix.com/x.com-fejlmatch - regelpakkers additive sammenfletning (
mergeDomainSources) - versionssammenligning (
compareVersions) - Fokus-tilstands tidsvindue-logik (
isWindowActive/getActiveFocusCategories) - i18n-oversættelser, inkl. et automatisk tjek af, at dansk og engelsk altid har præcis de samme nøgler
- PIN-hashing/verificering og oplåsnings-session, via en simpel
in-memory
browser.storage-stub (test/helpers/browser-stub.ts) - Signerede regelpakker: genbruger det faktiske demo-nøglepar og
eksempel-filerne fra
examples/rulepack/til at bekræfte, at en gyldig signatur accepteres, og at manipuleret indhold/forkert signatur/ugyldig JSON afvises korrekt
GitHub Actions CI (.github/workflows/ci.yml) kører automatisk ved
hvert push/PR til main: type-tjek, hele test-suiten, fuldt build, og
en sanity-check af at alt kompileret JS og begge manifest-filer er
gyldige. Bygget build/-output uploades som et artifact på hver kørsel.
Denne zip-fil leveres med en allerede kørt npm run build, så build/
er klar til at blive indlæst med det samme - I behøver ikke Node/npm
installeret bare for at teste. Skal I ændre kode, se afsnittet ovenfor.
- Åbn
chrome://extensions(eller tilsvarende i Edge/Brave/Vivaldi/Opera). - Aktivér "Udviklertilstand".
- Klik "Indlæs upakket" og vælg mappen
build/(ikke projektroden). - Besøg google.com/bing.com/duckduckgo.com og søg efter noget - AI-svar
skal forsvinde. Besøg fx
poki.comfor at se distraktionsfilteret.
Firefox og Chrome/Edge kan ikke dele den samme manifest.json -
Edge (og formentlig ældre Chrome-versioner) afviser filen helt, hvis
den indeholder Firefox-varianten af baggrunds-deklarationen
(background.scripts), i stedet for bare at ignorere den. Derfor
findes der to manifest-filer, som begge kopieres ind i build/ af
build-scriptet:
build/manifest.json- Chrome/Edge/Brave/Vivaldi/Opera (standard)build/manifest.firefox.json- Firefox
- Inde i
build/: omdøbmanifest.jsonmidlertidigt (fx tilmanifest.chrome.json), og omdøbmanifest.firefox.jsontilmanifest.json- eller kopiér helebuild/-mappen til et separatfirefox-build/-sted og lav ombytningen der. - Åbn
about:debugging#/runtime/this-firefox. - Klik "Load Temporary Add-on…" og vælg den (nu omdøbte)
manifest.jsoninde ibuild/. - Test som ovenfor. Bemærk: en midlertidigt indlæst add-on forsvinder,
når Firefox lukkes - til en permanent installation skal udvidelsen
signeres af Mozilla (AMO), hvilket kræver en rigtig
gecko.idibrowser_specific_settings(seADMIN.md). - Kræver Firefox 128+ for fuld understøttelse af
"world": "MAIN"(bruges afrtc-tracker.jstil cloud-gaming-detektion). Ældre Firefox-versioner indlæser udvidelsen, men den del af heuristikken virker ikke der.
manifest.json - Manifest V3, permissions, content-script matches
src/background/service-worker.js - policy-init, access-request-kø, grant-expiry
src/content-scripts/
ai-detector.js - multi-signal AI-svar detektion/skjul
distraction-blocker.js - domæneliste + adfærdsheuristik + blokeringsskærm
src/shared/rules.js - al regel-/politik-konfiguration ét sted
src/popup/ - hurtig status/toggle
src/options/ - admin-dashboard (whitelist/blacklist/requests)
Reglerne i src/shared/rules.js er bevidst adskilt fra logikken, så de kan
suppleres med signerede regelpakker (se ovenfor) uden kodeændringer.
Ingen af følgende sker nogensinde i denne kodebase:
browserhistorik-upload, søgeord-upload, cookie-læsning på tværs af sites,
tastetryk-overvågning, skærmoptagelse. Al chrome.storage-data bliver på
enheden/i browserprofilen (sync-storage synkroniserer kun via brugerens
egen browser-konto, som med enhver anden extension-indstilling).
To netværksundtagelser: hvis I selv konfigurerer en regelpakke-URL
(se ovenfor), henter udvidelsen den URL (og kun den) hver 6. time - det
er fortsat rent opt-in og tomt som standard. Versionstjekket er
derimod forudkonfigureret til dette repos GitHub-side
(tpbillund/SentinelEDU-shield) og tjekker api.github.com én gang i
døgnet fra en frisk installation, uden at I selv skal gøre noget - tøm
feltet i "Opdatering"-fanen, hvis I ikke ønsker det. Ingen af
undtagelserne sender brugerdata - kun almindelige GET-forespørgsler
efter offentlig information, ligesom enhver anden softwareopdatering.
Det oprindelige spec beder om et fuldt enterprise-produkt: multi-browser support (Chrome/Edge/Firefox/Vivaldi/Brave/Opera), TypeScript + Clean Architecture + DI + Event Bus, proxy/VPN-fingerprinting mod specifikke værktøjer, Google Workspace/Intune/Entra ID-integration, signerede regelpakker, fuld test-suite og 9 dokumentationsfiler. Det er et flere-ugers/måneders team-projekt.
Denne v0.1.0 leverer en ægte fungerende arkitektur for de to
kernefunktioner (AI-filter + distraktionsfilter) plus admin-dashboard, så
den kan testes med det samme og udvides modul for modul. Jeg har bevidst
udeladt proxy-circumvention-fingerprinting af specifikke navngivne
værktøjer (Ultraviolet, Rammerhead osv.) fra denne leverance - den slags
signaturer ændrer sig hurtigt og bør leve i en separat, hyppigt opdateret
regelpakke snarere end i basiskoden; heuristik-laget i
distraction-blocker.js er designet til at kunne udvides med den slags
signaturer.
- Proxy/tunnel-heuristik som separat, hyppigt opdateret regelpakke
- Google Workspace / Intune / Entra ID policy-import (CSV/XML/REST)
- E2e/browser-integrationstests (Playwright er allerede tilgængeligt i miljøet, ikke brugt endnu)
- WCAG 2.2 AA-gennemgang
- INSTALL.md, CONTRIBUTING.md, SECURITY.md, CHANGELOG.md, API.md
MIT - Copyright (c) 2026 Thomas Bøg Petersen. Se LICENSE for den fulde
tekst. Domænelisterne i src/shared/rules.js samt jeres egne
whitelist/blacklist-indstillinger er undtaget og må frit kopieres/ændres
af alle (se undtagelsen nederst i LICENSE).