Repository files navigation

AckLab

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

The current product is intentionally local-mock only. It does not implement a backend, database, authentication, payments, subscriptions, or external APIs.

Tech Stack

  • Next.js App Router with standalone production output
  • TypeScript strict mode
  • TailwindCSS v4
  • shadcn-compatible UI primitives
  • Framer Motion
  • Lucide React
  • React Hook Form and Zod
  • Zustand
  • pnpm
  • ESLint, Prettier, Husky, lint-staged
  • Docker multi-stage production build
  • GitHub Actions CI

Architecture

app/ App Router pages and global layout
src/components/ui/ shadcn-compatible primitives
src/components/layout/ shell, nav, command menu, theme provider
src/components/shared/ reusable product UI
src/components/visualizations/
src/features/ domain-owned interactive tools and visualizers
src/data/ local mock data
src/types/ shared TypeScript contracts
src/config/ app and environment configuration
src/constants/ navigation and constants
docs/ architecture and deployment documentation

Local Setup

Use pnpm through Corepack:

corepack enable
corepack prepare pnpm@11.0.9 --activate
pnpm install
cp .env.example .env.local
pnpm dev

Open http://localhost:3000.

Scripts

pnpm dev # start local Next.js dev server
pnpm build # create production build
pnpm start # run production server after build
pnpm lint # run ESLint
pnpm typecheck # run TypeScript checks
pnpm test# run Vitest unit tests
pnpm format # write Prettier formatting
pnpm format:check # verify Prettier formatting
pnpm docker:build # build local production Docker image
pnpm docker:run # run local production Docker image
pnpm docker:compose # run Compose-based local container test
pnpm clean # remove generated build artifacts

Next version floor

Stay on Next >= 16.3.0. On 16.2.6 the Turbopack dev server spawned an unbounded number of .next/dev/build/postcss.js child processes when compiling a page (500+ within 20 seconds), saturating every core and hard-freezing the machine. experimental.turbopackPluginRuntimeStrategy: "workerThreads" was not a workaround — it throws ERR_SOCKET_BAD_PORT in createIpc and hangs the compile. 16.3.0 fixes both that and the workspace-root inference; if you ever need to downgrade, run next dev --webpack instead.

Environment Variables

Environment validation lives in src/config/env.ts.

Copy .env.example to .env.local for local development:

cp .env.example .env.local

Public variables:

  • NEXT_PUBLIC_APP_URL: browser-visible app URL.

Do not expose secrets through NEXT_PUBLIC_. Any value with that prefix can be bundled into client-side JavaScript.

Docker

Build and run the production image:

pnpm docker:build
pnpm docker:run

Or use Compose for local container testing:

pnpm docker:compose

The Dockerfile uses:

  • pnpm with frozen lockfile
  • multi-stage builds
  • Next.js output: "standalone"
  • non-root runtime user
  • port 3000

No PostgreSQL, Redis, Nginx, Kubernetes, Terraform, or cloud-specific infrastructure is included.

CI/CD

GitHub Actions workflow: .github/workflows/ci.yml

CI runs on push and pull_request:

  • checkout
  • setup pnpm
  • setup Node.js
  • install with frozen lockfile
  • lint
  • typecheck
  • test
  • build

Deployment

Vercel

  1. Import the repository into Vercel.
  2. Use pnpm as the package manager.
  3. Build command: pnpm build.
  4. Add NEXT_PUBLIC_APP_URL for each environment.
  5. Keep future secrets server-only and never prefix private values with NEXT_PUBLIC_.

Docker

Use the included Dockerfile for production-style container builds:

docker build -t acklab:local .
docker run --rm -p 3000:3000 acklab:local

Security Defaults

  • Security headers are configured in next.config.ts.
  • An enforced Content Security Policy is configured in next.config.ts. script-src still allows 'unsafe-inline' and 'unsafe-eval' because Next's bootstrap requires them; tightening that needs per-request nonces.
  • upgrade-insecure-requests is sent in production builds only. The dev server is HTTP, so the directive rewrites every subresource to https and the app renders with no CSS or JS at all. Safari upgrades even on localhost; Chrome exempts localhost but not a bare LAN IP, so it breaks on the Network: URL that next dev prints. Chrome on localhost is the one combination that hides this — check Safari before assuming a CSP change is dev-safe.
  • No secrets are required for the MVP.
  • .env.local and other local environment files are ignored by Git.
  • Runtime Docker container runs as a non-root user.

Dependency audit:

pnpm audit

Contribution Workflow

  1. Create a branch.
  2. Run pnpm install.
  3. Make scoped changes.
  4. Run pnpm lint, pnpm typecheck, and pnpm build.
  5. Commit with the Husky pre-commit hook enabled.
  6. Open a pull request and wait for CI.

Roadmap

  • Course paths and guided lessons
  • Quiz engine with review mode
  • User progress persistence
  • Packet analyzer and HTTP inspector
  • Port reference and latency visualizer
  • Secure auth, RBAC, subscriptions, and billing
  • Rate limiting, analytics, secure sessions, and audit logs
  • Admin dashboard

See docs/architecture.md and docs/deployment.md for more detail.

About

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

