Skip to content

Commit 283e00a

Browse files
Merge pull request #2 from martinzachariassen/feat/create-v2
feat: create version 2 of website
2 parents f3aa413 + 2775535 commit 283e00a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+3760
-495
lines changed

.github/workflows/deploy.yml

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,57 @@
1-
name: Build and Deploy Vite App to GitHub Pages
1+
name: Deploy to GitHub Pages
22

33
on:
44
push:
5-
branches:
6-
- main
5+
branches: [main]
6+
workflow_dispatch: # allow manual triggers from the Actions tab
77

88
permissions:
99
contents: read
1010
pages: write
1111
id-token: write
1212

13+
# Only allow one deployment at a time; cancel in-flight runs on new push
14+
concurrency:
15+
group: pages
16+
cancel-in-progress: true
17+
1318
jobs:
1419
build:
20+
name: Build
1521
runs-on: ubuntu-latest
1622
steps:
17-
# Step 1: Checkout the repository
18-
- name: Checkout repository
23+
- name: Checkout
1924
uses: actions/checkout@v4
2025

21-
# Step 2: Set up Node.js environment
22-
- name: Setup Node.js
26+
- name: Setup Node 24
2327
uses: actions/setup-node@v4
2428
with:
25-
node-version: 22
26-
cache: 'npm'
29+
node-version: 24
30+
cache: npm
2731

28-
# Step 3: Install dependencies
2932
- name: Install dependencies
3033
run: npm ci
3134

32-
# Step 4: Build the project
33-
- name: Build the project
34-
run: npm run build
35+
- name: Refresh Umami script
36+
run: curl -s https://cloud.umami.is/script.js -o public/umami.js
3537

36-
# Step 5: Check dist folder size
37-
- name: Check dist folder size
38-
run: du -sh dist
38+
- name: Build
39+
run: npm run build
3940

40-
# Step 6: Upload the built folder as an artifact
41-
- name: Upload artifact
41+
- name: Upload Pages artifact
4242
uses: actions/upload-pages-artifact@v3
4343
with:
44-
name: github-pages # GitHub Pages expects this artifact name
45-
path: dist
44+
path: ./dist
4645

4746
deploy:
48-
runs-on: ubuntu-latest
47+
name: Deploy
4948
needs: build
50-
51-
permissions:
52-
pages: write
53-
id-token: write
54-
49+
runs-on: ubuntu-latest
50+
environment:
51+
name: github-pages
52+
url: ${{ steps.deployment.outputs.page_url }}
5553
steps:
56-
# Step 1: Download artifact
57-
- name: Download artifact
58-
uses: actions/download-artifact@v4
59-
with:
60-
name: github-pages
61-
path: dist
62-
63-
# Step 2: Deploy to GitHub Pages
6454
- name: Deploy to GitHub Pages
55+
id: deployment
6556
uses: actions/deploy-pages@v4
57+

.gitignore

Lines changed: 91 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,103 @@
1+
# ------------------------------
2+
# Dependencies
3+
# ------------------------------
4+
node_modules/
5+
.pnpm-store/
6+
.yarn/*
7+
!.yarn/patches
8+
!.yarn/plugins
9+
!.yarn/releases
10+
!.yarn/sdks
11+
!.yarn/versions
12+
13+
# ------------------------------
14+
# Build output
15+
# ------------------------------
16+
dist/
17+
dist-ssr/
18+
build/
19+
out/
20+
21+
# ------------------------------
22+
# Generated / fetched at build time
23+
# ------------------------------
24+
public/umami.js
25+
26+
# Vite / bundler caches
27+
.vite/
28+
.esbuild/
29+
.swc/
30+
.rollup.cache/
31+
.rspack-cache/
32+
.parcel-cache/
33+
34+
# ------------------------------
35+
# Environment files (secrets)
36+
# ------------------------------
37+
.env
38+
.env.*
39+
!.env.example
40+
41+
# ------------------------------
142
# Logs
2-
logs
43+
# ------------------------------
44+
logs/
345
*.log
446
npm-debug.log*
547
yarn-debug.log*
648
yarn-error.log*
749
pnpm-debug.log*
850
lerna-debug.log*
951

10-
node_modules
11-
dist
12-
dist-ssr
13-
*.local
52+
# ------------------------------
53+
# Local tooling / coverage
54+
# ------------------------------
55+
coverage/
56+
.nyc_output/
57+
*.lcov
58+
59+
# Vitest / Jest caches
60+
.vitest/
61+
jest-cache/
62+
.jest/
63+
*.snap
1464

15-
# Editor directories and files
65+
# Playwright / Cypress (keep screenshots/videos out of repo)
66+
playwright-report/
67+
test-results/
68+
cypress/videos/
69+
cypress/screenshots/
70+
71+
# ------------------------------
72+
# TypeScript
73+
# ------------------------------
74+
*.tsbuildinfo
75+
76+
# ------------------------------
77+
# Editor / IDE
78+
# ------------------------------
1679
.vscode/*
1780
!.vscode/extensions.json
18-
.idea
81+
!.vscode/settings.json
82+
!.vscode/launch.json
83+
!.vscode/tasks.json
84+
85+
.idea/
86+
*.iml
87+
88+
# ------------------------------
89+
# OS junk
90+
# ------------------------------
1991
.DS_Store
20-
*.suo
21-
*.ntvs*
22-
*.njsproj
23-
*.sln
24-
*.sw?
92+
.DS_Store?
93+
._*
94+
.Spotlight-V100
95+
.Trashes
96+
Thumbs.db
97+
ehthumbs.db
98+
Desktop.ini
99+
100+
# ------------------------------
101+
# Misc
102+
# ------------------------------
103+
*.loca

CNAME

Lines changed: 0 additions & 1 deletion
This file was deleted.

index.html

Lines changed: 78 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,85 @@
1-
<!DOCTYPE html>
2-
<html lang="en" class="scroll-smooth">
3-
<head>
4-
<meta charset="UTF-8" />
5-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6-
<title>Crafting the Backbone of Modern Applications</title>
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8"/>
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"/>
76

8-
<!-- Google tag (gtag.js) -->
9-
<script
10-
async
11-
src="https://www.googletagmanager.com/gtag/js?id=G-M2E35PYWYV"
12-
></script>
13-
<script>
14-
window.dataLayer = window.dataLayer || [];
15-
function gtag() {
16-
dataLayer.push(arguments);
17-
}
18-
gtag("js", new Date());
19-
gtag("config", "G-M2E35PYWYV");
20-
</script>
7+
<!-- Primary meta -->
8+
<title>mlz.no - Martin Zachariassen</title>
9+
<meta name="description"
10+
content="Martin Zachariassen — backend developer. Architecture, integrations and production-critical services."/>
11+
<meta name="author" content="Martin Zachariassen"/>
12+
<meta name="robots" content="index, follow"/>
13+
<link rel="canonical" href="https://mlz.no/"/>
2114

22-
<!-- Tailwind -->
23-
<script src="https://cdn.tailwindcss.com"></script>
15+
<!-- Open Graph -->
16+
<meta property="og:type" content="website"/>
17+
<meta property="og:url" content="https://mlz.no/"/>
18+
<meta property="og:site_name" content="mlz.no"/>
19+
<meta property="og:title" content="mlz.no — Martin Zachariassen"/>
20+
<meta property="og:description"
21+
content="Backend developer. Architecture, integrations and production-critical services."/>
22+
<meta property="og:image" content="https://mlz.no/icon-512.png"/>
23+
<meta property="og:image:width" content="512"/>
24+
<meta property="og:image:height" content="512"/>
25+
<meta property="og:image:type" content="image/png"/>
26+
<meta property="og:locale" content="en_GB"/>
2427

25-
<!-- Font -->
26-
<style>
27-
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400&display=swap");
28-
body {
29-
font-family: "Poppins", sans-serif;
30-
}
31-
</style>
28+
<!-- Twitter / X -->
29+
<meta name="twitter:card" content="summary"/>
30+
<meta name="twitter:url" content="https://mlz.no/"/>
31+
<meta name="twitter:title" content="mlz.no — Martin Zachariassen"/>
32+
<meta name="twitter:description"
33+
content="Backend developer. Architecture, integrations and production-critical services."/>
34+
<meta name="twitter:image" content="https://mlz.no/icon-512.png"/>
3235

33-
<!-- Favicon -->
34-
<link
35-
rel="icon"
36-
type="image/png"
37-
sizes="16x16"
38-
href="images/favicon/favicon-16x16.png"
39-
/>
40-
<link
41-
rel="icon"
42-
type="image/png"
43-
sizes="32x32"
44-
href="images/favicon/favicon-32x32.png"
45-
/>
46-
<link
47-
rel="icon"
48-
type="image/png"
49-
sizes="192x192"
50-
href="images/favicon/android-chrome-192x192.png"
51-
/>
52-
<link
53-
rel="icon"
54-
type="image/png"
55-
sizes="512x512"
56-
href="images/favicon/android-chrome-512x512.png"
57-
/>
58-
<link rel="apple-touch-icon" href="images/favicon/apple-touch-icon.png" />
59-
</head>
36+
<!-- Favicons -->
37+
<link rel="icon" type="image/x-icon" href="/favicon.ico"/>
38+
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"/>
39+
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"/>
40+
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png"/>
41+
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"/>
42+
<link rel="manifest" href="/site.webmanifest"/>
43+
<meta name="theme-color" content="#1a1b26"/>
6044

61-
<body class="bg-black text-white font-sans">
62-
<header
63-
class="h-screen flex items-center justify-center text-center bg-black relative"
64-
>
65-
<div
66-
class="container mx-auto max-w-screen-lg px-4 md:px-6 lg:px-8 xl:px-10 2xl:px-12 grid grid-cols-1 md:grid-cols-2 gap-6 items-center"
67-
>
68-
<!-- Text Section -->
69-
<div class="order-2 md:order-1 max-w-xl md:ml-4">
70-
<h1 class="text-4xl md:text-5xl font-bold text-white">
71-
Hello. <br />
72-
I am <span class="text-yellow-400">Martin</span>
73-
</h1>
74-
<p class="mt-4 text-base md:text-lg text-gray-300">
75-
Backend developer specializing in building robust APIs, scalable
76-
core systems, and event-driven architectures. Experienced in
77-
crafting seamless integrations for modern distributed applications.
78-
</p>
79-
<div
80-
class="mt-8 flex flex-col md:flex-row gap-4 justify-center md:justify-center"
81-
>
82-
<a
83-
href="https://github.com/martinzachariassen"
84-
target="_blank"
85-
rel="noopener noreferrer"
86-
class="bg-gray-900 border border-yellow-400 text-yellow-400 px-6 py-3 rounded-md font-semibold hover:bg-yellow-400 hover:text-black hover:shadow-lg transition"
87-
>
88-
Check Out My GitHub
89-
</a>
90-
</div>
91-
</div>
45+
<!-- Font: preconnect first, then preload the single woff2 we actually need -->
46+
<link rel="preconnect" href="https://fonts.googleapis.com"/>
47+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/>
48+
<link rel="preload" as="style"
49+
href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&display=swap"/>
50+
<link rel="stylesheet"
51+
href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&display=swap"
52+
media="print" onload="this.media='all'"/>
53+
<noscript>
54+
<link rel="stylesheet"
55+
href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&display=swap"/>
56+
</noscript>
9257

93-
<!-- Image Section -->
94-
<div class="order-1 md:order-2 flex justify-center">
95-
<img
96-
src="/images/martin.jpg"
97-
alt="Martin"
98-
class="rounded-lg shadow-lg w-48 h-48 sm:w-60 sm:h-60 md:w-80 md:h-80 object-cover transform hover:scale-105 transition duration-300"
99-
/>
100-
</div>
101-
</div>
102-
</header>
103-
</body>
58+
<!-- Structured data (JSON-LD) -->
59+
<script type="application/ld+json">
60+
{
61+
"@context": "https://schema.org",
62+
"@type": "Person",
63+
"name": "Martin Zachariassen",
64+
"url": "https://mlz.no",
65+
"jobTitle": "Back-End Developer",
66+
"description": "Backend developer with 9 years of experience in architecture, integrations and production-critical services.",
67+
"sameAs": [
68+
"https://github.com/martinzachariassen",
69+
"https://www.linkedin.com/in/martinzachariassen"
70+
],
71+
"address": {
72+
"@type": "PostalAddress",
73+
"addressCountry": "NO"
74+
}
75+
}
76+
</script>
77+
<!-- Analytics (Umami — cookieless, GDPR-compliant, self-hosted script) -->
78+
<script defer src="/umami.js"
79+
data-website-id="e73d093f-ea9e-4839-8c5f-3dd4888a3c36"></script>
80+
</head>
81+
<body>
82+
<div id="app"></div>
83+
<script type="module" src="/src/main.tsx"></script>
84+
</body>
10485
</html>

0 commit comments

Comments
 (0)