Add profiles and localization for Björn Blomberg's CV

- Created new profile files for various programming languages (embedded, Go, Java, web, C++, C#, etc.) in both English and Swedish.
- Added localization support with YAML files for English and Swedish, including meta information, sections, labels, and sidebar content.
- Developed a template for rendering the CV with a structured layout, including sections for profile, experience, education, and skills.
- Implemented build scripts for compiling Typst files into PDF format for both PowerShell and shell environments.

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
Björn Blomberg
2026-05-08 13:41:14 +02:00
parent 849b98614a
commit 4d4ce3469d
56 changed files with 285276 additions and 1 deletions

150
README.md
View File

@@ -1,2 +1,150 @@
## Projekt CV ## Projekt CV
Ett prodjekt för att hantera och uppdatera minna cv:n skrivna i typst # Projekt CV
Detta projekt innehaller en Typst-baserad struktur for att generera ateranvandbara CV-varianter pa svenska och engelska.
Varje dokumentvariant innehaller:
- personligt brev
- profiltext for vald roll
- arbetshistorik
- utbildningshistorik
- kunskapstabell
Malet med strukturen ar att ateranvanda sa mycket som mojligt. Arbetshistorik, utbildning, sidokolumn och kunskapstabell delas per sprak, medan profiltext och personligt brev delas upp per roll och sprak.
## Roller och sprak
Folkjande roller finns som publicerbara varianter i bade svenska och engelska:
- Java
- C#
- Go
- C++
- Embedded systems
- Web developer
Det ger totalt 12 byggbara dokument i `publishing/`.
## Projektstruktur
```text
assets/
profile/
me.png
me-s.png
publishing/
en/
web.typ
embedded.typ
java.typ
csharp.typ
go.typ
cpp.typ
sv/
web.typ
embedded.typ
java.typ
csharp.typ
go.typ
cpp.typ
src/
content/
letters/
en/
sv/
profiles/
en/
sv/
data/
en.yaml
sv.yaml
lib/
template.typ
tools/
build-all.ps1
build-all.sh
```
## Hur innehall ateranvands
- `src/data/sv.yaml` innehaller allt delat innehall for svenska CV:n.
- `src/data/en.yaml` innehaller allt delat innehall for engelska CV:n.
- `src/content/profiles/<sprak>/` innehaller rollspecifika profiltexter.
- `src/content/letters/<sprak>/` innehaller personliga brev per roll.
- `src/lib/template.typ` innehaller den gemensamma Typst-mallen for layout, tabeller, bildanvandning och sektioner.
- `publishing/<sprak>/` innehaller tunna entrypoints som bara binder ihop sprakdata, profil och brev med samma mall.
## Bygga en enskild variant
Alla kommandon ska koras fran projektroten.
### Windows
Om Typst inte ar installerat:
```powershell
winget install --id Typst.Typst
```
Bygg en enskild svensk variant:
```powershell
typst compile --root . .\publishing\sv\web.typ .\publishing\sv\web.pdf
```
Bygg en enskild engelsk variant:
```powershell
typst compile --root . .\publishing\en\java.typ .\publishing\en\java.pdf
```
Om `typst` inte hittas direkt efter installationen, starta om terminalen eller anvand projektets byggskript i en ny terminal.
### Linux
Installera Typst med din pakethanterare eller enligt Typsts egna instruktioner. Exempel:
```bash
typst compile --root . ./publishing/sv/web.typ ./publishing/sv/web.pdf
typst compile --root . ./publishing/en/java.typ ./publishing/en/java.pdf
```
## Bygga alla varianter
### Windows
```powershell
.\tools\build-all.ps1
```
### Linux
```bash
sh ./tools/build-all.sh
```
Skripten kompilerar alla `.typ`-filer under `publishing/` och skriver PDF-filer bredvid respektive entrypoint.
## Lagg till eller uppdatera en variant
1. Uppdatera delad sprakdata i `src/data/sv.yaml` eller `src/data/en.yaml` om arbetshistorik, utbildning eller kunskapstabell andras.
2. Uppdatera eller skapa en profil i `src/content/profiles/<sprak>/` om rollen behover en ny profiltext.
3. Uppdatera eller skapa ett personligt brev i `src/content/letters/<sprak>/`.
4. Skapa eller justera motsvarande entrypoint i `publishing/<sprak>/`.
## Designriktning
Layouten ar omskriven i Typst och moderniserad jamfort med LaTeX-versionen, men den behaller samma overgripande fargidentitet:
- bla huvudfarg for rubriker
- varm accentfarg for rolltitel och arbetsrubriker
- neutral textfarg for brodtext
- gemensam profilbild i alla varianter
## Kommentar om kallbacka
Projektstrukturen ar framtagen utifran innehall och designmönster i GitHub-repot `brasse18/cv-LateX`, men slutresultatet i denna arbetsyta ar nu Typst-baserat och organiserat for maximal ateranvandning.

BIN
assets/profile/me-s.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
assets/profile/me.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

23698
publishing/en/cpp.pdf Normal file

File diff suppressed because it is too large Load Diff

7
publishing/en/cpp.typ Normal file
View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/en/cpp.typ": body as profile-body
#import "../../src/content/letters/en/cpp.typ": body as letter-body
#let lang-data = yaml("../../src/data/en.yaml")
#render-variant(lang-data, "cpp", profile-body, letter-body)

23678
publishing/en/csharp.pdf Normal file

File diff suppressed because it is too large Load Diff

7
publishing/en/csharp.typ Normal file
View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/en/csharp.typ": body as profile-body
#import "../../src/content/letters/en/csharp.typ": body as letter-body
#let lang-data = yaml("../../src/data/en.yaml")
#render-variant(lang-data, "csharp", profile-body, letter-body)

23685
publishing/en/embedded.pdf Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/en/embedded.typ": body as profile-body
#import "../../src/content/letters/en/embedded.typ": body as letter-body
#let lang-data = yaml("../../src/data/en.yaml")
#render-variant(lang-data, "embedded", profile-body, letter-body)

23654
publishing/en/go.pdf Normal file

File diff suppressed because it is too large Load Diff

7
publishing/en/go.typ Normal file
View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/en/go.typ": body as profile-body
#import "../../src/content/letters/en/go.typ": body as letter-body
#let lang-data = yaml("../../src/data/en.yaml")
#render-variant(lang-data, "go", profile-body, letter-body)

23678
publishing/en/java.pdf Normal file

File diff suppressed because it is too large Load Diff

7
publishing/en/java.typ Normal file
View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/en/java.typ": body as profile-body
#import "../../src/content/letters/en/java.typ": body as letter-body
#let lang-data = yaml("../../src/data/en.yaml")
#render-variant(lang-data, "java", profile-body, letter-body)

23687
publishing/en/web.pdf Normal file

File diff suppressed because it is too large Load Diff

7
publishing/en/web.typ Normal file
View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/en/web.typ": body as profile-body
#import "../../src/content/letters/en/web.typ": body as letter-body
#let lang-data = yaml("../../src/data/en.yaml")
#render-variant(lang-data, "web", profile-body, letter-body)

23698
publishing/sv/cpp.pdf Normal file

File diff suppressed because it is too large Load Diff

7
publishing/sv/cpp.typ Normal file
View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/sv/cpp.typ": body as profile-body
#import "../../src/content/letters/sv/cpp.typ": body as letter-body
#let lang-data = yaml("../../src/data/sv.yaml")
#render-variant(lang-data, "cpp", profile-body, letter-body)

23702
publishing/sv/csharp.pdf Normal file

File diff suppressed because it is too large Load Diff

7
publishing/sv/csharp.typ Normal file
View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/sv/csharp.typ": body as profile-body
#import "../../src/content/letters/sv/csharp.typ": body as letter-body
#let lang-data = yaml("../../src/data/sv.yaml")
#render-variant(lang-data, "csharp", profile-body, letter-body)

23689
publishing/sv/embedded.pdf Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/sv/embedded.typ": body as profile-body
#import "../../src/content/letters/sv/embedded.typ": body as letter-body
#let lang-data = yaml("../../src/data/sv.yaml")
#render-variant(lang-data, "embedded", profile-body, letter-body)

23696
publishing/sv/go.pdf Normal file

File diff suppressed because it is too large Load Diff

7
publishing/sv/go.typ Normal file
View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/sv/go.typ": body as profile-body
#import "../../src/content/letters/sv/go.typ": body as letter-body
#let lang-data = yaml("../../src/data/sv.yaml")
#render-variant(lang-data, "go", profile-body, letter-body)

23682
publishing/sv/java.pdf Normal file

File diff suppressed because it is too large Load Diff

7
publishing/sv/java.typ Normal file
View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/sv/java.typ": body as profile-body
#import "../../src/content/letters/sv/java.typ": body as letter-body
#let lang-data = yaml("../../src/data/sv.yaml")
#render-variant(lang-data, "java", profile-body, letter-body)

23691
publishing/sv/web.pdf Normal file

File diff suppressed because it is too large Load Diff

7
publishing/sv/web.typ Normal file
View File

@@ -0,0 +1,7 @@
#import "../../src/lib/template.typ": render-variant
#import "../../src/content/profiles/sv/web.typ": body as profile-body
#import "../../src/content/letters/sv/web.typ": body as letter-body
#let lang-data = yaml("../../src/data/sv.yaml")
#render-variant(lang-data, "web", profile-body, letter-body)

View File

@@ -0,0 +1,7 @@
#let body = [
I am looking for roles where C++ is used to build performance-sensitive or system-near software with clear quality requirements. My background in algorithms, C/C++, Linux, and embedded-oriented work means I am most comfortable when I can work close to the technology and understand why a solution behaves the way it does.
Through studies, personal projects, and professional assignments, I have become used to tools and environments that require precision, structure, and technical depth. I particularly value work where testability, resource awareness, and long-term code quality are important parts of the end result.
I want to continue growing in environments where C++ is applied to real engineering problems and where analytical thinking is valued. That is where I believe my profile can contribute most strongly.
]

View File

@@ -0,0 +1,7 @@
#let body = [
I am looking for roles where C\# and .NET are used to build systems that need to be stable, understandable, and maintainable over time. My technical background is broad, but I do have hands-on .NET experience and a strong habit of looking at the full delivery chain around a solution.
Earlier in my career, I contributed to a .NET-based reporting system within public sector operations. Since then, I have strengthened my overall system perspective through integration work, web applications, database-backed solutions, and CI/CD-driven deliveries. That allows me to contribute even when a C\# service is part of a wider technical platform.
I am at my best in environments that value ownership, code quality, and collaboration alongside the language or framework itself. That is the kind of C\# team where I believe I can contribute most effectively.
]

View File

@@ -0,0 +1,7 @@
#let body = [
I am looking for embedded and system-near roles where software needs to be dependable, understandable, and closely aligned with the platform it runs on. My background in C, C++, Linux, and Raspberry Pi-related work has given me a strong interest in engineering problems where hardware awareness and software quality meet.
Across both studies and professional work, I have used Git, Bash, Linux, and Python extensively, and I am comfortable understanding how systems behave below the surface. That makes me well suited to environments where implementation details, operational behavior, and technical constraints all need to be considered together.
I bring a structured way of working, clear communication in teams, and a genuine drive to keep growing in low-level and system-oriented development. That is why embedded roles are a natural fit for my next step.
]

View File

@@ -0,0 +1,7 @@
#let body = [
I am looking for roles where Go is used to build clear, robust, and operations-friendly services. While Go has not been the main language in my longer assignments, my background aligns well with that kind of work: strong Linux experience, system understanding, backend-oriented problem solving, and a preference for straightforward solutions.
In previous assignments, I have worked with APIs, server-related tooling, CI/CD, and integration-heavy flows, often in environments where delivery reliability and clarity were more important than unnecessary complexity. I believe that mindset fits well in Go-based teams focused on readability, performance, and stable production behavior.
I see Go roles as an interesting next step where I can combine my current systems profile with continued growth in a language and ecosystem that match how I already like to build software.
]

View File

@@ -0,0 +1,7 @@
#let body = [
I am looking for Java roles where I can contribute to backend development, integrations, and long-term system quality. My background in full-stack and integration-heavy projects means I am used to understanding both the business need and the technical trade-offs required to deliver stable systems.
I have worked with Java in both academic and project settings, including a drawing management solution built with Spring Boot, unit testing, and integration tests. I have also contributed to larger integration flows where Java worked alongside technologies such as Node.js, TypeScript, and AWS.
What attracts me to Java roles is the opportunity to build clear, maintainable systems together with other engineers. I do my best work in environments where structure, code quality, and collaboration are treated as part of the product, not as afterthoughts.
]

View File

@@ -0,0 +1,7 @@
#let body = [
I am looking for roles where I can combine web development, integration work, and end-to-end delivery ownership. With experience from both larger teams and independent deliveries, I am comfortable contributing across backend, frontend, and cloud-connected solutions without losing sight of the overall product.
In recent assignments, I have worked with Fortnox integrations, Google Wallet and Apple Wallet exports, and solutions built on top of AWS services, Node.js, TypeScript, and Python. I have also delivered internal web and API solutions with full CI/CD workflows, which has shaped a way of working where code quality, testing, and delivery are tightly connected.
What motivates me is solving real problems with clear technical solutions while continuing to grow as an engineer. I work well in collaborative teams, but I am equally comfortable taking ownership when a solution needs to be driven independently.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Jag söker roller där C++ används för att bygga prestandakritisk eller systemnära mjukvara med tydliga kvalitetskrav. Min bakgrund inom algoritmer, C/C++, Linux och embedded-orienterade projekt gör att jag trivs bäst när jag får arbeta nära tekniken och förstå varför lösningen fungerar som den gör.
Genom studier, egna projekt och professionella uppdrag har jag vant mig vid att arbeta med verktyg och miljöer som kräver noggrannhet, struktur och tekniskt djup. Jag uppskattar särskilt arbete där testbarhet, resursmedvetenhet och långsiktig kodkvalitet är viktiga delar av resultatet.
Jag vill fortsätta utvecklas i sammanhang där C++ används för verkliga tekniska problem och där ett analytiskt arbetssätt värderas högt. Där tror jag att min profil kan komma till sin rätt.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Jag söker roller där C\# och .NET används för att bygga system som behöver vara stabila, begripliga och lätta att vidareutveckla. Min tekniska profil är bred, men jag har erfarenhet av .NET-baserad utveckling och av att arbeta med hela flödet runt en lösning, från implementation till leverans.
Tidigare har jag arbetat med vidareutveckling av ett .NET-baserat rapporteringssystem inom offentlig verksamhet. Sedan dess har jag byggt vidare min systemförståelse genom integrationsprojekt, webbapplikationer, databaskopplingar och CI/CD-flöden, vilket gör att jag kan bidra även när en C\#-lösning är en del av ett större tekniskt sammanhang.
Jag trivs bäst i roller där teknikvalet är viktigt men där det också finns ett tydligt fokus ansvarstagande, kodkvalitet och samarbete. Det är i den typen av miljö jag tror att jag kan bidra mest även i C\#-orienterade team.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Jag söker roller inom embedded systems där jag får kombinera systemnära utveckling med praktiskt problemlösningsarbete. Min bakgrund inom C, C++, Linux och Raspberry Pi-projekt har gett mig ett naturligt intresse för lösningar där mjukvara behöver vara robust, begriplig och nära den tekniska plattform den kör på.
Under både studier och professionella uppdrag har jag arbetat med tekniker som Git, Bash, Linux och Python, och jag har vana av att snabbt sätta mig in i hur olika system faktiskt fungerar under ytan. Det gör att jag trivs bra i miljöer där man behöver förstå både implementationen och samspelet mellan olika komponenter.
Jag bidrar med ett lugnt och strukturerat arbetssätt, god kommunikation i team och en stark vilja att fortsätta utvecklas inom systemnära utveckling. Därför ser jag embedded-roller som ett naturligt nästa steg för min tekniska profil.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Jag söker roller där Go används för att bygga tydliga, robusta och driftvänliga tjänster. Även om Go inte har varit mitt huvudspår i längre uppdrag har jag en bakgrund som passar väl för den typen av utveckling: Linuxvana, systemförståelse, backendnära problemlösning och ett starkt fokus enkelhet i lösningar.
I mina tidigare uppdrag har jag arbetat med API:er, serverhantering, CI/CD och integrationsflöden, ofta i miljöer där leveranssäkerhet och tydlighet varit viktigare än onödig komplexitet. Det arbetssättet tror jag passar väl för Go-baserade miljöer där läsbarhet, prestanda och stabil drift står i centrum.
Jag ser därför Go-roller som ett intressant steg där jag kan kombinera min befintliga systemprofil med fortsatt teknisk utveckling i ett språk och ekosystem som ligger nära hur jag redan tycker om att bygga mjukvara.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Jag söker Java-roller där jag får arbeta med backendutveckling, integrationsflöden och hållbara systemlösningar över tid. Min erfarenhet från fullstack- och integrationsprojekt gör att jag är van vid att förstå både verksamhetsbehovet och de tekniska kompromisser som krävs för att leverera stabila lösningar.
Jag har arbetat med Java i både utbildnings- och projektform, bland annat i ett marint ritningshanteringssystem byggt med Spring Boot, unit testing och integration tests. Jag har också erfarenhet av större integrationsflöden och leveranser där Java har kombinerats med andra språk och plattformar som Node.js, TypeScript och AWS.
Det som lockar mig i Java-roller är möjligheten att bygga tydliga och långsiktigt hållbara system tillsammans med andra utvecklare. Jag trivs när kodkvalitet, struktur och samarbete får ta plats i samma leverans.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Jag söker roller där jag får kombinera webbutveckling, integrationer och leveransansvar i hela kedjan från implementation till drift. Med erfarenhet av både större team och självständiga leveranser kan jag in i uppgifter som spänner över backend, frontend och molnintegrationer utan att tappa fokus helheten.
I mina senaste uppdrag har jag arbetat med systemintegrationer mot Fortnox, Google Wallet och Apple Wallet samt byggt lösningar ovanpå AWS-tjänster, Node.js, TypeScript och Python. Jag har även utvecklat interna webb- och API-lösningar med CI/CD-flöden, vilket har gett mig ett arbetssätt där kodkvalitet, testning och leveransförmåga hänger ihop från första commit till färdig release.
Det som driver mig är att lösa verkliga problem med tydliga lösningar och att fortsätta utvecklas tekniskt. Jag trivs i samarbeten där kommunikation och ansvarstagande värderas högt, men fungerar lika bra när en lösning behöver drivas självständigt. Därför passar roller inom webbutveckling och modern produktutveckling mig väl.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn has a strong profile for C++-adjacent work thanks to both academic training and practical system-level projects. Among the languages in his toolkit, C++ is one of the areas where he has the longest experience, supported by solid knowledge of C, Linux, and how reliable software is built close to the platform.
During his studies, he worked with algorithms, C, and low-level system understanding. Across personal and professional projects, he has used tools such as Bash, Assembler, Git, and Linux on a daily basis. Work around Raspberry Pi, home automation, and a broader embedded interest creates a natural bridge between C++ and more hardware-aware engineering roles.
For C++ positions, Björn brings analytical thinking, strong problem-solving skills, and a willingness to understand the full chain from implementation and testing to the environment where the software will be deployed and maintained.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn has a broad background in system development where C\# and .NET are part of a wider toolkit for web and backend delivery. He is used to working across system boundaries and combining application development with integrations, databases, and operational thinking.
Earlier in his career, he contributed to further development of Simrishamn Municipality's .NET-based reporting system for home care. That experience is complemented by later work in API development, web interfaces, CI/CD pipelines, cloud services, and database-backed systems. Together, this makes him a good fit for C\# roles that sit within a larger product or platform context.
He works in a structured way, learns existing codebases quickly, and values maintainable software with clear ownership. That combination is especially useful in C\# environments where long-term stability and reliable delivery matter.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn is a passionate developer with just over 3 years of experience in full-stack software development, working both independently and as part of larger teams. Alongside web and cloud-oriented systems, he has also worked with embedded and system-near development where robustness, hardware awareness, and Linux experience matter.
During his studies at Blekinge Institute of Technology, he worked with C and algorithm implementation, and across both academic and professional assignments he has used Git daily for more than five years. He has also built solutions around Raspberry Pi and home automation with a strong embedded focus. At CGI, he complemented that background by developing Python-based systems that interacted with external APIs and real-world operational data.
He brings an engineering mindset that combines technical depth with clear communication and initiative. That makes him a strong fit for embedded roles where software quality, system understanding, and practical collaboration are equally important.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn's main strength lies in system development, Linux environments, and backend-oriented problem solving. While Go has not been his primary language in longer assignments, he does bring practical exposure alongside Bash, Python, Java, JavaScript, and cloud-focused integration work.
What aligns well with Go-oriented roles is his experience working close to services, infrastructure, and operational requirements. He has built server-related tooling, API-driven systems, and CI/CD-based deliveries, all of which support the kind of engineering discipline often expected in Go backends and platform services.
He therefore brings a strong systems mindset, the ability to ramp up quickly in new stacks, and a clear preference for building software that is understandable, testable, and dependable in production.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn has built his profile around full-stack development, but with a clear and practical focus on Java-based system development. He has worked on end-to-end solutions, API integrations, and cloud-connected systems in both team-based and independent deliveries.
In the student project carried out with BTH and CGI, he helped develop a drawing management solution for the navy using Java, Spring Boot, unit testing, and integration tests. At Nortic, he also worked close to Java-based ticketing and integration flows while combining Java with Node.js, TypeScript, and AWS services in production-oriented systems.
For Java roles, Björn contributes backend focus, familiarity with agile workflows, and a broad system perspective shaped by Linux, CI/CD, and integration-heavy projects. He is comfortable moving between implementation detail and the larger architectural context.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn is a passionate developer with just over 3 years of experience in full-stack software development, both in larger teams and as an individual contributor. He has worked and studied in systems related to web development and cloud services. Earlier in his career, he implemented end-to-end solutions with APIs and database integrations, including further development of Simrishamn Municipality's .NET-based home care system. During his time at SIGMA, he also worked with Azure services while developing a transportation platform.
At Nortic, Björn focused on proprietary integrations for transaction exports to Fortnox, using AWS services such as Lambda and MQTT-based queue flows. Python played a central role in those projects, while Node.js and TypeScript were used in related wallet export integrations for Google Wallet and Apple Wallet.
Björn combines strong problem-solving skills with a broad technical toolkit that includes JavaScript, Vue, HTML, CSS, Bootstrap, React.js, MongoDB, Google Cloud, and Git. That makes him adaptable and well suited for modern web development roles spanning multiple stacks.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn har en särskilt stark profil inom C++-nära utveckling tack vare både studier och praktiska projekt inom systemnära mjukvara. Av språken i hans verktygslåda är C++ ett av de områden där han har längst erfarenhet, kombinerat med god förståelse för C, Linux och hur robust mjukvara byggs nära den tekniska plattformen.
Under utbildningen arbetade han med algoritmer, C och systemförståelse, och i egna samt professionella sammanhang har han använt systemnära verktyg som Bash, Assembler, Git och Linux dagligen. Projekt kring Raspberry Pi, hemautomatisering och bredare embedded-intresse ger en naturlig koppling mellan C++ och mer hårdvarunära utvecklingsuppgifter.
För roller inom C++ bidrar Björn med ett analytiskt arbetssätt, stark problemlösningsförmåga och en vilja att förstå hela kedjan från implementation och testning till den miljö där lösningen ska användas och underhållas.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn har en bred bakgrund inom systemutveckling där C\# och .NET ingår som en del av en större verktygslåda för webb- och backendutveckling. Han är van vid att arbeta över systemgränser och kombinera klassisk applikationsutveckling med integrationer, databaser och driftorienterade leveransflöden.
Tidigt i sin yrkesbana vidareutvecklade han Simrishamns kommuns .NET-baserade rapporteringssystem för hemtjänsten. Den erfarenheten kompletteras av senare uppdrag inom API-utveckling, webbgränssnitt, CI/CD, molntjänster och databasintegrationer. Tillsammans ger det en profil som passar roller där C\# används som en del av en större produkt- eller plattformsleverans.
Han arbetar strukturerat, lär sig snabbt nya kodbaser och trivs i sammanhang där teknisk kvalitet kombineras med tydligt ansvarstagande. Därför passar han väl i C\#-roller med fokus systemförståelse, underhållbar kod och stabil leverans.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn är en passionerad utvecklare med lite över 3 års erfarenhet av fullstack-mjukvaruutveckling i både större team och som enskild utvecklare. Han har arbetat och studerat inom många olika system, inklusive inbäddade system och molnorienterade lösningar.
Under sina studier vid Blekinge Tekniska Högskola arbetade han bland annat med programmeringsspråket C och med att implementera nya algoritmer. Både i studier och i professionella uppdrag under mer än fem år har han använt Git dagligen. Han har även arbetat med C i projekt kring Raspberry Pi och hemautomatisering med starkt fokus embedded systems. Under tiden CGI byggde han dessutom ett system för att presentera transporttider med hjälp av Python.
Han kombinerar systemnära tänkande med god kommunikation och en vilja att ta initiativ när problem behöver lösas. Det gör honom väl lämpad för roller där hårdvarunära utveckling, Linuxmiljöer och robust mjukvara möts.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn har sin tyngdpunkt i systemutveckling, Linuxmiljöer och backendnära problemlösning. Även om Go inte har varit hans huvudsakliga språk i längre uppdrag, finns det praktisk erfarenhet i verktygslådan tillsammans med Bash, Python, Java, JavaScript och molnorienterade integrationslösningar.
Det som särskilt passar Go-relaterade roller är hans vana att arbeta nära systemgränser, skriva tydliga och funktionella lösningar samt förstå hur tjänster ska byggas för att fungera stabilt i drift. Hans erfarenhet från serverhantering, CI/CD, API-integrationer och Linux ger en bra grund för att arbeta med Go i backend- och plattformsnära miljöer.
Han bidrar därför främst med ett starkt systemperspektiv, förmåga att snabbt sätta sig in i nya tekniker och en vilja att bygga lösningar som är enkla att förstå, testa och vidareutveckla över tid.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn har byggt sin profil inom fullstackutveckling men har samtidigt ett tydligt fokus Java-baserad systemutveckling. Han har arbetat med end-to-end-lösningar, API-integrationer och molntjänster, och har erfarenhet av både teamleveranser och självständiga uppdrag där arkitektur, implementation och leverans hänger nära samman.
I studentprojektet tillsammans med BTH och CGI utvecklade han en ritningshantering för marinen med Java, Spring Boot, unit testing och integration tests som centrala delar. Under tiden Nortic arbetade han dessutom nära Java-baserade biljett- och integrationsflöden, samtidigt som han kombinerade Java med Node.js, TypeScript och AWS-tjänster i produktionsnära system.
För Java-roller bidrar Björn med en kombination av backendfokus, vana vid agila arbetsflöden och ett brett systemperspektiv från Linux, CI/CD och integrationer. Han kan därför in i uppgifter som kräver både kodkvalitet och förmåga att förstå den större tekniska helheten.
]

View File

@@ -0,0 +1,7 @@
#let body = [
Björn är en passionerad utvecklare med drygt 3 års erfarenhet av fullstack mjukvaruutveckling, både i större team och som enskild utvecklare. Han har arbetat och studerat inom olika system relaterade till webbutveckling och molntjänster. Tidigare har han implementerat flera end-to-end-lösningar med API- och databasanslutningar, inklusive vidareutveckling av Simrishamns kommuns .NET-baserade hemtjänstsystem. Under sin tid SIGMA arbetade han också med Azure och dess tjänster för att utveckla ett transportsystem.
Under sin anställning Nortic fokuserade Björn att integrera egna system för transaktionsexport till Fortnox, genom att utnyttja olika AWS-tjänster, inklusive Lambda-funktioner och MQTT-kösystem. Python spelade en central roll i dessa projekt. Dessutom bidrog han till integrationen av Google och Apple Wallets för biljettexporter, med användning av AWS-tjänster tillsammans med Node.js och TypeScript.
Björn har starka problemlösningsförmågor och strävar kontinuerligt efter att lära sig nya tekniker och verktyg. Hans bakgrund inom mjukvaruutveckling inkluderar även teknologier och verktyg som JavaScript, Vue, HTML, CSS, Bootstrap, React.js, MongoDB, Google Cloud och Git, vilket gör honom anpassningsbar och kapabel att arbeta med de flesta tekniska miljöer.
]

187
src/data/en.yaml Normal file
View File

@@ -0,0 +1,187 @@
meta:
language: en
language_name: English
page_title: "CV"
job_title_prefix: "Role:"
subtitle: "Software developer with a broad technical profile"
sections:
profile: "Profile"
cover_letter: "Cover Letter"
experience: "Work History"
education: "Education History"
skills: "Skills Table"
qualifications: "Qualifications"
tools: "Tools and Software"
languages: "Languages"
specializations: "Technical Specializations"
labels:
skill: "Skill"
years: "Years"
level: "Proficiency"
skills_note: "Proficiency level: 1 = Basic, 2 = Intermediate, 3 = Advanced, 4 = Expert"
sidebar:
qualifications:
- "Networking"
- "Problem-solving"
- "Software design"
- "Agile workflows"
- "Server maintenance"
- "Linux / Bash"
- "Assembler AT&T / GNU"
- "C / C++ / C# / Objective-C"
- "Java / JavaScript / .NET"
- "Python / Go"
- "HTML / CSS / PHP / SQL"
- "Spring Boot / Gradle"
- "Unit testing"
- "Integration testing"
- "Windows Subsystem for Linux"
tools:
- "Jira"
- "Git"
- "Visual Studio"
- "Android Studio"
- "IntelliJ"
- "Eclipse"
spoken_languages:
- "Swedish"
- "English"
specializations:
- "Frontend development"
- "Backend development"
- "Linux and DevOps"
- "CI/CD"
education:
- title: "Software Engineering"
degree: "Bachelor's degree"
institution: "Blekinge Institute of Technology"
period: "2017 - ongoing"
- title: "Technical Preparatory Year"
degree: "Bachelor's degree"
institution: "Blekinge Institute of Technology"
period: "2015 - 2016"
- title: "Java Development"
degree: "Vocational training, 1 year"
institution: "Malmö"
period: "2014 - 2015"
- title: "Linux System Specialist"
degree: "Vocational training, 2 years"
institution: "Helsingborg"
period: "2012 - 2014"
details: "Linux system structure, virtualization and clustering of services, user management in Linux environments, and web server management and maintenance."
experience:
- company: "Nortic"
title: "Fortnox importers"
period: "2023/09 to 2024/04"
summary:
- "Björn worked on integrating Nortic's internal systems to export transactions to the Fortnox platform."
- "The solution used AWS services, including Lambda functions and MQTT-based queue flows, to optimize and parallelize the workflow."
- "He also contributed to Google Wallet and Apple Wallet ticket exports so users could present tickets directly on their devices."
tech: "Java, Node.js, TypeScript, JavaScript, Python, HTML, CSS, Git, Bash, Linux, and serverless AWS"
- company: "CGI"
title: "Server Manager Client"
period: "2023/08 to 2023/09"
summary:
- "Björn was the sole developer for a project that handled server functionality ranging from service monitoring to file retrieval interfaces."
- "The user interface relied on scalable vector graphics for usability and visual clarity."
- "Development followed the full CI/CD process from implementation through delivery."
tech: "Node.js, TypeScript, JavaScript, Vue 3, HTML, CSS, Git, Bash, Linux, and SVG"
- company: "CGI"
title: "Blekingetrafiken Bus App"
period: "2023/08 to 2023/08"
summary:
- "Björn handled the entire process from CI/CD and implementation to testing and release."
- "The application used Blekingetrafiken's API to improve commute planning to and from the CGI office."
tech: "Python 3, Git, Bash, Linux, Docker, and Jenkins"
- company: "CGI"
title: "Flexmeister"
period: "2023/06 to 2023/08"
summary:
- "Björn contributed to a web client and REST API for more efficient flex-time logging and management."
- "The server side was designed to support future client types without redesigning the core architecture."
- "The project followed a complete CI/CD workflow."
tech: "Python 3, Git, Bash, Linux, Docker, and Jenkins"
- company: "CGI"
title: "Student Project with BTH, Software Developer"
period: "2020/02 to 2020/06"
summary:
- "Together with his team, Björn built a drawing management system for the navy."
- "The project used agile workflows and Jira, with implementation in Java, Spring Boot, unit testing, and integration tests."
tech: "Java, JavaScript, Spring Boot, Visual Studio Code, Gradle, Git, Jira, unit testing, and integration tests"
- company: "SIGMA"
title: "Web and Software Development"
period: "2019/02 to 2019/07"
summary:
- "Björn worked with his team on a transportation system for Karlskrona municipality that is used for transport booking."
- "He contributed as a full-stack developer with an emphasis on testing and front-end development."
tech: "JavaScript, Dart, Node.js, Gradle, MariaDB, Azure, Google Cloud, Git, React.js, Maven, and Docker"
- company: "Sjobeck Prime"
title: "Server Manager and Software Developer"
period: "2014/01 to 2014/08"
summary:
- "Björn set up Linux-based development servers and created iPhone prototypes."
- "He was also responsible for internal servers and services."
tech: "Java, Bash, Objective-C, MySQL, XCode, Linux, Git, and Jira"
- company: "Simrishamn Municipality"
title: "IT Department"
period: "2011/03 to 2011/09"
summary:
- "Björn developed the municipality's reporting system for home care, primarily in .NET."
tech: "MySQL, .NET, JavaScript, Visual Studio, and Git"
- company: "Crunch Fish"
title: "APU and Android App Development"
period: "2009/01 to 2010/01"
summary:
- "Björn worked on a music-focused Android application and contributed to prototypes for future projects."
tech: "Java, XML, HTML, and Android Studio"
skill_groups:
- title: "Technical knowledge"
items:
- { name: "C++", years: 6, level: 3 }
- { name: "C", years: 2, level: 2 }
- { name: "C#", years: 2, level: 2 }
- { name: "Objective-C", years: 1, level: 1 }
- { name: "Linux", years: 8, level: 4 }
- { name: "Bash", years: 8, level: 4 }
- { name: "Unit Testing", years: 3, level: 3 }
- { name: "Integration Testing", years: 2, level: 2 }
- { name: "Load Testing", years: 2, level: 2 }
- { name: "Assembler AT&T", years: 3, level: 3 }
- { name: "Azure", years: 1, level: 1 }
- { name: "Spring Boot", years: 1, level: 2 }
- { name: "Java", years: 2, level: 3 }
- { name: "JavaScript", years: 3, level: 3 }
- { name: ".NET", years: 1, level: 1 }
- { name: "Python", years: 1, level: 2 }
- { name: "Go", years: 1, level: 1 }
- { name: "HTML", years: 8, level: 3 }
- { name: "CSS", years: 8, level: 2 }
- { name: "PHP", years: 1, level: 1 }
- { name: "SQL", years: 3, level: 2 }
- { name: "Docker", years: 1, level: 2 }
- { name: "Chat-GPT", years: 1, level: 2 }
- { name: "MongoDB", years: 1, level: 2 }
- { name: "PostgreSQL", years: 1, level: 2 }
- { name: "Bootstrap", years: 1, level: 2 }
- { name: "Jenkins", years: 1, level: 1 }
- { name: "Maven", years: 1, level: 1 }
- { name: "Gradle", years: 1, level: 1 }
- { name: "Windows Subsystem for Linux", years: 3, level: 3 }
- title: "Application knowledge"
items:
- { name: "Eclipse", years: 1, level: 2 }
- { name: "Visual Studio", years: 10, level: 3 }
- { name: "Android Studio", years: 1, level: 2 }
- { name: "IntelliJ", years: 3, level: 3 }
- { name: "Git", years: 5, level: 3 }
- title: "IT disciplines"
items:
- { name: "System development", years: 3, level: 3 }
- { name: "Software development", years: 6, level: 3 }
- { name: "Embedded software development", years: 1, level: 3 }
- { name: "CI/CD processes", years: 3, level: 3 }
- { name: "Agile ITIL workflows", years: 3, level: 3 }
- title: "Languages"
items:
- { name: "Swedish", years: 30, level: 4 }
- { name: "English", years: 25, level: 4 }

187
src/data/sv.yaml Normal file
View File

@@ -0,0 +1,187 @@
meta:
language: sv
language_name: Svenska
page_title: CV
job_title_prefix: "Roll:"
subtitle: "Mjukvaruutvecklare med bred teknisk profil"
sections:
profile: "Profil"
cover_letter: "Personligt brev"
experience: "Arbetshistorik"
education: "Utbildningshistorik"
skills: "Kunskapstabell"
qualifications: "Kvalifikationer"
tools: "Verktyg och programvara"
languages: "Språk"
specializations: "Tekniska specialiseringar"
labels:
skill: "Kompetens"
years: "År"
level: "Färdighetsnivå"
skills_note: "Skicklighetsgrad: 1 = Grundläggande, 2 = Medel, 3 = Avancerad, 4 = Expert"
sidebar:
qualifications:
- "Networking"
- "Problemlösning"
- "Software design"
- "Agila arbetsflöden"
- "Serverunderhåll"
- "Linux / Bash"
- "Assembler AT&T / GNU"
- "C / C++ / C# / Objective-C"
- "Java / JavaScript / .NET"
- "Python / Go"
- "HTML / CSS / PHP / SQL"
- "Spring Boot / Gradle"
- "Unit testing"
- "Integration testing"
- "Windows Subsystem for Linux"
tools:
- "Jira"
- "Git"
- "Visual Studio"
- "Android Studio"
- "IntelliJ"
- "Eclipse"
spoken_languages:
- "Svenska"
- "Engelska"
specializations:
- "Frontend development"
- "Backend development"
- "Linux och DevOps"
- "CI/CD"
education:
- title: "Software Engineering"
degree: "Kandidatexamen"
institution: "Blekinge Tekniska Högskola"
period: "2017 - pågående"
- title: "Tekniskt förberedande år"
degree: "Kandidatexamen"
institution: "Blekinge Tekniska Högskola"
period: "2015 - 2016"
- title: "Javautveckling"
degree: "Yrkeshögskoleutbildning, 1 år"
institution: "Malmö"
period: "2014 - 2015"
- title: "Linux System Specialist"
degree: "Yrkeshögskoleutbildning, 2 år"
institution: "Helsingborg"
period: "2012 - 2014"
details: "Linux-system och dess struktur, virtualisering och klustring av system och tjänster, användarhantering i en Linux-miljö samt hantering och underhåll av webbserverstjänster."
experience:
- company: "Nortic"
title: "Fortnox-importer"
period: "2023/09 till 2024/04"
summary:
- "Björn ansvarade för att integrera Nortics interna system för att exportera transaktioner till Fortnox-plattformen."
- "Under perioden implementerades AWS-tjänster, inklusive Lambda-funktioner och MQTT-baserade köflöden, för att optimera och parallellisera arbetsflödet."
- "Han arbetade också med Google och Apple Wallets för att göra biljettexporter tillgängliga direkt i användarnas mobiler."
tech: "Java, Node.js, TypeScript, JavaScript, Python, HTML, CSS, Git, Bash, Linux och serverless AWS"
- company: "CGI"
title: "Serverhanterare klient"
period: "2023/08 till 2023/09"
summary:
- "Björn var ensam utvecklare för ett projekt som hanterade serverfunktioner från tjänsteövervakning till gränssnitt för filhämtning."
- "Gränssnittet byggdes med skalbar vektorgrafik för bättre användbarhet och estetik."
- "Utvecklingen genomfördes enligt samtliga steg i en CI/CD-process."
tech: "Node.js, TypeScript, JavaScript, Vue 3, HTML, CSS, Git, Bash, Linux och SVG"
- company: "CGI"
title: "Blekingetrafiken bussapp"
period: "2023/08 till 2023/08"
summary:
- "Björn tog ansvar för hela flödet från CI/CD och implementation till testning och publicering."
- "Lösningen använde Blekingetrafikens API för att effektivisera resplanering till och från CGI-kontoret."
tech: "Python 3, Git, Bash, Linux, Docker och Jenkins"
- company: "CGI"
title: "Flexmeister"
period: "2023/06 till 2023/08"
summary:
- "Björn var med och byggde en webbklient och ett REST API för att effektivare logga och hantera flex-tid."
- "Serverdelen designades för att kunna utökas med fler typer av klienter vid behov."
- "Även detta projekt följde en full CI/CD-process."
tech: "Python 3, Git, Bash, Linux, Docker och Jenkins"
- company: "CGI"
title: "Studentprojekt med BTH, mjukvaruutvecklare"
period: "2020/02 till 2020/06"
summary:
- "Tillsammans med sitt team utvecklade Björn en ritningshantering för marinen."
- "Projektet drevs med agila arbetssätt och Jira, med fokus på Java, Spring Boot, unit testing och integration tests."
tech: "Java, JavaScript, Spring Boot, Visual Studio Code, Gradle, Git, Jira, unit testing och integration tests"
- company: "SIGMA"
title: "Webb- och mjukvaruutveckling"
period: "2019/02 till 2019/07"
summary:
- "Björn utvecklade tillsammans med sitt team ett transportsystem för Karlskrona kommun som används för transportbokningar."
- "Han arbetade som fullstackutvecklare med särskilt fokus på testning och frontend-utveckling."
tech: "JavaScript, Dart, Node.js, Gradle, MariaDB, Azure, Google Cloud, Git, React.js, Maven och Docker"
- company: "Sjobeck Prime"
title: "Serveransvarig och mjukvaruutvecklare"
period: "2014/01 till 2014/08"
summary:
- "Björn satte upp Linux-baserade utvecklingsservrar och utvecklade prototyper för iPhone."
- "Han ansvarade också för interna servrar och tjänster."
tech: "Java, Bash, Objective-C, MySQL, XCode, Linux, Git och Jira"
- company: "Simrishamns kommun"
title: "IT-avdelningen"
period: "2011/03 till 2011/09"
summary:
- "Björn utvecklade kommunens rapporteringssystem för hemtjänsten, huvudsakligen i .NET."
tech: "MySQL, .NET, JavaScript, Visual Studio och Git"
- company: "Crunch Fish"
title: "APU och Androidapputveckling"
period: "2009/01 till 2010/01"
summary:
- "Björn arbetade med en musikfokuserad Androidapp och deltog även i prototyper för framtida projekt."
tech: "Java, XML, HTML och Android Studio"
skill_groups:
- title: "Teknisk kunskap"
items:
- { name: "C++", years: 6, level: 3 }
- { name: "C", years: 2, level: 2 }
- { name: "C#", years: 2, level: 2 }
- { name: "Objective-C", years: 1, level: 1 }
- { name: "Linux", years: 8, level: 4 }
- { name: "Bash", years: 8, level: 4 }
- { name: "Unit Testing", years: 3, level: 3 }
- { name: "Integration Testing", years: 2, level: 2 }
- { name: "Load Testing", years: 2, level: 2 }
- { name: "Assembler AT&T", years: 3, level: 3 }
- { name: "Azure", years: 1, level: 1 }
- { name: "Spring Boot", years: 1, level: 2 }
- { name: "Java", years: 2, level: 3 }
- { name: "JavaScript", years: 3, level: 3 }
- { name: ".NET", years: 1, level: 1 }
- { name: "Python", years: 1, level: 2 }
- { name: "Go", years: 1, level: 1 }
- { name: "HTML", years: 8, level: 3 }
- { name: "CSS", years: 8, level: 2 }
- { name: "PHP", years: 1, level: 1 }
- { name: "SQL", years: 3, level: 2 }
- { name: "Docker", years: 1, level: 2 }
- { name: "Chat-GPT", years: 1, level: 2 }
- { name: "MongoDB", years: 1, level: 2 }
- { name: "PostgreSQL", years: 1, level: 2 }
- { name: "Bootstrap", years: 1, level: 2 }
- { name: "Jenkins", years: 1, level: 1 }
- { name: "Maven", years: 1, level: 1 }
- { name: "Gradle", years: 1, level: 1 }
- { name: "Windows Subsystem for Linux", years: 3, level: 3 }
- title: "Applikationskunskap"
items:
- { name: "Eclipse", years: 1, level: 2 }
- { name: "Visual Studio", years: 10, level: 3 }
- { name: "Android Studio", years: 1, level: 2 }
- { name: "IntelliJ", years: 3, level: 3 }
- { name: "Git", years: 5, level: 3 }
- title: "IT-discipliner"
items:
- { name: "Systemutveckling", years: 3, level: 3 }
- { name: "Mjukvaruutveckling", years: 6, level: 3 }
- { name: "Embedded software development", years: 1, level: 3 }
- { name: "CI/CD-processer", years: 3, level: 3 }
- { name: "Agila ITIL-arbetsflöden", years: 3, level: 3 }
- title: "Språk"
items:
- { name: "Svenska", years: 30, level: 4 }
- { name: "Engelska", years: 25, level: 4 }

222
src/lib/template.typ Normal file
View File

@@ -0,0 +1,222 @@
#let palette = (
primary: rgb("#646EDB"),
secondary: rgb("#64AADB"),
accent: rgb("#DB9564"),
accent-soft: rgb("#F3E5DA"),
text: rgb("#222222"),
text-muted: rgb("#666666"),
line: rgb("#D8DDE8"),
)
#let role-titles = (
web: (sv: "Webbutvecklare", en: "Web Developer"),
embedded: (sv: "Utvecklare inom embedded systems", en: "Embedded Systems Developer"),
java: (sv: "Javautvecklare", en: "Java Developer"),
csharp: (sv: "C#-utvecklare", en: "C# Developer"),
go: (sv: "Go-utvecklare", en: "Go Developer"),
cpp: (sv: "C++-utvecklare", en: "C++ Developer"),
)
#let role-title(role, lang) = {
let titles = role-titles.at(role)
titles.at(lang)
}
#let section-title(label) = block(above: 0pt, below: 7pt)[
#text(size: 13pt, weight: "bold", fill: palette.primary)[#label]
]
#let small-heading(label) = text(size: 10pt, weight: "bold", fill: palette.primary)[#label]
#let skill-badge(level) = {
let fills = (
rgb("#F5F3F0"),
rgb("#F0E3D8"),
rgb("#E7D1BF"),
palette.accent,
)
box(
inset: (x: 6pt, y: 2.5pt),
radius: 8pt,
fill: fills.at(calc.max(level, 1) - 1),
)[
#text(size: 8.5pt, fill: if level == 4 { white } else { palette.text })[Nivå #level]
]
}
#let cover-page(lang-data, role, letter-body) = {
grid(
columns: (1.5fr, 0.8fr),
column-gutter: 12mm,
align: (left, top),
[
#text(size: 24pt, weight: "bold", fill: palette.primary)[Björn Blomberg]
#v(3pt)
#text(size: 14pt, weight: "semibold", fill: palette.accent)[#role-title(role, lang-data.meta.language)]
#v(6pt)
#text(fill: palette.text-muted)[#lang-data.meta.subtitle]
#v(10pt)
#line(length: 100%, stroke: (paint: palette.accent, thickness: 1pt))
#v(16pt)
#section-title(lang-data.sections.cover_letter)
#set par(justify: true, leading: 0.68em)
#letter-body
],
[
#align(center)[
#box(stroke: (paint: palette.line, thickness: 1pt), inset: 6pt, radius: 12pt)[
#image("../../assets/profile/me.png", width: 100%)
]
]
],
)
}
#let sidebar(lang-data) = [
#box(fill: luma(248), inset: 12pt, radius: 14pt, width: 100%)[
#small-heading(lang-data.sections.qualifications)
#v(6pt)
#for item in lang-data.sidebar.qualifications [
#item\
]
#v(8pt)
#small-heading(lang-data.sections.tools)
#v(6pt)
#for item in lang-data.sidebar.tools [
#item\
]
#v(8pt)
#small-heading(lang-data.sections.languages)
#v(6pt)
#for item in lang-data.sidebar.spoken_languages [
#item\
]
#v(8pt)
#small-heading(lang-data.sections.specializations)
#v(6pt)
#for item in lang-data.sidebar.specializations [
#item\
]
]
]
#let experience-item(item) = [
#text(weight: "bold", fill: palette.accent)[#item.company, #item.title]
#h(8pt)
#text(size: 9pt, fill: palette.text-muted)[#item.period]
#v(4pt)
#for paragraph in item.summary [
#paragraph
]
#text(style: "italic", fill: palette.text-muted)[Tekniker: #item.tech]
]
#let education-item(item) = [
#text(weight: "bold")[#item.title]
#h(6pt)
#text(fill: palette.text-muted)[#item.degree, #item.institution]
#h(6pt)
#text(size: 9pt, fill: palette.text-muted)[#item.period]
#if item.at("details", default: none) != none [
#v(3pt)
#item.details
]
]
#let skill-group-table(lang-data, group) = {
table(
columns: (2.6fr, 0.7fr, 0.9fr),
stroke: palette.line,
inset: 7pt,
align: (left, center, center),
fill: (x, y) => if y == 0 { palette.primary } else if y == 1 { palette.secondary } else { none },
[#text(weight: "bold", fill: white)[#lang-data.labels.skill]],
[#text(weight: "bold", fill: white)[#lang-data.labels.years]],
[#text(weight: "bold", fill: white)[#lang-data.labels.level]],
table.cell(colspan: 3)[#text(weight: "bold", fill: white)[#group.title]],
..group.items.map(item => (
[#item.name],
[#item.years],
[#skill-badge(item.level)],
)).flatten(),
)
}
#let skill-page(lang-data) = {
pagebreak()
set page(
header: align(left)[
#text(size: 11pt, weight: "semibold", fill: palette.primary)[#lang-data.sections.skills]
],
margin: (x: 16mm, y: 15mm),
)
text(size: 24pt, weight: "bold", fill: palette.primary)[Björn Blomberg]
v(2pt)
text(fill: palette.text-muted)[#lang-data.meta.subtitle]
v(12pt)
section-title(lang-data.sections.skills)
for group in lang-data.skill_groups [
#skill-group-table(lang-data, group)
#v(8pt)
]
text(size: 8.5pt, fill: palette.text-muted)[#lang-data.labels.skills_note]
}
#let cv-page(lang-data, role, profile-body) = {
grid(
columns: (1.55fr, 0.85fr),
column-gutter: 12mm,
align: (left, top),
[
#text(size: 24pt, weight: "bold", fill: palette.primary)[Björn Blomberg]
#v(2pt)
#text(size: 13pt, weight: "semibold", fill: palette.accent)[#role-title(role, lang-data.meta.language)]
#v(6pt)
#text(fill: palette.text-muted)[#lang-data.meta.subtitle]
#v(12pt)
#section-title(lang-data.sections.profile)
#set par(justify: true, leading: 0.68em)
#profile-body
#v(12pt)
#section-title(lang-data.sections.experience)
#for item in lang-data.experience [
#block(breakable: false)[
#experience-item(item)
#v(10pt)
]
]
],
[
#align(center)[
#box(stroke: (paint: palette.line, thickness: 1pt), inset: 6pt, radius: 12pt)[
#image("../../assets/profile/me-s.png", width: 82%)
]
]
#v(10pt)
#sidebar(lang-data)
],
)
v(14pt)
grid(
columns: (1fr,),
[
#section-title(lang-data.sections.education)
#for item in lang-data.education [
#education-item(item)
#v(9pt)
]
],
)
}
#let render-variant(lang-data, role, profile-body, letter-body) = {
set page(margin: (x: 16mm, y: 15mm))
set text(font: "Libertinus Serif", size: 10.3pt, fill: palette.text, lang: lang-data.meta.language)
show heading: set text(fill: palette.primary)
cover-page(lang-data, role, letter-body)
pagebreak()
cv-page(lang-data, role, profile-body)
skill-page(lang-data)
}