AckLab

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

The current product is intentionally local-mock only. It does not implement a backend, database, authentication, payments, subscriptions, or external APIs.

Tech Stack

  • Next.js App Router with standalone production output
  • TypeScript strict mode
  • TailwindCSS v4
  • shadcn-compatible UI primitives
  • Framer Motion
  • Lucide React
  • React Hook Form and Zod
  • Zustand
  • pnpm
  • ESLint, Prettier, Husky, lint-staged
  • Docker multi-stage production build
  • GitHub Actions CI

Architecture

app/ App Router pages and global layout
src/components/ui/ shadcn-compatible primitives
src/components/layout/ shell, nav, command menu, theme provider
src/components/shared/ reusable product UI
src/components/visualizations/
src/features/ domain-owned interactive tools and visualizers
src/data/ local mock data
src/types/ shared TypeScript contracts
src/config/ app and environment configuration
src/constants/ navigation and constants
docs/ architecture and deployment documentation

Local Setup

Use pnpm through Corepack:

corepack enable
corepack prepare pnpm@11.0.9 --activate
pnpm install
cp .env.example .env.local
pnpm dev

Open http://localhost:3000.

Scripts

pnpm dev # start local Next.js dev server
pnpm build # create production build
pnpm start # run production server after build
pnpm lint # run ESLint
pnpm typecheck # run TypeScript checks
pnpm test# run Vitest unit tests
pnpm format # write Prettier formatting
pnpm format:check # verify Prettier formatting
pnpm docker:build # build local production Docker image
pnpm docker:run # run local production Docker image
pnpm docker:compose # run Compose-based local container test
pnpm clean # remove generated build artifacts

Next version floor

Stay on Next >= 16.3.0. On 16.2.6 the Turbopack dev server spawned an unbounded number of .next/dev/build/postcss.js child processes when compiling a page (500+ within 20 seconds), saturating every core and hard-freezing the machine. experimental.turbopackPluginRuntimeStrategy: "workerThreads" was not a workaround — it throws ERR_SOCKET_BAD_PORT in createIpc and hangs the compile. 16.3.0 fixes both that and the workspace-root inference; if you ever need to downgrade, run next dev --webpack instead.

Environment Variables

Environment validation lives in src/config/env.ts.

Copy .env.example to .env.local for local development:

cp .env.example .env.local

Public variables:

  • NEXT_PUBLIC_APP_URL: browser-visible app URL.

Do not expose secrets through NEXT_PUBLIC_. Any value with that prefix can be bundled into client-side JavaScript.

Docker

Build and run the production image:

pnpm docker:build
pnpm docker:run

Or use Compose for local container testing:

pnpm docker:compose

The Dockerfile uses:

  • pnpm with frozen lockfile
  • multi-stage builds
  • Next.js output: "standalone"
  • non-root runtime user
  • port 3000

No PostgreSQL, Redis, Nginx, Kubernetes, Terraform, or cloud-specific infrastructure is included.

CI/CD

GitHub Actions workflow: .github/workflows/ci.yml

CI runs on push and pull_request:

  • checkout
  • setup pnpm
  • setup Node.js
  • install with frozen lockfile
  • lint
  • typecheck
  • test
  • build

Deployment

Vercel

  1. Import the repository into Vercel.
  2. Use pnpm as the package manager.
  3. Build command: pnpm build.
  4. Add NEXT_PUBLIC_APP_URL for each environment.
  5. Keep future secrets server-only and never prefix private values with NEXT_PUBLIC_.

Docker

Use the included Dockerfile for production-style container builds:

docker build -t acklab:local .
docker run --rm -p 3000:3000 acklab:local

Security Defaults

  • Security headers are configured in next.config.ts.
  • An enforced Content Security Policy is configured in next.config.ts. script-src still allows 'unsafe-inline' and 'unsafe-eval' because Next's bootstrap requires them; tightening that needs per-request nonces.
  • upgrade-insecure-requests is sent in production builds only. The dev server is HTTP, so the directive rewrites every subresource to https and the app renders with no CSS or JS at all. Safari upgrades even on localhost; Chrome exempts localhost but not a bare LAN IP, so it breaks on the Network: URL that next dev prints. Chrome on localhost is the one combination that hides this — check Safari before assuming a CSP change is dev-safe.
  • No secrets are required for the MVP.
  • .env.local and other local environment files are ignored by Git.
  • Runtime Docker container runs as a non-root user.

Dependency audit:

pnpm audit

Contribution Workflow

  1. Create a branch.
  2. Run pnpm install.
  3. Make scoped changes.
  4. Run pnpm lint, pnpm typecheck, and pnpm build.
  5. Commit with the Husky pre-commit hook enabled.
  6. Open a pull request and wait for CI.

Roadmap

  • Course paths and guided lessons
  • Quiz engine with review mode
  • User progress persistence
  • Packet analyzer and HTTP inspector
  • Port reference and latency visualizer
  • Secure auth, RBAC, subscriptions, and billing
  • Rate limiting, analytics, secure sessions, and audit logs
  • Admin dashboard

See docs/architecture.md and docs/deployment.md for more detail.

About

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AckLab

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

The current product is intentionally local-mock only. It does not implement a backend, database, authentication, payments, subscriptions, or external APIs.

Tech Stack

  • Next.js App Router with standalone production output
  • TypeScript strict mode
  • TailwindCSS v4
  • shadcn-compatible UI primitives
  • Framer Motion
  • Lucide React
  • React Hook Form and Zod
  • Zustand
  • pnpm
  • ESLint, Prettier, Husky, lint-staged
  • Docker multi-stage production build
  • GitHub Actions CI

Architecture

app/ App Router pages and global layout
src/components/ui/ shadcn-compatible primitives
src/components/layout/ shell, nav, command menu, theme provider
src/components/shared/ reusable product UI
src/components/visualizations/
src/features/ domain-owned interactive tools and visualizers
src/data/ local mock data
src/types/ shared TypeScript contracts
src/config/ app and environment configuration
src/constants/ navigation and constants
docs/ architecture and deployment documentation

Local Setup

Use pnpm through Corepack:

corepack enable
corepack prepare pnpm@11.0.9 --activate
pnpm install
cp .env.example .env.local
pnpm dev

Open http://localhost:3000.

Scripts

pnpm dev # start local Next.js dev server
pnpm build # create production build
pnpm start # run production server after build
pnpm lint # run ESLint
pnpm typecheck # run TypeScript checks
pnpm test# run Vitest unit tests
pnpm format # write Prettier formatting
pnpm format:check # verify Prettier formatting
pnpm docker:build # build local production Docker image
pnpm docker:run # run local production Docker image
pnpm docker:compose # run Compose-based local container test
pnpm clean # remove generated build artifacts

Next version floor

Stay on Next >= 16.3.0. On 16.2.6 the Turbopack dev server spawned an unbounded number of .next/dev/build/postcss.js child processes when compiling a page (500+ within 20 seconds), saturating every core and hard-freezing the machine. experimental.turbopackPluginRuntimeStrategy: "workerThreads" was not a workaround — it throws ERR_SOCKET_BAD_PORT in createIpc and hangs the compile. 16.3.0 fixes both that and the workspace-root inference; if you ever need to downgrade, run next dev --webpack instead.

Environment Variables

Environment validation lives in src/config/env.ts.

Copy .env.example to .env.local for local development:

cp .env.example .env.local

Public variables:

  • NEXT_PUBLIC_APP_URL: browser-visible app URL.

Do not expose secrets through NEXT_PUBLIC_. Any value with that prefix can be bundled into client-side JavaScript.

Docker

Build and run the production image:

pnpm docker:build
pnpm docker:run

Or use Compose for local container testing:

pnpm docker:compose

The Dockerfile uses:

  • pnpm with frozen lockfile
  • multi-stage builds
  • Next.js output: "standalone"
  • non-root runtime user
  • port 3000

No PostgreSQL, Redis, Nginx, Kubernetes, Terraform, or cloud-specific infrastructure is included.

CI/CD

GitHub Actions workflow: .github/workflows/ci.yml

CI runs on push and pull_request:

  • checkout
  • setup pnpm
  • setup Node.js
  • install with frozen lockfile
  • lint
  • typecheck
  • test
  • build

Deployment

Vercel

  1. Import the repository into Vercel.
  2. Use pnpm as the package manager.
  3. Build command: pnpm build.
  4. Add NEXT_PUBLIC_APP_URL for each environment.
  5. Keep future secrets server-only and never prefix private values with NEXT_PUBLIC_.

Docker

Use the included Dockerfile for production-style container builds:

docker build -t acklab:local .
docker run --rm -p 3000:3000 acklab:local

Security Defaults

  • Security headers are configured in next.config.ts.
  • An enforced Content Security Policy is configured in next.config.ts. script-src still allows 'unsafe-inline' and 'unsafe-eval' because Next's bootstrap requires them; tightening that needs per-request nonces.
  • upgrade-insecure-requests is sent in production builds only. The dev server is HTTP, so the directive rewrites every subresource to https and the app renders with no CSS or JS at all. Safari upgrades even on localhost; Chrome exempts localhost but not a bare LAN IP, so it breaks on the Network: URL that next dev prints. Chrome on localhost is the one combination that hides this — check Safari before assuming a CSP change is dev-safe.
  • No secrets are required for the MVP.
  • .env.local and other local environment files are ignored by Git.
  • Runtime Docker container runs as a non-root user.

Dependency audit:

pnpm audit

Contribution Workflow

  1. Create a branch.
  2. Run pnpm install.
  3. Make scoped changes.
  4. Run pnpm lint, pnpm typecheck, and pnpm build.
  5. Commit with the Husky pre-commit hook enabled.
  6. Open a pull request and wait for CI.

Roadmap

  • Course paths and guided lessons
  • Quiz engine with review mode
  • User progress persistence
  • Packet analyzer and HTTP inspector
  • Port reference and latency visualizer
  • Secure auth, RBAC, subscriptions, and billing
  • Rate limiting, analytics, secure sessions, and audit logs
  • Admin dashboard

See docs/architecture.md and docs/deployment.md for more detail.

About

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AckLab

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

The current product is intentionally local-mock only. It does not implement a backend, database, authentication, payments, subscriptions, or external APIs.

Tech Stack

  • Next.js App Router with standalone production output
  • TypeScript strict mode
  • TailwindCSS v4
  • shadcn-compatible UI primitives
  • Framer Motion
  • Lucide React
  • React Hook Form and Zod
  • Zustand
  • pnpm
  • ESLint, Prettier, Husky, lint-staged
  • Docker multi-stage production build
  • GitHub Actions CI

Architecture

app/ App Router pages and global layout
src/components/ui/ shadcn-compatible primitives
src/components/layout/ shell, nav, command menu, theme provider
src/components/shared/ reusable product UI
src/components/visualizations/
src/features/ domain-owned interactive tools and visualizers
src/data/ local mock data
src/types/ shared TypeScript contracts
src/config/ app and environment configuration
src/constants/ navigation and constants
docs/ architecture and deployment documentation

Local Setup

Use pnpm through Corepack:

corepack enable
corepack prepare pnpm@11.0.9 --activate
pnpm install
cp .env.example .env.local
pnpm dev

Open http://localhost:3000.

Scripts

pnpm dev # start local Next.js dev server
pnpm build # create production build
pnpm start # run production server after build
pnpm lint # run ESLint
pnpm typecheck # run TypeScript checks
pnpm test# run Vitest unit tests
pnpm format # write Prettier formatting
pnpm format:check # verify Prettier formatting
pnpm docker:build # build local production Docker image
pnpm docker:run # run local production Docker image
pnpm docker:compose # run Compose-based local container test
pnpm clean # remove generated build artifacts

Next version floor

Stay on Next >= 16.3.0. On 16.2.6 the Turbopack dev server spawned an unbounded number of .next/dev/build/postcss.js child processes when compiling a page (500+ within 20 seconds), saturating every core and hard-freezing the machine. experimental.turbopackPluginRuntimeStrategy: "workerThreads" was not a workaround — it throws ERR_SOCKET_BAD_PORT in createIpc and hangs the compile. 16.3.0 fixes both that and the workspace-root inference; if you ever need to downgrade, run next dev --webpack instead.

Environment Variables

Environment validation lives in src/config/env.ts.

Copy .env.example to .env.local for local development:

cp .env.example .env.local

Public variables:

  • NEXT_PUBLIC_APP_URL: browser-visible app URL.

Do not expose secrets through NEXT_PUBLIC_. Any value with that prefix can be bundled into client-side JavaScript.

Docker

Build and run the production image:

pnpm docker:build
pnpm docker:run

Or use Compose for local container testing:

pnpm docker:compose

The Dockerfile uses:

  • pnpm with frozen lockfile
  • multi-stage builds
  • Next.js output: "standalone"
  • non-root runtime user
  • port 3000

No PostgreSQL, Redis, Nginx, Kubernetes, Terraform, or cloud-specific infrastructure is included.

CI/CD

GitHub Actions workflow: .github/workflows/ci.yml

CI runs on push and pull_request:

  • checkout
  • setup pnpm
  • setup Node.js
  • install with frozen lockfile
  • lint
  • typecheck
  • test
  • build

Deployment

Vercel

  1. Import the repository into Vercel.
  2. Use pnpm as the package manager.
  3. Build command: pnpm build.
  4. Add NEXT_PUBLIC_APP_URL for each environment.
  5. Keep future secrets server-only and never prefix private values with NEXT_PUBLIC_.

Docker

Use the included Dockerfile for production-style container builds:

docker build -t acklab:local .
docker run --rm -p 3000:3000 acklab:local

Security Defaults

  • Security headers are configured in next.config.ts.
  • An enforced Content Security Policy is configured in next.config.ts. script-src still allows 'unsafe-inline' and 'unsafe-eval' because Next's bootstrap requires them; tightening that needs per-request nonces.
  • upgrade-insecure-requests is sent in production builds only. The dev server is HTTP, so the directive rewrites every subresource to https and the app renders with no CSS or JS at all. Safari upgrades even on localhost; Chrome exempts localhost but not a bare LAN IP, so it breaks on the Network: URL that next dev prints. Chrome on localhost is the one combination that hides this — check Safari before assuming a CSP change is dev-safe.
  • No secrets are required for the MVP.
  • .env.local and other local environment files are ignored by Git.
  • Runtime Docker container runs as a non-root user.

Dependency audit:

pnpm audit

Contribution Workflow

  1. Create a branch.
  2. Run pnpm install.
  3. Make scoped changes.
  4. Run pnpm lint, pnpm typecheck, and pnpm build.
  5. Commit with the Husky pre-commit hook enabled.
  6. Open a pull request and wait for CI.

Roadmap

  • Course paths and guided lessons
  • Quiz engine with review mode
  • User progress persistence
  • Packet analyzer and HTTP inspector
  • Port reference and latency visualizer
  • Secure auth, RBAC, subscriptions, and billing
  • Rate limiting, analytics, secure sessions, and audit logs
  • Admin dashboard

See docs/architecture.md and docs/deployment.md for more detail.

About

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

AckLab

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

The current product is intentionally local-mock only. It does not implement a backend, database, authentication, payments, subscriptions, or external APIs.

Tech Stack

  • Next.js App Router with standalone production output
  • TypeScript strict mode
  • TailwindCSS v4
  • shadcn-compatible UI primitives
  • Framer Motion
  • Lucide React
  • React Hook Form and Zod
  • Zustand
  • pnpm
  • ESLint, Prettier, Husky, lint-staged
  • Docker multi-stage production build
  • GitHub Actions CI

Architecture

app/ App Router pages and global layout
src/components/ui/ shadcn-compatible primitives
src/components/layout/ shell, nav, command menu, theme provider
src/components/shared/ reusable product UI
src/components/visualizations/
src/features/ domain-owned interactive tools and visualizers
src/data/ local mock data
src/types/ shared TypeScript contracts
src/config/ app and environment configuration
src/constants/ navigation and constants
docs/ architecture and deployment documentation

Local Setup

Use pnpm through Corepack:

corepack enable
corepack prepare pnpm@11.0.9 --activate
pnpm install
cp .env.example .env.local
pnpm dev

Open http://localhost:3000.

Scripts

pnpm dev # start local Next.js dev server
pnpm build # create production build
pnpm start # run production server after build
pnpm lint # run ESLint
pnpm typecheck # run TypeScript checks
pnpm test# run Vitest unit tests
pnpm format # write Prettier formatting
pnpm format:check # verify Prettier formatting
pnpm docker:build # build local production Docker image
pnpm docker:run # run local production Docker image
pnpm docker:compose # run Compose-based local container test
pnpm clean # remove generated build artifacts

Next version floor

Stay on Next >= 16.3.0. On 16.2.6 the Turbopack dev server spawned an unbounded number of .next/dev/build/postcss.js child processes when compiling a page (500+ within 20 seconds), saturating every core and hard-freezing the machine. experimental.turbopackPluginRuntimeStrategy: "workerThreads" was not a workaround — it throws ERR_SOCKET_BAD_PORT in createIpc and hangs the compile. 16.3.0 fixes both that and the workspace-root inference; if you ever need to downgrade, run next dev --webpack instead.

Environment Variables

Environment validation lives in src/config/env.ts.

Copy .env.example to .env.local for local development:

cp .env.example .env.local

Public variables:

  • NEXT_PUBLIC_APP_URL: browser-visible app URL.

Do not expose secrets through NEXT_PUBLIC_. Any value with that prefix can be bundled into client-side JavaScript.

Docker

Build and run the production image:

pnpm docker:build
pnpm docker:run

Or use Compose for local container testing:

pnpm docker:compose

The Dockerfile uses:

  • pnpm with frozen lockfile
  • multi-stage builds
  • Next.js output: "standalone"
  • non-root runtime user
  • port 3000

No PostgreSQL, Redis, Nginx, Kubernetes, Terraform, or cloud-specific infrastructure is included.

CI/CD

GitHub Actions workflow: .github/workflows/ci.yml

CI runs on push and pull_request:

  • checkout
  • setup pnpm
  • setup Node.js
  • install with frozen lockfile
  • lint
  • typecheck
  • test
  • build

Deployment

Vercel

  1. Import the repository into Vercel.
  2. Use pnpm as the package manager.
  3. Build command: pnpm build.
  4. Add NEXT_PUBLIC_APP_URL for each environment.
  5. Keep future secrets server-only and never prefix private values with NEXT_PUBLIC_.

Docker

Use the included Dockerfile for production-style container builds:

docker build -t acklab:local .
docker run --rm -p 3000:3000 acklab:local

Security Defaults

  • Security headers are configured in next.config.ts.
  • An enforced Content Security Policy is configured in next.config.ts. script-src still allows 'unsafe-inline' and 'unsafe-eval' because Next's bootstrap requires them; tightening that needs per-request nonces.
  • upgrade-insecure-requests is sent in production builds only. The dev server is HTTP, so the directive rewrites every subresource to https and the app renders with no CSS or JS at all. Safari upgrades even on localhost; Chrome exempts localhost but not a bare LAN IP, so it breaks on the Network: URL that next dev prints. Chrome on localhost is the one combination that hides this — check Safari before assuming a CSP change is dev-safe.
  • No secrets are required for the MVP.
  • .env.local and other local environment files are ignored by Git.
  • Runtime Docker container runs as a non-root user.

Dependency audit:

pnpm audit

Contribution Workflow

  1. Create a branch.
  2. Run pnpm install.
  3. Make scoped changes.
  4. Run pnpm lint, pnpm typecheck, and pnpm build.
  5. Commit with the Husky pre-commit hook enabled.
  6. Open a pull request and wait for CI.

Roadmap

  • Course paths and guided lessons
  • Quiz engine with review mode
  • User progress persistence
  • Packet analyzer and HTTP inspector
  • Port reference and latency visualizer
  • Secure auth, RBAC, subscriptions, and billing
  • Rate limiting, analytics, secure sessions, and audit logs
  • Admin dashboard

See docs/architecture.md and docs/deployment.md for more detail.

About

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AckLab

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

The current product is intentionally local-mock only. It does not implement a backend, database, authentication, payments, subscriptions, or external APIs.

