commit 24ad282a109f886f614e1bb8da5ac61c06194e73
parent 04c50be3ac40b58d01dc54684fe59bf1cdaaa7d6
Author: William Lindholm <william_lindholm@outlook.com>
Date: Mon, 21 Sep 2026 19:53:38 +0200
Updated directory strucutre.
Diffstat:
11 files changed, 155 insertions(+), 155 deletions(-)
diff --git a/README.md b/README.md
@@ -27,10 +27,10 @@ Treat the site as a document published on the Web, not as a web application.
### 2. Application
**REQ-01 — Runtime**\
-Use Python and Flask. Keep all Flask logic in `app/main.py`.
+Use Python and Flask. Keep all Flask logic in `cv/main.py`.
**REQ-02 — Page**\
-The application shall contain exactly one page. Serve the résumé at `/`. Keep HTML in `app/index.html` and CSS in `app/style.css`.
+The application shall contain exactly one page. Serve the résumé at `/`. Keep HTML in `cv/index.html` and CSS in `cv/style.css`.
**REQ-03 — JavaScript**\
Do not use JavaScript.
@@ -43,8 +43,8 @@ Use this structure:
/
├── .gitignore
├── README.md
-├── docker-compose.yml
-└── app/
+├── compose.yml
+└── cv/
├── main.py
├── Dockerfile
├── requirements.txt
@@ -68,7 +68,7 @@ Place the start instructions first.
Package the application with Docker. `docker compose up -d` shall start the site. Restarting the container shall restore normal operation.
**REQ-07 — Compose Watch**\
-Configure `develop.watch` in `docker-compose.yml`. `docker compose watch` shall detect changes to application files and update or rebuild the service as required.
+Configure `develop.watch` in `compose.yml`. `docker compose watch` shall detect changes to application files and update or rebuild the service as required.
**REQ-08 — Runtime Dependencies**\
Do not require external CDNs, hosted fonts, analytics, databases, build systems, JavaScript packages, or third-party runtime services.
diff --git a/app/index.html b/app/index.html
@@ -1,118 +0,0 @@
-<!doctype html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="description" content="William Lindholm — software engineer. Curriculum vitae, selected projects, and contact information.">
- <title>William Lindholm - Curriculum vitae</title>
- <link rel="stylesheet" href="/style.css">
-</head>
-<body>
- <a class="skip-link" href="#main">Skip to curriculum vitae</a>
- <header>
- <p class="document-label">Curriculum vitae</p>
- <h1>William Lindholm</h1>
- <p class="subtitle">Software engineer · Skövde, Sweden</p>
- <nav aria-label="Curriculum vitae sections">
- <a href="#experience">Experience</a>
- <a href="#education">Education</a>
- <a href="#projects">Projects</a>
- <a href="#skills">Skills</a>
- <a href="#contact">Contact</a>
- </nav>
- </header>
-
- <main id="main">
- <section aria-labelledby="introduction">
- <h2 id="introduction">Introduction</h2>
- <p>Nice to meet you! I’m a software developer with an interest in low-level programming and embedded systems. I enjoy learning by building, experimenting. Feel free to reach out.</p>
- <p>My experience spans hardware programming, software-defined radio, web development, and automated testing.</p>
- </section>
-
- <section aria-labelledby="experience">
- <h2 id="experience">Work experience</h2>
- <article>
- <h3>Software developer · Combitech</h3>
- <p class="entry-meta">{{ duration("2025-08") }}</p>
- <p>Developing software in a security-sensitive environment using Python and C#, alongside hardware-oriented programming in C++.</p>
- </article>
- <article>
- <h3>Software developer (summer position) · Volvo Group</h3>
- <p class="entry-meta">{{ duration("2025-06", "2025-08") }}</p>
- <p>Continued the migration of a legacy system used to control automated guided vehicles (AGVs). Mentored two new summer developers in technologies and working practices including Scrum, test automation, .NET and Git.</p>
- </article>
- <article>
- <h3>Bachelor’s thesis · Combitech</h3>
- <p class="entry-meta">{{ duration("2025-01", "2025-06") }}</p>
- <p>Completed a 30-credit bachelor’s thesis in collaboration with Combitech, applying and evaluating image anomaly detection algorithms for drone imagery of forest environments.</p>
- </article>
- <article>
- <h3>Software developer (summer position) · Volvo Group</h3>
- <p class="entry-meta">{{ duration("2024-06", "2024-08") }}</p>
- <p>Modernized a legacy AGV control system using .NET Blazor, introduced API integration testing, reduced UI test execution time by approximately 55%, and helped establish new GitHub workflows.</p>
- </article>
- <article>
- <h3>Software developer (summer position) · Volvo Group</h3>
- <p class="entry-meta">{{ duration("2023-06", "2023-08") }}</p>
- <p>Modernized a legacy web interface using Blazor, with Azure DevOps and TFVC for organisation and planning. Implemented a visual identity now used in several internal applications.</p>
- </article>
- </section>
-
- <section aria-labelledby="education">
- <h2 id="education">Education</h2>
- <h3>BSc in Computer Science · University of Skövde</h3>
- <p class="entry-meta">{{ duration("2022-08", "2025-06") }}</p>
- <ul>
- <li>Studied abroad at the University of Limerick, Ireland, in autumn 2024.</li>
- <li>Served as industry relations representative on the board of SKILLS, the student union section for IT students, organising collaborations with companies.</li>
- <li>Represented the University of Skövde as a student ambassador for its Marketing and Communications Department at SACO, Kunskap & Framtid, the university’s open house, the Framtid career fair in Skövde, and visits to upper secondary schools.</li>
- </ul>
- </section>
-
- <section aria-labelledby="projects">
- <h2 id="projects">Selected projects</h2>
- <article>
- <h3>OrionCast</h3>
- <p>AI-based demand forecasting and inventory planning for e-commerce and retail. Uses sales history, stock levels and supplier lead times to help plan when and how much to order. <a href="https://orioncast.ai">Visit OrionCast</a>.</p>
- <p class="entry-meta">AI Forecasting · SaaS · Shopify</p>
- </article>
- <article>
- <h3>Anomaly detection for forest monitoring using UAV imagery</h3>
- <p>Applied and evaluated image anomaly detection algorithms for drone imagery of forest environments in a bachelor’s thesis carried out with Combitech. <a href="https://urn.kb.se/resolve?urn=urn:nbn:se:his:diva-25550">Read the thesis on DiVA</a>.</p>
- <p class="entry-meta">Computer vision · Image anomaly detection</p>
- </article>
- </section>
-
- <section aria-labelledby="skills">
- <h2 id="skills">Technical skills</h2>
- <dl>
- <dt>Languages & frameworks</dt>
- <dd>Python, .NET, Blazor, Angular, C++</dd>
- <dt>Tools & platforms</dt>
- <dd>Git, Docker, Linux, Proxmox</dd>
- <dt>Areas & practices</dt>
- <dd>Hardware programming, software-defined radio, web development, REST APIs, test automation, integration and UI testing, Scrum</dd>
- </dl>
- </section>
-
- <section aria-labelledby="awards">
- <h2 id="awards">Awards and certificates</h2>
- <ul>
- <li>Harmonized Amateur Radio Examination Certificate (HAREC) · 2026</li>
- <li>CCNAv7: Introduction to Networks · 2023</li>
- <li>Lions science scholarship · 2020</li>
- <li>Lions scholarship for outstanding subject knowledge in the natural sciences · 2017</li>
- </ul>
- </section>
-
- <section aria-labelledby="contact">
- <h2 id="contact">Contact and external links</h2>
- <address>
- <p>Email: <a href="mailto:william_lindholm@outlook.com">william@lindholmlabs.com</a></p>
- <p><a href="https://github.com/LindholmLabs">GitHub</a> · <a href="https://www.linkedin.com/in/w-lindholm">LinkedIn</a></p>
- </address>
- </section>
- </main>
-
-</body>
-</html>
diff --git a/Caddyfile b/caddy/Caddyfile
diff --git a/compose.yml b/compose.yml
@@ -0,0 +1,32 @@
+services:
+ caddy:
+ image: caddy:2-alpine
+ restart: unless-stopped
+ ports:
+ - "80:80"
+ - "443:443"
+ volumes:
+ - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
+ depends_on:
+ - cv
+
+ cv:
+ build: ./cv
+ ports:
+ - "127.0.0.1:8000:8000"
+ restart: unless-stopped
+ develop:
+ watch:
+ - action: sync+restart
+ path: ./cv/main.py
+ target: /app/main.py
+ - action: sync
+ path: ./cv/index.html
+ target: /app/index.html
+ - action: sync
+ path: ./cv/style.css
+ target: /app/style.css
+ - action: rebuild
+ path: ./cv/Dockerfile
+ - action: rebuild
+ path: ./cv/requirements.txt
diff --git a/app/Dockerfile b/cv/Dockerfile
diff --git a/cv/index.html b/cv/index.html
@@ -0,0 +1,118 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="description" content="William Lindholm — software engineer. Curriculum vitae, selected projects, and contact information.">
+ <title>William Lindholm - Curriculum vitae</title>
+ <link rel="stylesheet" href="/style.css">
+</head>
+<body>
+ <a class="skip-link" href="#main">Skip to curriculum vitae</a>
+ <header>
+ <p class="document-label">Curriculum vitae</p>
+ <h1>William Lindholm</h1>
+ <p class="subtitle">Software engineer · Skövde, Sweden</p>
+ <nav aria-label="Curriculum vitae sections">
+ <a href="#experience">Experience</a>
+ <a href="#education">Education</a>
+ <a href="#projects">Projects</a>
+ <a href="#skills">Skills</a>
+ <a href="#contact">Contact</a>
+ </nav>
+ </header>
+
+ <main id="main">
+ <section aria-labelledby="introduction">
+ <h2 id="introduction">Introduction</h2>
+ <p>Nice to meet you! I’m a software developer with an interest in low-level programming and embedded systems. I enjoy learning by building and experimenting. Feel free to reach out.</p>
+ <p>My experience spans hardware programming, software-defined radio, web development, and automated testing.</p>
+ </section>
+
+ <section aria-labelledby="experience">
+ <h2 id="experience">Work experience</h2>
+ <article>
+ <h3>Software developer · Combitech</h3>
+ <p class="entry-meta">{{ duration("2025-08") }}</p>
+ <p>Developing software in a security-sensitive environment using Python and C#, alongside hardware-oriented programming in C++.</p>
+ </article>
+ <article>
+ <h3>Software developer (summer position) · Volvo Group</h3>
+ <p class="entry-meta">{{ duration("2025-06", "2025-08") }}</p>
+ <p>Continued the migration of a legacy system used to control automated guided vehicles (AGVs). Mentored two new summer developers in technologies and working practices including Scrum, test automation, .NET and Git.</p>
+ </article>
+ <article>
+ <h3>Bachelor’s thesis · Combitech</h3>
+ <p class="entry-meta">{{ duration("2025-01", "2025-06") }}</p>
+ <p>Completed a 30-credit bachelor’s thesis in collaboration with Combitech, applying and evaluating image anomaly detection algorithms for drone imagery of forest environments.</p>
+ </article>
+ <article>
+ <h3>Software developer (summer position) · Volvo Group</h3>
+ <p class="entry-meta">{{ duration("2024-06", "2024-08") }}</p>
+ <p>Modernized a legacy AGV control system using .NET Blazor, introduced API integration testing, reduced UI test execution time by approximately 55%, and helped establish new GitHub workflows.</p>
+ </article>
+ <article>
+ <h3>Software developer (summer position) · Volvo Group</h3>
+ <p class="entry-meta">{{ duration("2023-06", "2023-08") }}</p>
+ <p>Modernized a legacy web interface using Blazor, with Azure DevOps and TFVC for organisation and planning. Implemented a visual identity now used in several internal applications.</p>
+ </article>
+ </section>
+
+ <section aria-labelledby="education">
+ <h2 id="education">Education</h2>
+ <h3>BSc in Computer Science · University of Skövde</h3>
+ <p class="entry-meta">{{ duration("2022-08", "2025-06") }}</p>
+ <ul>
+ <li>Studied abroad at the University of Limerick, Ireland, in autumn 2024.</li>
+ <li>Served as industry relations representative on the board of SKILLS, the student union section for IT students, organising collaborations with companies.</li>
+ <li>Represented the University of Skövde as a student ambassador for its Marketing and Communications Department at SACO, Kunskap & Framtid, the university’s open house, the Framtid career fair in Skövde, and visits to upper secondary schools.</li>
+ </ul>
+ </section>
+
+ <section aria-labelledby="projects">
+ <h2 id="projects">Selected projects</h2>
+ <article>
+ <h3>OrionCast</h3>
+ <p>AI-based demand forecasting and inventory planning for e-commerce and retail. Uses sales history, stock levels and supplier lead times to help plan when and how much to order. <a href="https://orioncast.ai">Visit OrionCast</a>.</p>
+ <p class="entry-meta">AI Forecasting · SaaS · Shopify</p>
+ </article>
+ <article>
+ <h3>Anomaly detection for forest monitoring using UAV imagery</h3>
+ <p>Applied and evaluated image anomaly detection algorithms for drone imagery of forest environments in a bachelor’s thesis carried out with Combitech. <a href="https://urn.kb.se/resolve?urn=urn:nbn:se:his:diva-25550">Read the thesis on DiVA</a>.</p>
+ <p class="entry-meta">Computer vision · Image anomaly detection</p>
+ </article>
+ </section>
+
+ <section aria-labelledby="skills">
+ <h2 id="skills">Technical skills</h2>
+ <dl>
+ <dt>Languages & frameworks</dt>
+ <dd>Python, .NET, Blazor, Angular, C++</dd>
+ <dt>Tools & platforms</dt>
+ <dd>Git, Docker, Linux, Proxmox</dd>
+ <dt>Areas & practices</dt>
+ <dd>Hardware programming, software-defined radio, web development, REST APIs, test automation, integration and UI testing, Scrum</dd>
+ </dl>
+ </section>
+
+ <section aria-labelledby="awards">
+ <h2 id="awards">Awards and certificates</h2>
+ <ul>
+ <li>Harmonized Amateur Radio Examination Certificate (HAREC) · 2026</li>
+ <li>CCNAv7: Introduction to Networks · 2023</li>
+ <li>Lions science scholarship · 2020</li>
+ <li>Lions scholarship for outstanding subject knowledge in the natural sciences · 2017</li>
+ </ul>
+ </section>
+
+ <section aria-labelledby="contact">
+ <h2 id="contact">Contact and external links</h2>
+ <address>
+ <p>Email: <a href="mailto:william_lindholm@outlook.com">william@lindholmlabs.com</a></p>
+ <p><a href="https://github.com/LindholmLabs">GitHub</a> · <a href="https://www.linkedin.com/in/w-lindholm">LinkedIn</a></p>
+ </address>
+ </section>
+ </main>
+
+</body>
+</html>
diff --git a/app/main.py b/cv/main.py
diff --git a/app/requirements.txt b/cv/requirements.txt
diff --git a/app/style.css b/cv/style.css
diff --git a/docker-compose.yml b/docker-compose.yml
@@ -1,32 +0,0 @@
-services:
- caddy:
- image: caddy:2-alpine
- restart: unless-stopped
- ports:
- - "80:80"
- - "443:443"
- volumes:
- - ./Caddyfile:/etc/caddy/Caddyfile:ro
- depends_on:
- - cv
-
- cv:
- build: ./app
- ports:
- - "127.0.0.1:8000:8000"
- restart: unless-stopped
- develop:
- watch:
- - action: sync+restart
- path: ./app/main.py
- target: /app/main.py
- - action: sync
- path: ./app/index.html
- target: /app/index.html
- - action: sync
- path: ./app/style.css
- target: /app/style.css
- - action: rebuild
- path: ./app/Dockerfile
- - action: rebuild
- path: ./app/requirements.txt
diff --git a/stagit/.gitkeep b/stagit/.gitkeep