Skip to content

martinzachariassen/martinzachariassen.github.io

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

66 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

mlz.no

mlz.no logo

Personal portfolio β€” built as an interactive terminal

Live MIT License React TypeScript Vite


About

A terminal-style personal homepage for Martin Zachariassen β€” back-end developer with 9 years of experience in architecture, integrations and production services. Instead of a traditional portfolio layout, everything is navigated through typed commands: about, experience, skills, links, and more.

Built with React, TypeScript and Vite. Styled with a Tokyo Night colour palette. No CSS framework β€” just design tokens and plain CSS.


Getting started

# Install dependencies
npm install

# Start dev server
npm run dev

# Type-check
npm run typecheck

# Production build
npm run build

Commands

Type help in the terminal to see all available commands. Type help --secret for more.

Command Description
help Show available commands
about Who I am
skills Areas of focus & interests
experience Work history
contact How to reach me
links GitHub, LinkedIn, homepage
open <target> Open a link - github Β· linkedin Β· homepage
whoami Who is this?
ls / ls -la List "files"
pwd Print working directory
clear Clear the screen
matrix πŸ‘€

Project structure

src/
β”œβ”€β”€ App.tsx
β”œβ”€β”€ main.tsx
β”œβ”€β”€ vite-env.d.ts
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ NameHeader/
β”‚   β”‚   β”œβ”€β”€ NameHeader.tsx     # Name + tagline header shown above the terminal
β”‚   β”‚   └── NameHeader.css
β”‚   └── Terminal/
β”‚       β”œβ”€β”€ Terminal.tsx       # Main terminal component
β”‚       β”œβ”€β”€ Terminal.css
β”‚       β”œβ”€β”€ components/
β”‚       β”‚   β”œβ”€β”€ OutputLine.tsx  # Renders a single output line
β”‚       β”‚   β”œβ”€β”€ OutputLine.css
β”‚       β”‚   └── TerminalPrompt.tsx  # Input prompt component
β”‚       β”œβ”€β”€ hooks/
β”‚       β”‚   β”œβ”€β”€ useBanner.ts        # Boot banner logic
β”‚       β”‚   β”œβ”€β”€ useCommandRunner.ts # Command dispatch
β”‚       β”‚   β”œβ”€β”€ useEasterEggs.ts    # Easter egg triggers
β”‚       β”‚   β”œβ”€β”€ useResize.ts        # Drag-to-resize (desktop only)
β”‚       β”‚   β”œβ”€β”€ useViewport.ts      # Viewport size tracking
β”‚       β”‚   └── useViewportEvents.ts
β”‚       └── state/
β”‚           └── terminalReducer.ts  # Terminal state management
β”œβ”€β”€ easter/
β”‚   β”œβ”€β”€ MatrixOverlay.tsx      # Matrix rain canvas effect
β”‚   β”œβ”€β”€ MatrixOverlay.css
β”‚   └── useKonami.ts           # Konami code listener
β”œβ”€β”€ styles/
β”‚   └── global.css             # Design tokens, reset, global styles
└── terminal/
    β”œβ”€β”€ parseCommand.ts        # Input parser
    β”œβ”€β”€ text.ts                # Linkify utility
    └── commands/
        β”œβ”€β”€ index.ts           # Command registry
        β”œβ”€β”€ types.ts           # Shared command types
        β”œβ”€β”€ about.ts
        β”œβ”€β”€ contact.ts
        β”œβ”€β”€ easter.ts
        β”œβ”€β”€ experience.ts
        β”œβ”€β”€ focus.ts
        β”œβ”€β”€ help.ts
        β”œβ”€β”€ system.ts
        └── tech/
            β”œβ”€β”€ index.ts
            β”œβ”€β”€ backend.ts
            β”œβ”€β”€ build.ts
            β”œβ”€β”€ data.ts
            β”œβ”€β”€ ops.ts
            β”œβ”€β”€ platform.ts
            └── testing.ts

public/
β”œβ”€β”€ favicon.ico / favicon*.png # All favicon sizes
β”œβ”€β”€ apple-touch-icon.png
β”œβ”€β”€ icon-192.png / icon-512.png
β”œβ”€β”€ site.webmanifest           # PWA manifest
β”œβ”€β”€ robots.txt
β”œβ”€β”€ sitemap.xml
└── .nojekyll                  # Prevents Jekyll processing on GitHub Pages

scripts/
└── generate-favicons.mjs      # Generates all favicon sizes from favicon.png

Tech stack

Area Technology
Framework React 19
Language TypeScript 5
Build tool Vite 7
Styling Plain CSS with design tokens - no framework
Font JetBrains Mono via Google Fonts
Hosting GitHub Pages
Analytics Umami - cookieless, GDPR-compliant, self-hosted

Deployment

Deployments are triggered by publishing a GitHub Release. The workflow automatically:

  1. Checks out main
  2. Sets VITE_APP_VERSION from the release tag (shown in the boot sequence)
  3. Fetches the latest Umami analytics script
  4. Builds with Vite (Terser, vendor chunk splitting, es2022 target)
  5. Deploys to GitHub Pages via actions/deploy-pages

To release a new version:

# 1. Merge your work to main
# 2. Go to GitHub β†’ Releases β†’ Draft a new release
# 3. Create a new tag (e.g. v1.2.0), target main, publish
# β†’ Deployment starts automatically

Manual deploys are also available under Actions β†’ Deploy to GitHub Pages β†’ Run workflow.


Scripts

Script Description
npm run dev Start local dev server
npm run build Type-check + production build
npm run typecheck Run TypeScript compiler check only
npm run preview Preview the production build locally
npm run generate-favicons Regenerate all favicon sizes from public/favicon.png

Accessibility & performance

  • WCAG AA colour contrast throughout
  • Skip-to-content link for keyboard users
  • role="log" + aria-live="polite" on terminal output
  • All interactive elements have descriptive aria-label
  • :focus-visible styles for keyboard navigation
  • Non-blocking font loading (media="print" swap trick)
  • Vendor chunk splitting for better cache utilisation
  • Self-hosted Umami script β€” no third-party DNS lookup
  • color-scheme: dark to prevent flash of white on load
  • contain: layout paint on terminal for paint isolation

Browser support

Modern browsers only - Chrome, Firefox, Safari, Edge (last 2 versions).
No IE11, no legacy polyfills. Build target: es2022.


Contributing

This is a personal site - PRs are not expected.
Feel free to fork it and use it as inspiration for your own terminal portfolio.


License

MIT Β© 2026 Martin Zachariassen