Skip to content

Repository files navigation

SentinelEDU Shield™

Read in English

Repo: github.com/tpbillund/SentinelEDU-shield

CI

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.

Screenshots

(Kommer snart - se docs/screenshots/README.md for instruktioner til at tilføje jeres egne.)

Hvad virker i denne version

  • 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 - se CHANGELOG.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-polyfill og 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 ikke README.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.md punkt 7 for fuld opsætning - tools/generate-rulepack-keypair.js og tools/sign-rulepack.js fø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.

Hvad er IKKE inkluderet endnu

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).

Udvikling: TypeScript + build

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 build

npm 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.

Tests + CI

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-suiten

Dæ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.

Installation (udvikling)

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.

Chrome, Edge, Brave, Vivaldi, Opera

  1. Åbn chrome://extensions (eller tilsvarende i Edge/Brave/Vivaldi/Opera).
  2. Aktivér "Udviklertilstand".
  3. Klik "Indlæs upakket" og vælg mappen build/ (ikke projektroden).
  4. Besøg google.com/bing.com/duckduckgo.com og søg efter noget - AI-svar skal forsvinde. Besøg fx poki.com for at se distraktionsfilteret.

Firefox (128 eller nyere)

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
  1. Inde i build/: omdøb manifest.json midlertidigt (fx til manifest.chrome.json), og omdøb manifest.firefox.json til manifest.json - eller kopiér hele build/-mappen til et separat firefox-build/-sted og lav ombytningen der.
  2. Åbn about:debugging#/runtime/this-firefox.
  3. Klik "Load Temporary Add-on…" og vælg den (nu omdøbte) manifest.json inde i build/.
  4. 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.id i browser_specific_settings (se ADMIN.md).
  5. Kræver Firefox 128+ for fuld understøttelse af "world": "MAIN" (bruges af rtc-tracker.js til cloud-gaming-detektion). Ældre Firefox-versioner indlæser udvidelsen, men den del af heuristikken virker ikke der.

Arkitektur

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.

Privatliv

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.

Scope-noter (vigtigt)

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.

Roadmap

  • 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

Licens

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).

About

Local, privacy-first browser extension for schools: hides AI answers (Google/Bing/DuckDuckGo), blocks distracting games/streaming/social media, focus mode, admin dashboard with PIN, signed rule packs, and version checks. Runs 100% locally - no data sent without explicit setup. MIT licensed.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages