resume_page

Log | Files | Refs | README

commit 24ad282a109f886f614e1bb8da5ac61c06194e73
parent 04c50be3ac40b58d01dc54684fe59bf1cdaaa7d6
Author: William Lindholm <william_lindholm@outlook.com>
Date:   Mon, 21 Sep 2026 19:53:38 +0200

Updated directory strucutre.

Diffstat:
MREADME.md | 10+++++-----
Dapp/index.html | 118-------------------------------------------------------------------------------
RCaddyfile -> caddy/Caddyfile | 0
Acompose.yml | 32++++++++++++++++++++++++++++++++
Rapp/Dockerfile -> cv/Dockerfile | 0
Acv/index.html | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rapp/main.py -> cv/main.py | 0
Rapp/requirements.txt -> cv/requirements.txt | 0
Rapp/style.css -> cv/style.css | 0
Ddocker-compose.yml | 32--------------------------------
Astagit/.gitkeep | 0
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 &amp; 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 &amp; frameworks</dt> - <dd>Python, .NET, Blazor, Angular, C++</dd> - <dt>Tools &amp; platforms</dt> - <dd>Git, Docker, Linux, Proxmox</dd> - <dt>Areas &amp; 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 &amp; 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 &amp; frameworks</dt> + <dd>Python, .NET, Blazor, Angular, C++</dd> + <dt>Tools &amp; platforms</dt> + <dd>Git, Docker, Linux, Proxmox</dd> + <dt>Areas &amp; 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