@networkpro/web v1.13.0
π Network Proβ’ β Web Presence
Locking Down Networks, Unlocking Confidenceβ’
Security, Networking, Privacy β Network Proβ’
Β
π Project Overview
This GitHub repository powers the official web presence of Network Pro Strategies β a privacy-first consultancy specializing in cybersecurity, network engineering, and information security. We also lead public advocacy efforts promoting digital privacy and responsible cyber policy.
Built with SvelteKit and deployed via Netlify.
Blog and documentation subsites built with Material for MkDocs and deployed via GitHub Pages.
All infrastructure and data flows are designed with maximum transparency, self-hosting, and user privacy in mind.
Table of Contents
- Changelog
- Repository Structure
- Getting Started
- Configuration
- Service Worker Utilities
- CSP Report Handler
- Testing
- Recommended Toolchain
- Tooling Configuration
- Available Scripts
- License
- Questions
π Changelog
For a history of changes to the Network Proβ’ Web Presence, see the CHANGELOG. All notable updates are documented there.
This project follows the principles of Keep a Changelog, though formatting and versioning may occasionally vary.
π Repository Structure
.
βββ .github/
β βββ workflows/ # CI workflows (e.g. test, deploy)
βββ .vscode/
β βββ customData.json # Custom CSS IntelliSense (e.g. FontAwesome)
β βββ extensions.json # Recommended VS Code / VSCodium extensions
β βββ extensions.jsonc # Commented version of extensions.json
β βββ settings.json # Workspace settings
βββ netlify/
β βββ edge-functions/
β β βββ csp-report.js # Receives CSP violation reports
βββ scripts/ # General-purpose utility scripts
βββ src/
β βββ app.html # Entry HTML (CSP meta, bootstrapping)
β βββ hooks.client.ts # Client-side error handling
β βββ hooks.server.js # Injects CSP headers and permissions policy
β βββ lib/ # Components, utilities, types, styles
β β βββ components/ # Svelte components
β β βββ data/ # Custom data (e.g. JSON, metadata, constants)
β β βββ utils/ # Helper utilities
β βββ routes/ # SvelteKit pages (+page.svelte, +server.js)
β βββ service-worker.js # Custom PWA service worker
βββ static/ # Public assets served at site root
β βββ disableSw.js # Service worker bypass (via ?nosw param)
β βββ manifest.json # PWA metadata
β βββ robots.txt # SEO: allow/disallow crawlers
β βββ sitemap.xml # SEO: full site map
βββ tests/
β βββ e2e/ # Playwright end-to-end tests
β βββ internal/ # Internal audit/test helpers
β β βββ auditCoverage.test.js # Warns about untested source modules
β βββ unit/ # Vitest unit tests
βββ _redirects # Netlify redirect rules
βββ CHANGELOG.md # Chronological record of notable project changes
βββ netlify.toml # Netlify configuration
βββ package.json # Project manifest (scripts, deps, etc.)
βββ ...Β
π static/pgp/ Directory Structure
This directory contains public PGP key files and their corresponding QR codes.
static/
βββ pgp/
β βββ contact@s.neteng.pro.asc # Public key for secure email
β βββ pgp-contact.png # QR code (PNG) for secure email key
β βββ pgp-contact.webp # Optimized WebP version of the QR code
β βββ pgp-security.png # QR code (PNG) for security contact key
β βββ pgp-security.webp # WebP version of the security QR code
β βββ pgp-support.png # QR code (PNG) for support key
β βββ pgp-support.webp # WebP version of the support QR code
β βββ security@s.neteng.pro.asc # Public key for security contact
β βββ support@neteng.pro.asc # Public key for general support
βββ ....ascfiles are excluded from service worker precaching but served directly via the/pgp/[key]route.- QR code images are served statically by the
/pgproute using<picture>elements. - WebP versions are also used in the
/pgproute, while the/aboutroute imports dynamic equivalents fromsrc/lib/img/qr. - This route does not use fallback rendering; only explicitly defined files are available and expected to resolve.
- A dynamic
[key]/+server.jshandler undersrc/routes/pgp/serves the.ascfiles with appropriateContent-Typeand download headers.
Β
E2E Test Structure
End-to-end tests are located in tests/e2e/ and organized by feature or route:
tests/
βββ e2e/
β βββ app.spec.js # Desktop and mobile route tests
β βββ mobile.spec.js # Mobile-specific assertions
β βββ shared/
β βββ helpers.js # Shared test utilities (e.g., getFooter, setDesktopView, setMobileView)
βββ ...π Getting Started
π¦ Environment Setup
git clone https://github.com/netwk-pro/netwk-pro.github.io.git
cd netwk-pro.github.io
cp .env.template .env
npm installEdit .env to configure your environment mode:
ENV_MODE=dev # Options: dev, test, ci, preview, prod
ENV_MODEis used for tooling and workflows β not by SvelteKit itself.
UseVITE_-prefixed env variables for runtime values.
Β
π§° Local Setup Scripts
To streamline onboarding and enforce project conventions, you may use the optional helper scripts:
| File/Script | Description |
|---|---|
.env.template | Template for local environment variables |
scripts/checkNode.js | Validates your Node.js and npm versions |
scripts/bootstrap.local.sh (TBD) | Interactive setup for local configuration and tooling |
.vscode/ | Editor recommendations compatible with VSCodium / VS Code |
To get started quickly:
cp .env.template .env
npm installYou can also use
bootstrap.local.shto automate the steps above and more (optional).ENV_MODEcontrols local tooling behavior β it is not used by the app runtime directly.
Β
πΎ Version Enforcement
To ensure consistent environments across contributors and CI systems, this project enforces specific Node.js and npm versions via the "engines" field in package.json:
"engines": {
"node": ">=22.0.0 <25",
"npm": ">=11.0.0 <12"
}Version compliance is softly enforced after installation via a postinstall lifecycle hook:
npm run check:nodeThis script runs scripts/checkNode.js, which compares your current Node.js and npm versions against the required ranges. During the install phase, it will log warnings for out-of-range versions but allow installation to continue. In all other contexts (manual runs, CI workflows, etc.), it will fail with a descriptive error if the versions are out of spec.
Node Version Check (snippet from scripts/checkNode.js)
const semver = require('semver');
const { engines } = require('../package.json');
const requiredNode = engines.node;
const requiredNpm = engines.npm;
const isPostInstall = process.env.npm_lifecycle_event === 'postinstall';
let hasError = false;
if (!semver.satisfies(process.version, requiredNode)) {
const msg = `Node.js ${process.version} does not satisfy required range: ${requiredNode}`;
isPostInstall ? console.warn(`β οΈ ${msg}`) : console.error(`β ${msg}`);
if (!isPostInstall) hasError = true;
}
const npmVersion = require('child_process')
.execSync('npm -v')
.toString()
.trim();
if (!semver.satisfies(npmVersion, requiredNpm)) {
const msg = `npm ${npmVersion} does not satisfy required range: ${requiredNpm}`;
isPostInstall ? console.warn(`β οΈ ${msg}`) : console.error(`β ${msg}`);
if (!isPostInstall) hasError = true;
}
if (!hasError) {
console.log('β
Node and npm versions are valid.');
} else {
process.exit(1);
}For full compatibility, .nvmrc and .node-version files are provided to work seamlessly with version managers like nvm, asdf, and Volta. This ensures consistent environments across local development, CI pipelines, and deployment targets.
To manually verify your environment:
node -v # Should fall within engines.node
npm -v # Should fall within engines.npmπ‘οΈ Configuration
This project includes custom runtime configuration files for enhancing security, error handling, and PWA functionality. These modules are used by the framework during server- and client-side lifecycle hooks.
π hooks.server.js
Located at src/hooks.server.js, this file is responsible for injecting dynamic security headers. It includes:
- Content Security Policy (CSP) with support for relaxed directives (inline scripts allowed)
- Permissions Policy to explicitly disable unnecessary browser APIs
- X-Content-Type-Options, X-Frame-Options, and Referrer-Policy headers
π‘ The CSP nonce feature has been disabled. Inline scripts are now allowed through the policy using the
"script-src 'self' 'unsafe-inline'"directive. If you wish to use nonces in the future, you can re-enable them by uncommenting the relevant sections inhooks.server.jsand modifying your inline<script>tags.
To re-enable nonce generation for inline scripts in the future:
- Uncomment the nonce generation and injection logic in
hooks.server.js. - Add
nonce="__cspNonce__"to inline<script>blocks inapp.htmlor route templates.
π‘ The
[headers]block innetlify.tomlhas been deprecated β all headers are now set dynamically from within SvelteKit.
Β
π§ hooks.client.ts
Located at src/hooks.client.ts, this file is currently limited to handling uncaught client-side errors via the handleError() lifecycle hook.
Client-side PWA logic (such as handling the beforeinstallprompt event, checking browser compatibility, and registering the service worker) has been moved to src/lib/registerServiceWorker.js for better modularity and testability.
π‘ This separation ensures that error handling is isolated from PWA lifecycle logic, making both concerns easier to maintain.
βοΈ Service Worker Utilities
This project includes modular service worker management to support PWA functionality, update lifecycles, and debugging workflows.
β
registerServiceWorker.js
Located at src/lib/registerServiceWorker.js, this module handles:
- Service worker registration (
service-worker.js) - Update lifecycle: prompts users when new content is available
- Cache hygiene: removes unexpected caches not prefixed with
cache- - Install prompt support: dispatches a
pwa-install-availableevent for custom handling - Firefox compatibility: skips registration in Firefox during localhost development
This function is typically called during client boot from +layout.svelte or another root-level component.
βΉοΈ The service worker will not register if the
?noswflag is present or ifwindow.__DISABLE_SW__is set (see below).
Β
π§Ή unregisterServiceWorker.js
Located at src/lib/unregisterServiceWorker.js, this utility allows for manual deactivation of service workers during debugging or user opt-out flows.
It unregisters all active service worker registrations and logs the result.
Β
π« disableSw.js
Located at static/disableSw.js, this file sets a global flag if the URL contains the ?nosw query parameter:
if (location.search.includes('nosw')) {
window.__DISABLE_SW__ = true;
}This flag is used by registerServiceWorker.js to bypass registration. It's helpful for testing environments, browser compatibility checks, or simulating first-load conditions without service worker interference.
To use:
https://netwk.pro/?noswπ‘
disableSw.jsis loaded via a<script>tag inapp.htmlfrom thestaticdirectory. This ensures the__DISABLE_SW__flag is set before any service worker logic runs.
Β
π§ Example Usage
To register the service worker conditionally, call the function from client code:
import { registerServiceWorker } from '$lib/registerServiceWorker.js';
registerServiceWorker();You can optionally import unregisterServiceWorker() in a debug menu or settings panel to let users opt out of offline behavior.
π£ CSP Report Handler
To receive and inspect CSP violation reports in development or production, the repo includes a Netlify-compatible Edge Function at:
netlify/edge-functions/csp-report.jsThis Edge Function receives Content Security Policy (CSP) violation reports at /api/csp-report and logs relevant details to the console. High-risk violations (e.g., script-src, form-action) also trigger real-time alerts via ntfy. You can further integrate with logging tools, SIEM platforms, or notification systems as needed.
Make sure to include the report-uri directive in your CSP header:
Content-Security-Policy: ...; report-uri /api/csp-report;π§ͺ Testing
This project uses a mix of automated performance, accessibility, and end-to-end testing tools to maintain quality across environments and deployments.
| Tool | Purpose | Usage Context |
|---|---|---|
@playwright/test | End-to-end testing framework with browser automation | Local + CI |
@lhci/cli | Lighthouse CI β automated performance audits | CI (optional local) |
lighthouse | Manual/scripted Lighthouse runs via CLI | Local (global) |
Note:
lighthouseis intended to be installed globally (npm i -g lighthouse) or run via thelighthousenpm script, which uses the locally installed binary if available. You can also run Lighthouse through Chrome DevTools manually if preferred.
CI uses Chrome for Lighthouse audits. For local experimentation, you may run Lighthouse manually using Brave, which can reveal differences related to privacy features or tracking protection.
Β
Testing Configuration Files
| File | Description | Usage Context |
|---|---|---|
playwright.config.js | Configures Playwright test environment (browsers, timeouts, base URL) | Local + CI |
.lighthouserc.cjs | Lighthouse CI config for defining audit targets, budgets, and assertions | CI |
Β
E2E Setup
Playwright is included in devDependencies and installed automatically with:
npm installTo install browser dependencies (required once):
npx playwright installThis downloads the browser binaries (Chromium, Firefox, WebKit) used for testing. You only need to run this once per machine or after a fresh clone.
Β
Running Tests
Local testing via Vitest and Playwright:
npm run test:client # Run client-side unit tests with Vitest
npm run test:server # Run server-side unit tests with Vitest
npm run test:all # Run full test suite
npm run test:watch # Watch mode for client tests
npm run test:coverage # Collect code coverage reports
npm run test:e2e # Runs Playwright E2E tests (with one retry on failure)The unit test suite includes a coverage audit (
auditCoverage.test.js) that warns when source files insrc/orscripts/do not have corresponding unit tests. This helps track test completeness without failing CI.Playwright will retry failed tests once
(--retries=1)to reduce false negatives from transient flakiness (network, render delay, etc.).
Audit your app using Lighthouse:
# Run Lighthouse CI (via @lhci/cli) using the current build
npm run lhci:runManual auditing with Lighthouse (e.g., via Brave or Chrome):
# Install globally (if not already installed)
npm install -g lighthouse
# Run Lighthouse manually against a deployed site
lighthouse https://netwk.pro --viewYou can also audit locally using Chrome DevTools β Lighthouse tab for on-the-fly testing and preview reports.
The repo uses
@lhci/clifor CI-based audits. It is installed as a dev dependency and does not require a global install.
To trace the exact Chrome version and audit timestamp used in CI:
cat .lighthouseci/chrome-version.txt
π Recommended Toolchain
To streamline development and align with project conventions, we recommend the following setup β especially for contributors without a strong existing preference.
| Tool | Description |
|---|---|
| VSCodium | Fully open-source alternative to VS Code (telemetry-free) |
| Prettier | Code formatter for JS, TS, Svelte, Markdown, etc. |
| ESLint | JavaScript/TypeScript linter with Svelte support |
| Stylelint | Linting for CSS, SCSS, and inline styles in Svelte |
| markdownlint | Markdown style checker and linter |
| markdownlint-cli2 | Config-based CLI linter for Markdown |
| EditorConfig | Consistent line endings, spacing, and indentation |
| Volta / nvm | Node.js version manager for consistent tooling |
The
.vscode/folder includes editor recommendations compatible with VSCodium. These are non-enforced and optional, but align with our formatter, linter, and language server configs.
Install dev tooling:
npm install --include=devRun all format and lint checks:
npm run lint:all
npm run formatTo auto-fix issues:
npm run lint:fix
npm run format:fixβοΈ Tooling Configuration
All linting, formatting, and version settings are defined in versioned project config files:
| File | Purpose |
|---|---|
.prettierrc | Prettier formatting rules |
.prettierignore | Files that should be ignored by Prettier |
eslint.config.mjs | ESLint config with SvelteKit support |
stylelint.config.js | CSS/SASS/Svelte style rules |
.stylelintignore | Files that should be ignored by Stylelint |
.editorconfig | Base indentation and line ending settings |
.nvmrc, .node-version | Node.js version constraints for nvm, asdf, and Volta |
.vscode/extensions.json | Suggested extensions for VSCodium |
.vscode/settings.json | Default workspace settings (non-binding) |
.vscode/customData.json | Custom CSS data for FontAwesome classes |
cspell.json | Custom words and exclusions for spell checking |
These are the same rules used by CI and automation, so aligning your local setup avoids surprises later.
Note:
.vscode/extensions.jsondefines a minimal recommended dev stack for VSCodium / VS Code. These extensions are optional but thoughtfully curated to improve developer experience without introducing bloat.
π Available Scripts
The following CLI commands are available via npm run <script> or pnpm run <script>.
π Development
| Script | Description |
|---|---|
dev | Start development server with Vite |
preview | Preview production build locally |
build | Build the project with Vite |
dev:netlify | Start local dev server using Netlify Dev (emulates serverless + headers) |
build:netlify | Build using Netlify CLI |
css:bundle | Bundle and minify CSS |
Β
β Pre-check / Sync
| Script | Description |
|---|---|
prepare | Run SvelteKit sync |
check | Run SvelteKit sync and type check with svelte-check |
check:watch | Watch mode for type checks |
check:node | Validate Node & npm versions match package.json engines |
checkout | Full local validation: check versions, test (incl. audit coverage), lint, typecheck |
verify | Alias for checkout |
Β
π§Ή Cleanup & Maintenance
| Script | Description |
|---|---|
delete | Remove build artifacts and node_modules |
clean | Fully reset environment and reinstall |
upgrade | Update all dependencies via npm-check-updates |
Β
π§ͺ Testing
| Script | Description |
|---|---|
test | Alias for test:all |
test:all | Run both client and server test suites (incl. audit coverage) |
test:client | Run client tests with Vitest |
test:server | Run server-side tests with Vitest |
test:watch | Watch mode for client tests |
test:coverage | Collect coverage from both client and server |
test:e2e | Runs E2E tests with up to 1 automatic retry on failure |
Β
π§Ό Linting & Formatting
| Script | Description |
|---|---|
lint | Run ESLint on JS, MJS, and Svelte files |
lint:fix | Auto-fix ESLint issues |
lint:jsdoc | Check JSDoc annotations |
lint:css | Run Stylelint on CSS and Svelte styles |
lint:md | Lint Markdown content |
lint:all | Run all linters and formatting checks |
format | Run Prettier formatting check |
format:fix | Auto-format code using Prettier |
Β
π‘ Lighthouse / Performance
| Script | Description |
|---|---|
lhci | Alias for Lighthouse CI |
lhci:run | Run Lighthouse CI autorun |
Β
π Audits / Validation
| Script | Description |
|---|---|
audit:coverage | Warn about untested modules in src/ and scripts/ |
head:flatten | Flatten headers for Netlify |
head:validate | Validate headers file against project config |
Β
π Lifecycle Hooks
| Script | Description |
|---|---|
postinstall | Ensures version check after install |
π§Ύ License
This project is licensed under:
Or optionally, GNU GPL v3 or later
Source code, branding, and visual assets are subject to reuse and distribution terms specified on our Legal, Copyright, and Licensing page.
πββοΈQuestions?
Reach out via our Contact Form, open an issue on this repo, or email us directly at support (at) neteng.pro.
Β
Designed for professionals. Hardened for privacy. Built with intent.
β Network Pro Strategies
Copyright Β© 2025
Network Pro Strategies (Network Proβ’)
Network Proβ’, the shield logo, and the "Locking Down Networksβ’" slogan are trademarks of Network Pro Strategies.
Licensed under CC BY 4.0 and the GNU GPL, as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago