diff --git a/favicon.svg b/favicon.svg index 39d4caa..defae87 100644 --- a/favicon.svg +++ b/favicon.svg @@ -1,4 +1,4 @@ - - + + JB diff --git a/index.html b/index.html index 30d3d7f..976f16d 100644 --- a/index.html +++ b/index.html @@ -1,174 +1,308 @@ - + - - - - - - Jakub Bronk | Portfolio - + + + + + + Jakub Bronk | Portfolio + - -
-

Jakub Bronk

-
- Email - GitHub - Somonino, Poland -
-
+ +
+
+

Jakub Bronk

+

+ Computer Science student @ Gdańsk University of Technology +

+
+ +
-
-

- Computer Science student at Gdańsk University of Technology with strong - foundations in algorithms, systems programming, and Linux environments. - Experienced in Go, C/C++, and C# as well as familiar with Java, Python, - Ruby, Rust, and TypeScript, through academic and personal projects, - including self-hosted infrastructure and low-level development. -

+
+

+ Computer Science student at Gdańsk University of Technology with + strong foundations in algorithms, systems programming, and Linux + environments. Experienced in Go, C/C++, and Python, as well as + familiar with Java, Ruby, Rust, and TypeScript - through + academic, personal, and professional projects including + full-stack web development, compiler design, and self-hosted + infrastructure. +

+
+ bronk.jakub@proton.me + git.bronku.xyz + Somonino, Poland +
+
-

AVAILABILITY & COMMITMENT

-

- I am looking for a long-term professional relationship rather than a - short-term placement. My intended availability is as follows: -

- -
+
+

Experience

+
+
+

Software Engineering Intern

+ +
+

+ Contributed to a full-stack web application. Worked with + Ruby on Rails, React, TypeScript, and RTK Query in a team - + delivering features, reviewing code, and participating in + the full development lifecycle. +

+
+ Ruby on Rails + React + TypeScript + RTK Query + PostgreSQL +
+
+
-
-

SELECTED PROJECTS

-
-

B+ Tree Implementation Rust

-

- A disk-friendly B+ tree implementation focusing on memory-efficient - data structures and safety. -

-
+
+

Selected Projects

+
+
+ + piekarnikgosi.pl screenshot + +
+

piekarnikgosi.pl

+

+ A multi-page business website for a local cake shop + and café, built for a real client. Features include + a categorized product catalog, photo gallery with + lightbox, café landing page, and contact information + - all server-rendered with HTMX-powered navigation + for instant page transitions. +

+
+ HTML/CSS + HTMX + Go + JavaScript +
+ +
+
-
-

- Python-to-Ruby Transpiler - Flex / Bison / C++ / Make -

-

- A compiler-front-end project focused on lexer/parser design. This - project allowed me to familiarize myself with lexer and parser design, - engineer a lexing solution for significant indentation in Python, - while effectively modeling real-world objects through class design. - Solved complex build challenges involving circular dependencies. -

-
+
+
+

Cake Order Tracker

+

+ Production-ready order management system for the + same cake shop. Single-binary Go application with + SQLite persistence, and a dynamic HTMX frontend. + Features real-time order filtering, transactional + integrity, and zero-dependency deployment. +

+
+ Go + SQLite + HTMX + SQL +
+ +
+
-
-

External Sorting Implementation C++

-

- High-performance implementation for sorting datasets exceeding RAM - capacity. Utilized min-heaps and optimized disk I/O buffers to manage - large-scale data processing efficiently. -

-
+
+
+

Python-to-Ruby Transpiler

+

+ A compiler front-end built with Flex, Bison, and + C++. Handles Python's significant indentation + through custom lexer logic, produces Ruby AST + output, and solves complex build challenges + including circular dependency resolution in + generated code. +

+
+ Input (Python) +
+class Counter:
+    def increment(self):
+        self.count = self.count + 1
+
+
+
+ Output (Ruby) +
+class Counter
+  def increment
+    @count = @count + 1
+  end
+end
+
+
+ Flex + Bison + C++ + Make +
+ +
+
-
-

Order Tracker for Cake Shop Go / SQLite / HTMX

-

- A production-ready logistics system for a local business. Features - transactional integrity, secure session-based auth, and a dynamic UI - using HTMX. The entire stack is compiled into a single binary using - Go's embed system for zero-dependency deployment. -

-
+
+
+

Minesweeper

+

+ A fully-playable Minesweeper clone built with C and + SDL3. Demonstrates comfort with low-level graphics + programming and C memory management. +

+
+ C + SDL3 + CMake +
+ +
+
-
-

- Self-Hosted Infrastructure - Debian / Docker / NixOS -

-

- Management of a production environment for media, backups, and small - business order-tracking. Running in Docker, secured behind an overlay - VPN, and exposed via Cloudflare tunnels when required. -

-
-
+
+
+

Disk-Friendly B+ Tree

+