Tech Stack

  • Next.js App Router with standalone production output
  • TypeScript strict mode
  • TailwindCSS v4
  • shadcn-compatible UI primitives
  • Framer Motion
  • Lucide React
  • React Hook Form and Zod
  • Zustand
  • pnpm
  • ESLint, Prettier, Husky, lint-staged
  • Docker multi-stage production build
  • GitHub Actions CI

Architecture

app/ App Router pages and global layout
src/components/ui/ shadcn-compatible primitives
src/components/layout/ shell, nav, command menu, theme provider
src/components/shared/ reusable product UI
src/components/visualizations/
src/features/ domain-owned interactive tools and visualizers
src/data/ local mock data
src/types/ shared TypeScript contracts
src/config/ app and environment configuration
src/constants/ navigation and constants
docs/ architecture and deployment documentation

Local Setup

Use pnpm through Corepack:

corepack enable
corepack prepare pnpm@11.0.9 --activate
pnpm install
cp .env.example .env.local
pnpm dev

Open http://localhost:3000.

Scripts

pnpm dev # start local Next.js dev server
pnpm build # create production build
pnpm start # run production server after build
pnpm lint # run ESLint
pnpm typecheck # run TypeScript checks
pnpm test# run Vitest unit tests
pnpm format # write Prettier formatting
pnpm format:check # verify Prettier formatting
pnpm docker:build # build local production Docker image
pnpm docker:run # run local production Docker image
pnpm docker:compose # run Compose-based local container test
pnpm clean # remove generated build artifacts

Next version floor

Stay on Next >= 16.3.0. On 16.2.6 the Turbopack dev server spawned an unbounded number of .next/dev/build/postcss.js child processes when compiling a page (500+ within 20 seconds), saturating every core and hard-freezing the machine. experimental.turbopackPluginRuntimeStrategy: "workerThreads" was not a workaround — it throws ERR_SOCKET_BAD_PORT in createIpc and hangs the compile. 16.3.0 fixes both that and the workspace-root inference; if you ever need to downgrade, run next dev --webpack instead.

Environment Variables

Environment validation lives in src/config/env.ts.

Copy .env.example to .env.local for local development:

cp .env.example .env.local

Public variables:

  • NEXT_PUBLIC_APP_URL: browser-visible app URL.

Do not expose secrets through NEXT_PUBLIC_. Any value with that prefix can be bundled into client-side JavaScript.

Docker

Build and run the production image:

pnpm docker:build
pnpm docker:run

Or use Compose for local container testing:

pnpm docker:compose

The Dockerfile uses:

  • pnpm with frozen lockfile
  • multi-stage builds
  • Next.js output: "standalone"
  • non-root runtime user
  • port 3000

No PostgreSQL, Redis, Nginx, Kubernetes, Terraform, or cloud-specific infrastructure is included.

CI/CD

GitHub Actions workflow: .github/workflows/ci.yml

CI runs on push and pull_request:

  • checkout
  • setup pnpm
  • setup Node.js
  • install with frozen lockfile
  • lint
  • typecheck
  • test
  • build

Deployment

Vercel

  1. Import the repository into Vercel.
  2. Use pnpm as the package manager.
  3. Build command: pnpm build.
  4. Add NEXT_PUBLIC_APP_URL for each environment.
  5. Keep future secrets server-only and never prefix private values with NEXT_PUBLIC_.

Docker

Use the included Dockerfile for production-style container builds:

docker build -t acklab:local .
docker run --rm -p 3000:3000 acklab:local

Security Defaults

  • Security headers are configured in next.config.ts.
  • An enforced Content Security Policy is configured in next.config.ts. script-src still allows 'unsafe-inline' and 'unsafe-eval' because Next's bootstrap requires them; tightening that needs per-request nonces.
  • upgrade-insecure-requests is sent in production builds only. The dev server is HTTP, so the directive rewrites every subresource to https and the app renders with no CSS or JS at all. Safari upgrades even on localhost; Chrome exempts localhost but not a bare LAN IP, so it breaks on the Network: URL that next dev prints. Chrome on localhost is the one combination that hides this — check Safari before assuming a CSP change is dev-safe.
  • No secrets are required for the MVP.
  • .env.local and other local environment files are ignored by Git.
  • Runtime Docker container runs as a non-root user.

Dependency audit:

pnpm audit

Contribution Workflow

  1. Create a branch.
  2. Run pnpm install.
  3. Make scoped changes.
  4. Run pnpm lint, pnpm typecheck, and pnpm build.
  5. Commit with the Husky pre-commit hook enabled.
  6. Open a pull request and wait for CI.

Roadmap

  • Course paths and guided lessons
  • Quiz engine with review mode
  • User progress persistence
  • Packet analyzer and HTTP inspector
  • Port reference and latency visualizer
  • Secure auth, RBAC, subscriptions, and billing
  • Rate limiting, analytics, secure sessions, and audit logs
  • Admin dashboard

See docs/architecture.md and docs/deployment.md for more detail.

About

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AckLab

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

The current product is intentionally local-mock only. It does not implement a backend, database, authentication, payments, subscriptions, or external APIs.

Tech Stack

  • Next.js App Router with standalone production output
  • TypeScript strict mode
  • TailwindCSS v4
  • shadcn-compatible UI primitives
  • Framer Motion
  • Lucide React
  • React Hook Form and Zod
  • Zustand
  • pnpm
  • ESLint, Prettier, Husky, lint-staged
  • Docker multi-stage production build
  • GitHub Actions CI

Architecture

app/ App Router pages and global layout
src/components/ui/ shadcn-compatible primitives
src/components/layout/ shell, nav, command menu, theme provider
src/components/shared/ reusable product UI
src/components/visualizations/
src/features/ domain-owned interactive tools and visualizers
src/data/ local mock data
src/types/ shared TypeScript contracts
src/config/ app and environment configuration
src/constants/ navigation and constants
docs/ architecture and deployment documentation

Local Setup

Use pnpm through Corepack:

corepack enable
corepack prepare pnpm@11.0.9 --activate
pnpm install
cp .env.example .env.local
pnpm dev

Open http://localhost:3000.

Scripts

pnpm dev # start local Next.js dev server
pnpm build # create production build
pnpm start # run production server after build
pnpm lint # run ESLint
pnpm typecheck # run TypeScript checks
pnpm test# run Vitest unit tests
pnpm format # write Prettier formatting
pnpm format:check # verify Prettier formatting
pnpm docker:build # build local production Docker image
pnpm docker:run # run local production Docker image
pnpm docker:compose # run Compose-based local container test
pnpm clean # remove generated build artifacts

Next version floor

Stay on Next >= 16.3.0. On 16.2.6 the Turbopack dev server spawned an unbounded number of .next/dev/build/postcss.js child processes when compiling a page (500+ within 20 seconds), saturating every core and hard-freezing the machine. experimental.turbopackPluginRuntimeStrategy: "workerThreads" was not a workaround — it throws ERR_SOCKET_BAD_PORT in createIpc and hangs the compile. 16.3.0 fixes both that and the workspace-root inference; if you ever need to downgrade, run next dev --webpack instead.

Environment Variables

Environment validation lives in src/config/env.ts.

Copy .env.example to .env.local for local development:

cp .env.example .env.local

Public variables:

  • NEXT_PUBLIC_APP_URL: browser-visible app URL.

Do not expose secrets through NEXT_PUBLIC_. Any value with that prefix can be bundled into client-side JavaScript.

Docker

Build and run the production image:

pnpm docker:build
pnpm docker:run

Or use Compose for local container testing:

pnpm docker:compose

The Dockerfile uses:

  • pnpm with frozen lockfile
  • multi-stage builds
  • Next.js output: "standalone"
  • non-root runtime user
  • port 3000

No PostgreSQL, Redis, Nginx, Kubernetes, Terraform, or cloud-specific infrastructure is included.

CI/CD

GitHub Actions workflow: .github/workflows/ci.yml

CI runs on push and pull_request:

  • checkout
  • setup pnpm
  • setup Node.js
  • install with frozen lockfile
  • lint
  • typecheck
  • test
  • build

Deployment

Vercel

  1. Import the repository into Vercel.
  2. Use pnpm as the package manager.
  3. Build command: pnpm build.
  4. Add NEXT_PUBLIC_APP_URL for each environment.
  5. Keep future secrets server-only and never prefix private values with NEXT_PUBLIC_.

Docker

Use the included Dockerfile for production-style container builds:

docker build -t acklab:local .
docker run --rm -p 3000:3000 acklab:local

Security Defaults

  • Security headers are configured in next.config.ts.
  • An enforced Content Security Policy is configured in next.config.ts. script-src still allows 'unsafe-inline' and 'unsafe-eval' because Next's bootstrap requires them; tightening that needs per-request nonces.
  • upgrade-insecure-requests is sent in production builds only. The dev server is HTTP, so the directive rewrites every subresource to https and the app renders with no CSS or JS at all. Safari upgrades even on localhost; Chrome exempts localhost but not a bare LAN IP, so it breaks on the Network: URL that next dev prints. Chrome on localhost is the one combination that hides this — check Safari before assuming a CSP change is dev-safe.
  • No secrets are required for the MVP.
  • .env.local and other local environment files are ignored by Git.
  • Runtime Docker container runs as a non-root user.

Dependency audit:

pnpm audit

Contribution Workflow

  1. Create a branch.
  2. Run pnpm install.
  3. Make scoped changes.
  4. Run pnpm lint, pnpm typecheck, and pnpm build.
  5. Commit with the Husky pre-commit hook enabled.
  6. Open a pull request and wait for CI.

Roadmap

  • Course paths and guided lessons
  • Quiz engine with review mode
  • User progress persistence
  • Packet analyzer and HTTP inspector
  • Port reference and latency visualizer
  • Secure auth, RBAC, subscriptions, and billing
  • Rate limiting, analytics, secure sessions, and audit logs
  • Admin dashboard

See docs/architecture.md and docs/deployment.md for more detail.

About

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

AckLab

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

The current product is intentionally local-mock only. It does not implement a backend, database, authentication, payments, subscriptions, or external APIs.