24
tools/build-all.ps1 Normal file
View File

@@ -0,0 +1,24 @@
$repoRoot = Split-Path -Parent $PSScriptRoot
$typstPath = (Get-Command typst -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty Source)
if (-not $typstPath) {
$fallback = Get-ChildItem "$env:LOCALAPPDATA\Microsoft\WinGet\Packages\Typst.Typst_*" -Recurse -Filter typst.exe -ErrorAction SilentlyContinue |
Select-Object -First 1 -ExpandProperty FullName
$typstPath = $fallback
}
if (-not $typstPath) {
throw "Typst CLI hittades inte. Installera Typst och kör sedan skriptet igen."
}
$files = Get-ChildItem (Join-Path $repoRoot "publishing") -Recurse -Filter *.typ | Sort-Object FullName
foreach ($file in $files) {
$output = [System.IO.Path]::ChangeExtension($file.FullName, ".pdf")
Write-Host "Compiling $($file.FullName)"
& $typstPath compile --root $repoRoot $file.FullName $output
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}
}

17
tools/build-all.sh Normal file
View File

@@ -0,0 +1,17 @@
#!/usr/bin/env sh
set -eu
REPO_ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
if command -v typst >/dev/null 2>&1; then
TYPST=typst
else
echo "Typst CLI was not found in PATH." >&2
exit 1
fi
find "$REPO_ROOT/publishing" -type f -name '*.typ' | sort | while IFS= read -r file; do
output="${file%.typ}.pdf"
echo "Compiling $file"
"$TYPST" compile --root "$REPO_ROOT" "$file" "$output"
done