+ A B+ tree implementation focused on memory-efficient + data structures and disk-aware storage. +

+
+ Rust + Data Structures +
+ +
+
-
-

DEVELOPMENT PHILOSOPHY

-

- I believe in Deep Ownership. Beyond writing code, I strive to - understand the entire delivery chain—from database commit logs and - memory management to final binary deployment. I am guided by: -

- -
+
+
+

Self-Hosted Infrastructure

+

+ Production server running Debian with Docker + containers and systemd-managed services. Hosts + media, backups, and the cake shop's order-tracking + system. Secured behind an overlay VPN, exposed + through Cloudflare tunnels where needed, with + automated backups and monitoring. +

+
+ Docker + Debian + systemd + Cloudflare + VPN +
+
+
-
-

OTHER INTERESTS

-
-

Literary

-

- I primarily read Science Fiction but also enjoy classic murder - mysteries. Some of my favorite books include: -

-
    -
  • Foundation (Isaac Asimov)
  • -
  • God Emperor of Dune (Frank Herbert)
  • -
  • The Three-Body Problem (Cixin Liu)
  • -
  • The Murder of Roger Ackroyd (Agatha Christie)
  • -
+
+
+

External Sorting

+

+ High-performance external sort for datasets + exceeding RAM capacity. Uses min-heaps and optimized + disk I/O buffers. +

+
+ C++ + Algorithms +
+ +
+
+ +
-

Gaming

-

I mostly play automation games but also enjoy other indie titles:

- +
+

Availability & Commitment

+

+ I am looking for a paid internship or junior developer position + - full-time for summer 2026, then part-time during the academic + year. +

+
    +
  • + Summer 2026 (Jul–Sep): Full-time internship / junior + role. +
  • +
  • + Academic Year 2026/27: Part-time (approx. 20h/week). +
  • +
  • Post-Graduation (2027+): Full-time, permanent.
  • +
+
-

Other

- -
-
- - - +
+

Development Philosophy

+

+ I believe in Deep Ownership — understanding the full + delivery chain from memory management to deployment. I am guided + by: +

+ +
+ diff --git a/screenshots/piekarnikgosi-hero.avif b/screenshots/piekarnikgosi-hero.avif new file mode 100644 index 0000000..5cc2b01 Binary files /dev/null and b/screenshots/piekarnikgosi-hero.avif differ diff --git a/style.css b/style.css index 4757d21..2d19b4b 100644 --- a/style.css +++ b/style.css @@ -1,65 +1,353 @@ :root { - --bg: #ffffff; - --text: #1a1a1a; - --accent: #000080; - --dim: #666; - --code-bg: #f4f4f4; + --bg: #fafafa; + --bg-card: #ffffff; + --text: #1a1a1a; + --text-dim: #666666; + --accent: #1a6b3c; + --accent-dim: #2d8a4e; + --border: #e0e0e0; + --tag-bg: #f0f0f4; + --tag-text: #333; + --shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04); + --radius: 8px; +} + +@media (prefers-color-scheme: dark) { + :root { + --bg: #111113; + --bg-card: #1a1a1e; + --text: #e4e4e7; + --text-dim: #a1a1aa; + --accent: #4ade80; + --accent-dim: #22c55e; + --border: #27272a; + --tag-bg: #27272a; + --tag-text: #d4d4d8; + --shadow: 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2); + } +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; } body { - font-family: "Liberation Sans", sans-serif; - line-height: 1.6; - color: var(--text); - max-width: 800px; - margin: 0 auto; - padding: 2rem 1.5rem; + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, + sans-serif; + line-height: 1.65; + color: var(--text); + background: var(--bg); + max-width: 900px; + margin: 0 auto; + padding: 2.5rem 1.5rem; + transition: + color 0.2s, + background 0.2s; } -header { - border-bottom: 2px solid var(--text); - padding-bottom: 1rem; - margin-bottom: 2rem; +section { + margin-top: 3rem; } -a { - color: var(--accent); - text-decoration: none; - font-weight: bold; - margin-right: 15px; -} - -a:hover { - text-decoration: underline; +h1 { + font-size: 1.75rem; + font-weight: 700; + letter-spacing: -0.02em; } h2 { - font-size: 1.1rem; - text-transform: uppercase; - letter-spacing: 2px; - border-bottom: 1px solid #ddd; - padding-bottom: 0.3rem; - margin-top: 2.5rem; + font-size: 1rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--accent); + margin-bottom: 1.25rem; } h3 { - margin-bottom: 0.5rem; - font-size: 1.1rem; + font-size: 1.1rem; + font-weight: 600; + margin-bottom: 0.4rem; } -h3 span { - font-family: monospace; - font-size: 0.85rem; - background: var(--code-bg); - padding: 2px 6px; - border-radius: 4px; - font-weight: normal; - margin-left: 10px; - color: var(--text); +p { + margin-bottom: 0.75rem; +} + +a { + color: var(--accent); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +header { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 1rem; + padding-bottom: 1.5rem; + border-bottom: 1px solid var(--border); + margin-bottom: 0; +} + +header p { + color: var(--text-dim); + font-size: 0.95rem; + margin-top: 0.2rem; + margin-bottom: 0; +} + +header nav { + display: flex; + align-items: center; + gap: 0.75rem; + flex-shrink: 0; +} + +header nav a { + font-size: 0.875rem; + font-weight: 500; + color: var(--text-dim); +} + +header nav a:hover { + color: var(--accent); + text-decoration: none; +} + +.contact-bar { + display: flex; + gap: 1.5rem; + flex-wrap: wrap; + font-size: 0.9rem; + color: var(--text-dim); + margin-top: 0.5rem; +} + +.contact-bar a { + font-weight: 500; +} + +.entry { + padding: 1.25rem; + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: var(--shadow); +} + +.entry-head { + margin-bottom: 0.75rem; +} + +.entry-head h3 { + font-size: 1rem; + margin-bottom: 0.15rem; +} + +.entry-meta { + font-size: 0.85rem; + color: var(--text-dim); +} + +.tags { + display: flex; + flex-wrap: wrap; + gap: 0.4rem; + margin-top: 0.75rem; +} + +.tags span { + font-size: 0.75rem; + font-family: "SF Mono", "Fira Code", "Fira Mono", Menlo, monospace; + background: var(--tag-bg); + color: var(--tag-text); + padding: 0.2rem 0.5rem; + border-radius: 4px; +} + +.tag-desc { + font-size: 0.85rem; + font-weight: 400; + color: var(--text-dim); + margin-left: 0.3rem; +} + +.project-grid { + display: grid; + grid-template-columns: 1fr; + gap: 1rem; +} + +@media (min-width: 640px) { + .project-grid { + grid-template-columns: 1fr 1fr; + } +} + +.card { + display: flex; + flex-direction: column; + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: var(--shadow); + overflow: hidden; + transition: + border-color 0.2s, + box-shadow 0.2s; +} + +.card:hover { + border-color: var(--accent); + box-shadow: + 0 2px 8px rgba(0, 0, 0, 0.08), + 0 1px 3px rgba(0, 0, 0, 0.04); +} + +.card-img { + display: block; + line-height: 0; + overflow: hidden; +} + +.card-img:hover { + text-decoration: none; +} + +.card-img img { + width: 100%; + height: 180px; + object-fit: cover; + transition: transform 0.3s ease; +} + +.card-img img[src$=".svg"] { + height: auto; + max-height: 200px; + object-fit: contain; + background: var(--bg); + padding: 0.5rem 0; +} + +.card-img:hover img { + transform: scale(1.03); +} + +.card-body { + padding: 1.25rem; + flex: 1; + display: flex; + flex-direction: column; +} + +.card-body h3 { + font-size: 1rem; + margin-bottom: 0.4rem; +} + +.card-body p { + font-size: 0.9rem; + color: var(--text-dim); + line-height: 1.55; + flex: 1; +} + +.code-compare { + margin: 0.75rem 0 0; + font-size: 0.8rem; + border-radius: 6px; + overflow: hidden; + border: 1px solid var(--border); +} + +.code-compare .code-label { + display: block; + font-size: 0.65rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + padding: 0.3rem 0.6rem; + background: var(--tag-bg); + color: var(--text-dim); + border-bottom: 1px solid var(--border); +} + +.code-compare pre { + margin: 0; + padding: 0.6rem; + overflow-x: auto; + font-family: "SF Mono", "Fira Code", "Fira Mono", Menlo, monospace; + font-size: 0.75rem; + line-height: 1.45; + color: var(--text); + background: var(--bg); +} + +.code-compare + .code-compare { + border-top: 0; + border-radius: 0 0 6px 6px; +} + +.arrow-mid { + text-align: center; + font-size: 0.8rem; + color: var(--text-dim); + padding: 0.25rem 0; + line-height: 1; +} + +.card-links { + margin-top: 0.75rem; + font-size: 0.875rem; + display: flex; + gap: 1.25rem; +} + +.card-links a { + font-weight: 500; +} + +#availability ul { + list-style: none; + padding: 0; +} + +#availability li { + padding: 0.5rem 0; + border-bottom: 1px solid var(--border); + font-size: 0.95rem; +} + +#availability li:last-child { + border-bottom: none; +} + +#philosophy ul { + padding-left: 1.2rem; +} + +#philosophy li { + margin-bottom: 0.6rem; + font-size: 0.95rem; + line-height: 1.55; } footer { - margin-top: 4rem; - border-top: 1px solid #eee; - font-size: 0.85rem; - color: var(--dim); + margin-top: 4rem; + padding-top: 1.5rem; + border-top: 1px solid var(--border); + font-size: 0.85rem; + color: var(--text-dim); + text-align: center; +} + +footer p { + margin-bottom: 0; }