Tech Stack

  • Next.js App Router with standalone production output
  • TypeScript strict mode
  • TailwindCSS v4
  • shadcn-compatible UI primitives
  • Framer Motion
  • Lucide React
  • React Hook Form and Zod
  • Zustand
  • pnpm
  • ESLint, Prettier, Husky, lint-staged
  • Docker multi-stage production build
  • GitHub Actions CI

Architecture

app/ App Router pages and global layout
src/components/ui/ shadcn-compatible primitives
src/components/layout/ shell, nav, command menu, theme provider
src/components/shared/ reusable product UI
src/components/visualizations/
src/features/ domain-owned interactive tools and visualizers
src/data/ local mock data
src/types/ shared TypeScript contracts
src/config/ app and environment configuration
src/constants/ navigation and constants
docs/ architecture and deployment documentation

Local Setup

Use pnpm through Corepack:

corepack enable
corepack prepare pnpm@11.0.9 --activate
pnpm install
cp .env.example .env.local
pnpm dev

Open http://localhost:3000.

Scripts

pnpm dev # start local Next.js dev server
pnpm build # create production build
pnpm start # run production server after build
pnpm lint # run ESLint
pnpm typecheck # run TypeScript checks
pnpm test# run Vitest unit tests
pnpm format # write Prettier formatting
pnpm format:check # verify Prettier formatting
pnpm docker:build # build local production Docker image
pnpm docker:run # run local production Docker image
pnpm docker:compose # run Compose-based local container test
pnpm clean # remove generated build artifacts

Next version floor

Stay on Next >= 16.3.0. On 16.2.6 the Turbopack dev server spawned an unbounded number of .next/dev/build/postcss.js child processes when compiling a page (500+ within 20 seconds), saturating every core and hard-freezing the machine. experimental.turbopackPluginRuntimeStrategy: "workerThreads" was not a workaround — it throws ERR_SOCKET_BAD_PORT in createIpc and hangs the compile. 16.3.0 fixes both that and the workspace-root inference; if you ever need to downgrade, run next dev --webpack instead.

Environment Variables

Environment validation lives in src/config/env.ts.

Copy .env.example to .env.local for local development:

cp .env.example .env.local

Public variables:

  • NEXT_PUBLIC_APP_URL: browser-visible app URL.

Do not expose secrets through NEXT_PUBLIC_. Any value with that prefix can be bundled into client-side JavaScript.

Docker

Build and run the production image:

pnpm docker:build
pnpm docker:run

Or use Compose for local container testing:

pnpm docker:compose

The Dockerfile uses:

  • pnpm with frozen lockfile
  • multi-stage builds
  • Next.js output: "standalone"
  • non-root runtime user
  • port 3000

No PostgreSQL, Redis, Nginx, Kubernetes, Terraform, or cloud-specific infrastructure is included.

CI/CD

GitHub Actions workflow: .github/workflows/ci.yml

CI runs on push and pull_request:

  • checkout
  • setup pnpm
  • setup Node.js
  • install with frozen lockfile
  • lint
  • typecheck
  • test
  • build

Deployment

Vercel

  1. Import the repository into Vercel.
  2. Use pnpm as the package manager.
  3. Build command: pnpm build.
  4. Add NEXT_PUBLIC_APP_URL for each environment.
  5. Keep future secrets server-only and never prefix private values with NEXT_PUBLIC_.

Docker

Use the included Dockerfile for production-style container builds:

docker build -t acklab:local .
docker run --rm -p 3000:3000 acklab:local

Security Defaults

  • Security headers are configured in next.config.ts.
  • An enforced Content Security Policy is configured in next.config.ts. script-src still allows 'unsafe-inline' and 'unsafe-eval' because Next's bootstrap requires them; tightening that needs per-request nonces.
  • upgrade-insecure-requests is sent in production builds only. The dev server is HTTP, so the directive rewrites every subresource to https and the app renders with no CSS or JS at all. Safari upgrades even on localhost; Chrome exempts localhost but not a bare LAN IP, so it breaks on the Network: URL that next dev prints. Chrome on localhost is the one combination that hides this — check Safari before assuming a CSP change is dev-safe.
  • No secrets are required for the MVP.
  • .env.local and other local environment files are ignored by Git.
  • Runtime Docker container runs as a non-root user.

Dependency audit:

pnpm audit

Contribution Workflow

  1. Create a branch.
  2. Run pnpm install.
  3. Make scoped changes.
  4. Run pnpm lint, pnpm typecheck, and pnpm build.
  5. Commit with the Husky pre-commit hook enabled.
  6. Open a pull request and wait for CI.

Roadmap

  • Course paths and guided lessons
  • Quiz engine with review mode
  • User progress persistence
  • Packet analyzer and HTTP inspector
  • Port reference and latency visualizer
  • Secure auth, RBAC, subscriptions, and billing
  • Rate limiting, analytics, secure sessions, and audit logs
  • Admin dashboard

See docs/architecture.md and docs/deployment.md for more detail.

About

AckLab is a production-oriented Next.js MVP for interactive networking fundamentals. It includes subnet visualization, binary conversion, TCP handshake animation, OSI exploration, DNS flow simulation, and graph-based routing.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages