diff --git a/Makefile b/Makefile index ba12ac0..9e7b38f 100644 --- a/Makefile +++ b/Makefile @@ -3,32 +3,24 @@ html: index.html index.html: resume.tex res.cls resume.cfg style.css - make4ht -f html5 -c resume.cfg resume.tex - sed -i 's|||; s||Bastian Gruber - CV|' resume.html - sed -i 's|linkedin.com/in/bastiangruber|linkedin.com/in/bastiangruber|g' resume.html - sed -i 's|rustwebdevelopment.com|rustwebdevelopment.com|g' resume.html - sed -i 's|gruberbastian@me.com|gruberbastian@me.com|g' resume.html - sed -i 's|github.com/gruberb|github.com/gruberb|g' resume.html - sed -i 's|code.novanexus.ca/gruberb|code.novanexus.ca/gruberb|g' resume.html - sed -i 's|bastiangruber.ca|bastiangruber.ca|g' resume.html - sed -i 's|Mozilla, Remote|Mozilla, Remote|g' resume.html - sed -i 's|Toposware, Remote|Toposware, Remote|g' resume.html - sed -i 's|Centrifuge, Remote|Centrifuge, Remote|g' resume.html - sed -i 's|Manning Publications, Remote|Manning Publications, Remote|g' resume.html - sed -i 's|Twilio Inc., Remote|Twilio Inc., Remote|g' resume.html - sed -i 's|Kraken Digital Currency Exchange, Remote|Kraken Digital Currency Exchange, Remote|g' resume.html - sed -i 's|Self Employed, Berlin/Toronto|Self Employed, Berlin/Toronto|g' resume.html - sed -i 's|smartB Energy Management GmbH, Berlin|smartB Energy Management GmbH, Berlin|g' resume.html - sed -i 's|blogfoster GmbH, Berlin|blogfoster GmbH, Berlin|g' resume.html - sed -i 's|Dalia Research, Berlin|Dalia Research, Berlin|g' resume.html - sed -i 's|TH Ingolstadt|TH Ingolstadt|g' resume.html - sed -i 's|OSRAM|OSRAM|g' resume.html - sed -i 's|Körber Digital|Körber Digital|g' resume.html - sed -i 's|Avenga|Avenga|g' resume.html - sed -i 's|ERGO Group|ERGO Group|g' resume.html - sed -i 's|GIATA|GIATA|g' resume.html - sed -i 's|PaperHive|PaperHive|g' resume.html - sed -i 's|Glispa|Glispa|g' resume.html + htlatex resume.tex "resume.cfg,html5" "" "" "" + LANG=C LC_ALL=C sed -i '' 's|||; s||Bastian Gruber - CV|' resume.html + LANG=C LC_ALL=C sed -i '' 's|linkedin.com/in/bastiangruber|linkedin.com/in/bastiangruber|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|rustwebdevelopment.com|rustwebdevelopment.com|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|gruberbastian@me.com|gruberbastian@me.com|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|github.com/gruberb|github.com/gruberb|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|code.novanexus.ca/gruberb|code.novanexus.ca/gruberb|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|bastiangruber.ca|bastiangruber.ca|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|Mozilla, Remote|Mozilla, Remote|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|Toposware, Remote|Toposware, Remote|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|Centrifuge, Remote|Centrifuge, Remote|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|Manning Publications|Manning Publications|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|Twilio Inc., Remote|Twilio Inc., Remote|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|Kraken Digital Currency Exchange, Remote|Kraken Digital Currency Exchange, Remote|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|TH Ingolstadt|TH Ingolstadt|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|OSRAM|OSRAM|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|GIATA|GIATA|g' resume.html + LANG=C LC_ALL=C sed -i '' 's|Avenga|Avenga|g' resume.html mv resume.html index.html pdf: resume.pdf @@ -40,7 +32,7 @@ clean: rm -f index.html resume.aux resume.log resume.dvi resume.html resume.css resume.4ct resume.4tc resume.idv resume.lg resume.tmp resume.xref deploy: html - mkdir -p ~/CodingIsFun/personal/bastiangruber.ca/src/cv - cp index.html style.css resume.css ~/CodingIsFun/personal/bastiangruber.ca/src/cv/ + mkdir -p ~/CodingIsFun/fun/bastiangruber.ca/src/cv + cp index.html style.css resume.css ~/CodingIsFun/fun/bastiangruber.ca/src/cv/ all: deploy pdf diff --git a/index.html b/index.html index e8e4954..3ef5d99 100644 --- a/index.html +++ b/index.html @@ -1,156 +1,197 @@ - - - Bastian Gruber - CV - - - - - - -
-
Bastian Gruber
-
- - - -
Professional
LinkedIn: linkedin.com/in/bastiangruber
Book: rustwebdevelopment.com
E-Mail: gruberbastian@me.com
Website: bastiangruber.ca
-

SUMMARY

-

Staff Software Engineer and published author (“Rust Web Development” – Manning) with 15+ years making -pragmatic architecture decisions for backend systems at scale. Currently shipping Rust, C++, and Python code to -hundreds of millions of Firefox users at Mozilla. Founded Rust&Tell Berlin, the largest Rust meetup globally. + + + Bastian Gruber - CV + + + + + + +

+
Bastian Gruber 
 
 
+
+ + + +
Professional  
LinkedIn: linkedin.com/in/bastiangruber 
Book: rustwebdevelopment.com  
E-Mail: gruberbastian@me.com  
Website: bastiangruber.ca  
+ +
Code  
GitHub: github.com/gruberb  
Git: code.novanexus.ca/gruberb 
+

SUMMARY

+

Staff Software Engineer at Mozilla, shipping Rust, C++, and Python to hundreds of millions of Firefox users. +Published author (“Rust Web Development” – Manning). Founder of Rust&Tell Berlin, the largest Rust meetup +globally.

-

SKILLS

-

Languages: Rust, Python, TypeScript, JavaScript, Go
Frontend: React, Angular, Vue.js
Backend: Rust (Actix, Warp, Axum), Python (FastAPI), Node.js, Go
Patterns: REST, GraphQL, gRPC, async Rust, distributed systems (P2P)
Infrastructure: AWS, Google Cloud, Docker, Kubernetes, CI/CD, Grafana
Domains: Systems Programming, FFI, Distributed Systems, Web Services, Micro Services, IoT, Blockchain, -Firefox +

SKILLS

+

Languages: Rust, C++, Python, TypeScript, Go
Backend & Systems: Rust (Actix, Warp, Axum), Python (FastAPI), Node.js, async Rust, FFI/UniFFI +
Patterns: REST, GraphQL, gRPC, distributed systems (P2P), microservices
Infrastructure: AWS, Google Cloud, Docker, Kubernetes, CI/CD, Grafana
AI Tooling: Claude Code, GitHub Copilot

-

PROFESSIONAL EXPERIENCE

- -

Staff Software Engineer - Full-time February 2026 - Now -
Senior Software Engineer - Full-time July 2024 - January 2026 -
Mozilla, Remote
Shipping Rust, C++, and Python code across Firefox desktop and mobile to hundreds of millions of users. All work is open source. -

-
    -
  • Consolidated four separate favicon implementations across Firefox teams into a single Image Service – chose to extend an existing Python/Airflow pipeline rather than build a new microservice, now serving 4 teams from one manifest behind a GCS-backed API -
  • -
  • Implemented Oblivious HTTP (OHTTP) from scratch in application-services (shared Rust component cross-compiled to Swift and Kotlin via UniFFI) plus handwritten C++ and Rust for Firefox Desktop – users are now unidentifiable when making privacy-sensitive requests across all platforms -
  • -
  • Maintained Firefox Push notification service (50k requests/second, sub-200ms latency): reduced memory footprint, added circuit breakers, and built Grafana dashboards for operational visibility -
  • -
  • Contributor and code reviewer for UniFFI, Mozilla’s multi-language bindings generator enabling Rust code to be called from Kotlin, Swift, Python, and JavaScript -
  • -
  • Built Rust extensions for Merino (Python/FastAPI service powering Firefox Suggest); wrote RFCs, mapped out project plans, and surfaced cross-team blockers early -
  • -
  • Led “Rusty Fridays” internal education sessions, guiding engineers through Rust adoption and mentoring junior contributors across teams
+

PROFESSIONAL EXPERIENCE

+

Staff Software Engineer (promoted from Senior) July 2024 - Present +
Mozilla, Remote

+
    +
  • +

    Implemented Oblivious HTTP (OHTTP) from scratch in application-services (shared Rust component + cross-compiled to Swift/Kotlin via UniFFI) plus C++ and Rust for Firefox Desktop – users are now + unidentifiable when making privacy-sensitive requests across all platforms +

  • +
  • +

    Consolidated four separate favicon implementations into a single Image Service – extended an existing + Python/Airflow pipeline rather than building a new microservice, now serving 4 teams from one + manifest behind a GCS-backed API +

  • +
  • +

    Maintained Firefox Push notification service (50k req/s, sub-200ms latency): reduced memory footprint, + added circuit breakers, built Grafana dashboards +

  • +
  • +

    Contributor and code reviewer for UniFFI, Mozilla’s multi-language bindings generator (Rust to Kotlin, - -

    Senior Systems Engineer, Team Lead - Full-time April 2023 - June 2024 -
    Toposware, Remote
    Core team of 4 building a peer-to-peer distributed network protocol from scratch in Rust.

    -
      -
    • Achieved 10x throughput per node by profiling and targeting the actual bottleneck – optimized batch processing and serialization paths, tuned message volumes to avoid throughput degradation – rather than redesigning the consensus layer -
    • -
    • Led benchmark initiative with 3 engineers that revealed nodes were compute-bound on encryption/decryption, not network-limited – findings redirected optimization effort away from networking toward crypto performance -
    • -
    • Rewrote the CLI from scratch, replacing error-prone CLI parameters with local config files – reduced operator misconfiguration during node setup -
    • -
    • Built an EVM bridge connecting external Ethereum-compatible chains to the core network -
    • -
    • Set up load testing, CI/CD pipelines, and Grafana dashboards for production observability
    + Swift, Python, JavaScript) +

  • +
  • +

    Led “Rusty Fridays” internal education sessions, mentoring engineers across teams through Rust + adoption

+

Senior Systems Engineer, Team Lead 2023 - 2024 +
Toposware, Remote
Core team of 4 building a peer-to-peer distributed network protocol from scratch in Rust.

+
    +
  • +

    Achieved 10x throughput per node by profiling the actual bottleneck – optimized batch processing and + serialization paths rather than redesigning the consensus layer +

  • +
  • +

    Led benchmark initiative that revealed nodes were compute-bound on crypto operations, not + network-limited – redirected optimization effort accordingly +

  • +
  • +

    Built an EVM bridge connecting external Ethereum-compatible chains to the core network

+

Senior Software Engineer 2022 - 2023 +
Centrifuge, Remote
Protocol team building DeFi applications on Substrate/Polkadot in Rust.

+
    +
  • +

    Implemented on-chain fund pool mutations – core feature for the lending protocol enabling live capital + allocation adjustments +

  • +
  • +

    Replaced manual documentation with CI-driven auto-generation from Rust source – eliminated + persistent drift between code and public docs

+

Author, “Rust Web Development” 2020 - 2022 +
Manning Publications
Published end-to-end guide covering async Rust, web frameworks, and production deployment. +

Sr. Solutions Architect (promoted from SA) 2020 - 2022 +
Twilio Inc., Remote

+
    +
  • +

    Technical lead for Fortune 500 engagements: debugged latency issues, redesigned messaging flows, + advised on architectures matching client team size and resources +

  • +
  • +

    Created reusable engagement playbooks adopted across the EMEA Professional Services team

- -

Senior Software Engineer - Full-time August 2022 - February 2023 -
Centrifuge, Remote
Protocol team building DeFi applications on Substrate/Polkadot in a self-governed organization.

-
    -
  • Implemented fund pool mutations on-chain, enabling users to adjust capital allocations in live pools – core feature for the lending protocol -
  • -
  • Built client-facing APIs on top of fund pools, giving external integrators programmatic access to pool operations -
  • -
  • Replaced manual documentation with CI-driven auto-generation from Rust source on every PR – eliminated persistent drift between code and public docs -
  • -
  • Co-authored RFCs to build consensus on new protocol features across the decentralized team
- - -

Author of “Rust Web Development” October 2020 - December 2022 -
Manning Publications, Remote

-
    -
  • Published “Rust Web Development” through Manning – end-to-end guide covering async Rust, web frameworks, and production deployment, distributed globally
- - -

Sr. Solutions Architect (Professional Services) - Full-time May 2021 - July 2022 -
Solutions Architect (Professional Services) - Full-time June 2020 - May 2021 -
Twilio Inc., Remote
Second Solutions Architect hired for the new EMEA Professional Services team. Led enterprise integrations across contact center, messaging, and voice products. -

-
    -
  • Technical lead for Fortune 500 engagements: debugged audio quality and latency issues, redesigned messaging flows, and advised clients on achievable architectures given their team size and resources -
  • -
  • Advocated for combining two existing lower-cost Twilio products over adopting a newer, more expensive one for a major engagement – reduced client spend while using battle-tested components -
  • -
  • Created reusable engagement playbooks (setup checklists, edge-case discovery questions, technical review templates) adopted across the EMEA team -
  • -
  • Hired and onboarded engineers to scale the Professional Services team
- - -

Systems Engineer - Contract August 2019 - May 2020 -
Kraken Digital Currency Exchange, Remote (San Francisco)
Member of the first Rust engineering team (12 engineers), replacing core banking infrastructure and API gateway.

-
    -
  • Migrated core banking services and API gateway from PHP to Rust, achieving 100x throughput improvement – enabling the exchange to absorb order-of-magnitude traffic growth without scaling hardware -
  • -
  • Built new Rust services from scratch with comprehensive test coverage and security-first design -
  • -
  • Worked directly with the CTO on privacy-focused architectural decisions for the trading platform
- - -

Rust Developer - Freelance March 2019 - July 2019 -
Self Employed, Berlin/Toronto

-
    -
  • Founded the monthly “Rust & Tell Berlin” meetup – grew it into the largest Rust meetup globally, still running years later -
  • -
  • Contributed to Rust core and ecosystem libraries -
  • -
  • Created Rust learning resources specifically for Node.js developers transitioning to systems programming
- - -

Sr. Software Engineer - Freelance March 2016 - February 2019 -
OSRAM, Körber Digital, Avenga, ERGO Group, GIATA, PaperHive, Glispa (Berlin)
Freelance consultant for enterprise clients across IoT, logistics, tourism, and ad-tech.

-
    -
  • Designed authentication infrastructure for OSRAM’s IoT platform (thousands of connected lighting devices) using Keycloak for user auth and service-to-service auth across microservices (Node.js, Go, Lua) -
  • -
  • First engineering hire at Körber Digital: chose Node.js/React/AWS stack, built real-time data pipelines with a time-series database optimized for fast retrieval of sensor data -
  • -
  • Decomposed GIATA’s monolithic tourism ERP into 6 Docker-based microservices – rewrote the hotel ingestion pipeline and mass photo upload system, significantly improving UI responsiveness and system scalability -
  • -
  • Tech Lead at Avenga: introduced Scrum and refactored a monolith into microservices to unblock parallel team development -
  • -
  • Built analytics dashboards and ad platforms at Glispa (AngularJS); mentored teams on modern JavaScript practices
- - -

Software Engineer - Full-time August 2015 - February 2016 -
smartB Energy Management GmbH, Berlin
Small agile team building energy monitoring applications for business owners. -

-
    -
  • Introduced pair programming and component-based frontend architecture, enabling multiple developers to work on the same codebase without conflicts -
  • -
  • Full-stack development with JavaScript and Python using TDD
- - -

Software Engineer - Freelance March 2015 - July 2015 -
blogfoster GmbH, Berlin
First developer hired to replace legacy PHP/Backbone application with Node.js and React.

-
    -
  • Built the first version of the ad marketplace; co-designed architecture with the CTO using TDD from day one
- - -

Frontend Developer - Full-time February 2014 - March 2015 -
Dalia Research, Berlin
First and sole frontend developer at 8-person startup.

-
    -
  • Bootstrapped the customer-facing survey platform and analytics dashboards in AngularJS – core UI remained largely untouched in production for close to 10 years
- -

EDUCATION

-

Bachelor of Science, Computer Science September 2010 - February 2014 -
TH Ingolstadt
Scholarship from Allianz Deutschland AG to study Computer Science, fully funded and with trainings in Scrum, -Java, PL/I and mainframe systems on the side. +

Systems Engineer 2019 - 2020 +
Kraken Digital Currency Exchange, Remote

+
    +
  • +

    Migrated core banking services and API gateway from PHP to Rust, achieving 100x throughput + improvement – enabling order-of-magnitude traffic growth without scaling hardware +

  • +
  • +

    Worked directly with the CTO on privacy-focused architectural decisions for the trading platform

+

Earlier Career 2014 - 2019 +
Sr. Software Engineer across enterprise clients (OSRAM, Körber Digital, GIATA, Avenga) and startups (Dalia +Research, blogfoster, smartB) in Berlin.

+
    +
  • +

    Founded “Rust & Tell Berlin” meetup – grew it into the largest Rust meetup globally, still running + years later +

  • +
  • +

    Designed IoT authentication infrastructure at OSRAM for thousands of connected devices (Node.js, + Go, Lua) +

  • +
  • +

    First engineering hire at Körber Digital: built real-time sensor data pipelines on AWS +

  • +
  • +

    Decomposed GIATA’s monolithic ERP into 6 Docker-based microservices, improving system scalability

+

EDUCATION

+

Bachelor of Science, Computer Science
TH Ingolstadt – Scholarship from Allianz Deutschland AG (fully funded)

+ + + + - - \ No newline at end of file diff --git a/resume.4ct b/resume.4ct index 26be2b4..84a4e43 100644 --- a/resume.4ct +++ b/resume.4ct @@ -2,5 +2,5 @@ \doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-10000}{QQ2-1-1}{\centerline {SUMMARY}}}{1}\relax \doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-20000}{QQ2-1-2}{\centerline {SKILLS}}}{1}\relax \doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-30000}{QQ2-1-3}{\centerline {PROFESSIONAL EXPERIENCE}}}{1}\relax -\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-40000}{QQ2-1-4}{\centerline {EDUCATION}}}{5}\relax +\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-40000}{QQ2-1-4}{\centerline {EDUCATION}}}{3}\relax \par diff --git a/resume.4tc b/resume.4tc index 67ad61f..5ad2690 100644 --- a/resume.4tc +++ b/resume.4tc @@ -2,4 +2,4 @@ \doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-10000}{QQ2-1-1}{\centerline {SUMMARY}}}{1}\relax \doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-20000}{QQ2-1-2}{\centerline {SKILLS}}}{1}\relax \doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-30000}{QQ2-1-3}{\centerline {PROFESSIONAL EXPERIENCE}}}{1}\relax -\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-40000}{QQ2-1-4}{\centerline {EDUCATION}}}{5}\relax +\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-40000}{QQ2-1-4}{\centerline {EDUCATION}}}{3}\relax diff --git a/resume.css b/resume.css index 661fe72..cc15aed 100644 --- a/resume.css +++ b/resume.css @@ -35,6 +35,8 @@ li p:first-child{ margin-top:0em; } li p:last-child, li div:last-child { margin-bottom:0.5em; } li p:first-child{ margin-bottom:0; } li p~ul:last-child, li p~ol:last-child{ margin-bottom:0.5em; } +ul.itemize1,ol.enumerate1{padding-left: 0;} +ul li.itemize,ol li.enumerate{margin-left: 1rem;} .enumerate1 {list-style-type:decimal;} .enumerate2 {list-style-type:lower-alpha;} .enumerate3 {list-style-type:lower-roman;} @@ -66,6 +68,7 @@ div.flushleft {text-align: left;} .framebox-r {text-align:right;} span.thank-mark{ vertical-align: super } span.footnote-mark sup.textsuperscript, span.footnote-mark a sup.textsuperscript{ font-size:80%; } +aside.footnote-text p{margin-top:0; margin-bottom:0;text-indent: 0;} code.verb{font-family:monospace,monospace;} div.tabular, div.center div.tabular {text-align: center; margin-top:0.5em; margin-bottom:0.5em; } table.tabular td p{margin-top:0em;} @@ -111,7 +114,9 @@ table.pmatrix {width:100%;} span.bar-css {text-decoration:overline;} img.cdots{vertical-align:middle;} .partToc a, .partToc, .likepartToc a, .likepartToc {line-height: 200%; font-weight:bold; font-size:110%;} -.index-item, .index-subitem, .index-subsubitem {display:block} +.theindex-letter{ margin-top: 1em;} +.index-subitem{ margin-left: 2ch;} +.index-subsubitem{ margin-left: 4ch;} div.caption {text-indent:-2em; margin-left:3em; margin-right:1em; text-align:center; margin-top: 0.5rem;} div.caption span.id{font-weight: bold; white-space: nowrap; } h1.partHead{text-align: center} @@ -122,7 +127,7 @@ p.bibitem-p { text-indent: 0em; margin-left: 2em; margin-top:0.6em; margin-botto .subparagraphHead, .likesubparagraphHead { font-weight: bold;} .verse{white-space:nowrap; margin-left:2em} div.maketitle {text-align:center;} -h2.titleHead{text-align:center;} +h1.titleHead{text-align:center;} div.maketitle{ margin-bottom: 2em; } div.author, div.date {text-align:center;} div.thanks{text-align:left; margin-left:10%; font-size:85%; font-style:italic; } @@ -139,6 +144,8 @@ figure.figure {text-align:center;} figcaption.caption {text-indent:-2em; margin-left:3em; margin-right:1em; text-align:center;} figcaption.caption span.id{font-weight: bold; white-space: nowrap; } p + figcaption, img + figcaption{margin-top: 1em;} +.thebibliography dl { display: grid; grid-auto-columns: min-content 1fr; grid-auto-flow: column; } +.thebibliography dt { grid-column: 1; margin-bottom: 0.5em; } .abstract{margin:1em;} table.tabbing {width:100%; margin-top:1em;} td.tabbing {width:33%;} diff --git a/resume.dvi b/resume.dvi index 8e73a40..c982761 100644 Binary files a/resume.dvi and b/resume.dvi differ diff --git a/resume.idv b/resume.idv index 5dd7dd3..90994a7 100644 Binary files a/resume.idv and b/resume.idv differ diff --git a/resume.lg b/resume.lg index a815e27..1def4b4 100644 --- a/resume.lg +++ b/resume.lg @@ -42,6 +42,8 @@ Css: li p:first-child{ margin-top:0em; } Css: li p:last-child, li div:last-child { margin-bottom:0.5em; } Css: li p:first-child{ margin-bottom:0; } Css: li p~ul:last-child, li p~ol:last-child{ margin-bottom:0.5em; } +Css: ul.itemize1,ol.enumerate1{padding-left: 0;} +Css: ul li.itemize,ol li.enumerate{margin-left: 1rem;} Css: .enumerate1 {list-style-type:decimal;} Css: .enumerate2 {list-style-type:lower-alpha;} Css: .enumerate3 {list-style-type:lower-roman;} @@ -73,6 +75,7 @@ Css: .framebox-l {text-align:left;} Css: .framebox-r {text-align:right;} Css: span.thank-mark{ vertical-align: super } Css: span.footnote-mark sup.textsuperscript, span.footnote-mark a sup.textsuperscript{ font-size:80%; } +Css: aside.footnote-text p{margin-top:0; margin-bottom:0;text-indent: 0;} Css: code.verb{font-family:monospace,monospace;} Css: div.tabular, div.center div.tabular {text-align: center; margin-top:0.5em; margin-bottom:0.5em; } Css: table.tabular td p{margin-top:0em;} @@ -118,7 +121,9 @@ Css: table.pmatrix {width:100%;} Css: span.bar-css {text-decoration:overline;} Css: img.cdots{vertical-align:middle;} Css: .partToc a, .partToc, .likepartToc a, .likepartToc {line-height: 200%; font-weight:bold; font-size:110%;} -Css: .index-item, .index-subitem, .index-subsubitem {display:block} +Css: .theindex-letter{ margin-top: 1em;} +Css: .index-subitem{ margin-left: 2ch;} +Css: .index-subsubitem{ margin-left: 4ch;} Css: div.caption {text-indent:-2em; margin-left:3em; margin-right:1em; text-align:center; margin-top: 0.5rem;} Css: div.caption span.id{font-weight: bold; white-space: nowrap; } Css: h1.partHead{text-align: center} @@ -129,7 +134,7 @@ Css: .paragraphHead, .likeparagraphHead { margin-top:2em; font-weight: bold;} Css: .subparagraphHead, .likesubparagraphHead { font-weight: bold;} Css: .verse{white-space:nowrap; margin-left:2em} Css: div.maketitle {text-align:center;} -Css: h2.titleHead{text-align:center;} +Css: h1.titleHead{text-align:center;} Css: div.maketitle{ margin-bottom: 2em; } Css: div.author, div.date {text-align:center;} Css: div.thanks{text-align:left; margin-left:10%; font-size:85%; font-style:italic; } @@ -146,6 +151,8 @@ Css: figure.figure {text-align:center;} Css: figcaption.caption {text-indent:-2em; margin-left:3em; margin-right:1em; text-align:center;} Css: figcaption.caption span.id{font-weight: bold; white-space: nowrap; } Css: p + figcaption, img + figcaption{margin-top: 1em;} +Css: .thebibliography dl { display: grid; grid-auto-columns: min-content 1fr; grid-auto-flow: column; } +Css: .thebibliography dt { grid-column: 1; margin-bottom: 0.5em; } Css: .abstract{margin:1em;} Css: table.tabbing {width:100%; margin-top:1em;} Css: td.tabbing {width:33%;} diff --git a/resume.log b/resume.log index 36a2222..348a135 100644 --- a/resume.log +++ b/resume.log @@ -1,12 +1,15 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026) (preloaded format=pdflatex 2026.3.1) 4 MAR 2026 11:52 +This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026) (preloaded format=latex 2026.3.1) 9 MAR 2026 09:46 entering extended mode restricted \write18 enabled. %&-line parsing enabled. -**resume.tex -(./resume.tex -LaTeX2e <2025-11-01> -L3 programming layer <2026-01-19> -(./res.cls +**\makeatletter\def\HCode{\futurelet\HCode\HChar}\def\HChar{\ifx"\HCode\def\HCo +de"##1"{\Link##1}\expandafter\HCode\else\expandafter\Link\fi}\def\Link#1.a.b.c. +{\g@addto@macro\@documentclasshook{\RequirePackage[#1,html]{tex4ht}}\let\HCode\ +documentstyle\def\documentstyle{\let\documentstyle\HCode\expandafter\def\csname + tex4ht\endcsname{#1,html}\def\HCode####1{\documentstyle[tex4ht,}\@ifnextchar[{ +\HCode}{\documentstyle[tex4ht]}}}\makeatother\HCode resume.cfg,html5.a.b.c.\inp +ut resume.tex +(./resume.tex (./res.cls Document Style `res' <26 Sep 89>. Document Class: res 2000/05/19 v1.4b Resume class (/usr/local/texlive/2026basic/texmf-dist/tex/latex/base/article.cls @@ -38,77 +41,406 @@ No auxiliary output files. \resumewidth=\dimen150 \@columnwidth=\dimen151 \c@numberofcolumns=\count283 -) (/usr/local/texlive/2026basic/texmf-dist/tex/latex/psnfss/helvet.sty +) (/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/tex4ht.sty +version 2025-12-14-13:41 +Package: tex4ht +-------------------------------------- +--- Note --- for _ at preamble, use the command line option `early_' +-------------------------------------- +-------------------------------------- +--- Note --- for ^ at preamble, use the command line option `early^' +-------------------------------------- +\tmp:toks=\toks22 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/usepackage.4ht +version 2025-08-27-10:30 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/latex/psnfss/helvet.sty Package: helvet 2020/03/25 PSNFSS-v9.3 (WaS) (/usr/local/texlive/2026basic/texmf-dist/tex/latex/graphics/keyval.sty Package: keyval 2022/05/29 v1.15 key=value parser (DPC) -\KV@toks@=\toks22 +\KV@toks@=\toks23 )) -(/usr/local/texlive/2026basic/texmf-dist/tex/latex/l3backend/l3backend-pdftex.d -ef -File: l3backend-pdftex.def 2025-10-09 L3 backend support: PDF output (pdfTeX) -\l__color_backend_stack_int=\count284 +(./resume.cfg +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/tex4ht.4ht +version 2025-07-09-13:35 +-------------------------------------- +--- Note --- for additional information, use the command line option `info' +-------------------------------------- + +:::::::::::::::::::::::::::::::::::::::::: + TeX4ht info is available in the log file +:::::::::::::::::::::::::::::::::::::::::: +) (/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/tex4ht.sty +version 2025-12-14-13:41 + +l.882 --- TeX4ht warning --- nonprimitive \everypar --- +--- needs --- tex4ht resume --- +\tmp:cnt=\count284 +\openout15 = `resume.tmp'. + +(./resume.tmp) +\tmp:dim=\skip52 + (./resume.xref) +\:refout=\write3 +\openout3 = `resume.xref'. + + +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4.4ht +version 2026-01-04-08:10 +-------------------------------------- +--- Note --- to remove the processing instruction use the c +ommand line option `no-VERSION' +-------------------------------------- +-------------------------------------- +--- Note --- to remove the DOCTYPE declaration use the command line option `no- +DOCTYPE' +-------------------------------------- +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/unicode.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4-math.4ht +version 2026-01-29-13:49 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html5.4ht +version 2026-01-18-07:06 +) +-------------------------------------- +--- Note --- for marking of the base font, use the command line option `fonts+' + +-------------------------------------- +-------------------------------------- +--- Note --- for non active _, use the command line option `no_' +-------------------------------------- +-------------------------------------- +--- Note --- for _ of catcode 13, use the command line option `_13' +-------------------------------------- +-------------------------------------- +--- Note --- for non active ^, use the command line option `no^' +-------------------------------------- +-------------------------------------- +--- Note --- for ^ of catcode 13, use the command line option `^13' +-------------------------------------- + +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4.4ht +version 2026-01-04-08:10 +-------------------------------------- +--- Note --- for alternative charset, use the command line option `charset=...' + +-------------------------------------- +-------------------------------------- +--- Note --- to ignore CSS font decoration, use the `NoFonts' command line opti +on +-------------------------------------- +-------------------------------------- +--- Note --- for jpg bitmaps of pictures, use the `jpg' command line option. (C +haracter bitmaps are controled only by `g' records of tex4ht.env and `-g' switc +hes of tex4ht.c) +-------------------------------------- +-------------------------------------- +--- Note --- for gif bitmaps of pictures, use the `gif' command line option. (C +haracter bitmaps are controled only by `g' records of tex4ht.env and `-g' switc +hes of tex4ht.c) +-------------------------------------- +-------------------------------------- +--- Note --- for content and toc in 2 frames, use the command line option `fram +es' +-------------------------------------- +-------------------------------------- +--- Note --- for content, toc, and footnotes in 3 frames, use the command line +option `frames-fn' +-------------------------------------- +-------------------------------------- +--- Note --- for file extension name xht, use the command line option `xht' +-------------------------------------- +TeX4ht package options: html5,html,xhtml +-------------------------------------- +--- Note --- To print a timestamp, use the command line option timestamp +-------------------------------------- +-------------------------------------- +--- Note --- to ignore CSS code, use the command line option `-css +-------------------------------------- +-------------------------------------- +--- Note --- for inline CSS code, use the command line option `css-in' +-------------------------------------- +-------------------------------------- +--- Note --- for pop ups on mouse over, use the command line option `mouseover' + +-------------------------------------- +-------------------------------------- +--- Note --- for addressing images in a subdirectory, use the command line opti +on `imgdir:.../' +-------------------------------------- +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/unicode.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4-math.4ht +version 2026-01-29-13:49 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html5.4ht +version 2026-01-18-07:06 +-------------------------------------- +--- Note --- To print a timestamp, use the command line option timestamp +-------------------------------------- +-------------------------------------- +--- Note --- We use a default CSS style. Use the `nostyle' option if you want t +o use custom a CSS design +-------------------------------------- +) +\:tokwrite=\toks24 +\:tokpage=\toks25 +-------------------------------------- +--- Note --- for back links to toc, use the command line option `sections+' +-------------------------------------- +-------------------------------------- +--- Note --- for linear crosslinks of pages, use the command line option `next' + +-------------------------------------- +\openout15 = `resume.4ct'. + +\:tocout=\write4 +\openout4 = `resume.4tc'. + + +(resume.4tc) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/unicode.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4-math.4ht +version 2026-01-29-13:49 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html5.4ht +version 2026-01-18-07:06 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/latex.4ht +version 2025-12-04-13:51 +LaTeX Info: Redefining \_ on input line 180. +LaTeX Info: Redefining \begin on input line 634. +LaTeX Info: Redefining \end on input line 682. +LaTeX Info: Redefining \, on input line 844. +LaTeX Info: Redefining \; on input line 845. +LaTeX Info: Redefining \! on input line 846. +LaTeX Info: Redefining \: on input line 847. +LaTeX Info: Redefining \> on input line 848. +-------------------------------------- +--- Note --- for links into captions, instead of float heads, use the command l +ine option `refcaption' +-------------------------------------- + +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/unicode.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4-math.4ht +version 2026-01-29-13:49 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html5.4ht +version 2026-01-18-07:06 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4.4ht +version 2026-01-04-08:10 +-------------------------------------- +--- Note --- For mini tocs immediately aftter the header use the command line o +ption `minitoc<' +-------------------------------------- +-------------------------------------- +--- Note --- For full TOC on each page compatible with the collapsetoc DOM filt +er, use the `fulltoc' command line option. +-------------------------------------- +-------------------------------------- +--- Note --- for enumerated list elements with valued data, use the command lin +e option `enumerate+' +-------------------------------------- +-------------------------------------- +--- Note --- for enumerated list elements li's with value attributes, use the c +ommand line option `enumerate-' +-------------------------------------- +-------------------------------------- +--- Note --- for CSS2 code, use the command line option `css2' +-------------------------------------- +-------------------------------------- +--- Note --- for pictorial tabular, use the command line option `pic-tabular' +-------------------------------------- +-------------------------------------- +--- Note --- for bitmap fbox'es, use the command line option `pic-fbox' +-------------------------------------- +-------------------------------------- +--- Note --- for minipage with width, use the command line option `minipage-wid +th' +-------------------------------------- +-------------------------------------- +--- Note --- for bitmap framebox'es, use the command line option `pic-framebox' + +-------------------------------------- +-------------------------------------- +--- Note --- for inline footnotes use command line option `fn-in' +-------------------------------------- +-------------------------------------- +--- Note --- for tracing of latex font commands, use the command line option `f +onts' +-------------------------------------- +-------------------------------------- +--- Note --- for width specifications of tabular p entries, use the `p-width' c +ommand line option or a configuration similar to \Configure{HColWidth}{\HCode{ +style="width:\HColWidth"}} +-------------------------------------- +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/unicode.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4-math.4ht +version 2026-01-29-13:49 +-------------------------------------- +--- Note --- for pictorial eqnarray, use the command line option `pic-eqnarray' + +-------------------------------------- +-------------------------------------- +--- Note --- for pictorial array, use the command line option `pic-array' +-------------------------------------- +-------------------------------------- +--- Note --- for pictorial $...$ environments, use the command line option `pic +-m' (not recommended!!) +-------------------------------------- +-------------------------------------- +--- Note --- for pictorial $...$ and $$...$$ environments with latex alt, use t +he command line option `pic-m+' (not safe!!) +-------------------------------------- +-------------------------------------- +--- Note --- for pictorial array, use the command line option `pic-array' +-------------------------------------- +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html5.4ht +version 2026-01-18-07:06 +)) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/fontmath.4ht +version 2022-10-25-13:59 + +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/unicode.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4-math.4ht +version 2026-01-29-13:49 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html5.4ht +version 2026-01-18-07:06 +)) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/res.4ht +version 2009-05-21-09:32 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/article.4ht +version 2023-04-10-13:46 + +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4.4ht +version 2026-01-04-08:10 +-------------------------------------- +--- Note --- for automatic sectioning pagination, use the command line option ` +1', `2', `3', '4', '5', '6', or '7' +-------------------------------------- +-------------------------------------- +--- Note --- for files named derived from section titles, use the command line +option `sec-filename' +-------------------------------------- +-------------------------------------- +--- Note --- for i-columns index, use the command line option `index=i' (e.g., +index=2) +-------------------------------------- +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/unicode.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4-math.4ht +version 2026-01-29-13:49 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html5.4ht +version 2026-01-18-07:06 +)) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/res-a.4ht +version 2009-05-21-09:32 + +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/unicode.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4-math.4ht +version 2026-01-29-13:49 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html5.4ht +version 2026-01-18-07:06 +)) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/unicode.4ht +version 2026-01-04-08:10 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html4-math.4ht +version 2026-01-29-13:49 +) +(/usr/local/texlive/2026basic/texmf-dist/tex/generic/tex4ht/html5.4ht +version 2026-01-18-07:06 +)) +(/usr/local/texlive/2026basic/texmf-dist/tex/latex/l3backend/l3backend-dvips.de +f +File: l3backend-dvips.def 2025-10-09 L3 backend support: dvips +\l__pdfannot_backend_content_box=\box53 +\l__pdfannot_backend_model_box=\box54 +\g__pdfannot_backend_int=\count285 +\g__pdfannot_backend_link_int=\count286 +\g__pdfannot_backend_link_sf_int=\count287 ) LaTeX Warning: Unused global option(s): [10pt]. No file resume.aux. -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 30. -LaTeX Font Info: ... okay on input line 30. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 30. -LaTeX Font Info: ... okay on input line 30. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 30. -LaTeX Font Info: ... okay on input line 30. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 30. -LaTeX Font Info: ... okay on input line 30. -LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 30. -LaTeX Font Info: ... okay on input line 30. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 30. -LaTeX Font Info: ... okay on input line 30. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 30. -LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 2. +LaTeX Font Info: ... okay on input line 2. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 2. +LaTeX Font Info: ... okay on input line 2. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 2. +LaTeX Font Info: ... okay on input line 2. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 2. +LaTeX Font Info: ... okay on input line 2. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 2. +LaTeX Font Info: ... okay on input line 2. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 2. +LaTeX Font Info: ... okay on input line 2. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 2. +LaTeX Font Info: ... okay on input line 2. +--- file resume.css --- +) LaTeX Font Info: External font `cmex10' loaded for size (Font) <7> on input line 46. LaTeX Font Info: External font `cmex10' loaded for size (Font) <5> on input line 46. -[1 + [1 -{/usr/local/texlive/2026basic/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] -Underfull \hbox (badness 10000) in paragraph at lines 121--123 - - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 147--149 - - [] - -[2] [3] +] [2] [3] *********** LaTeX2e <2025-11-01> L3 programming layer <2026-01-19> *********** ) Here is how much of TeX's memory you used: - 598 strings out of 469006 - 10756 string characters out of 5454814 - 445756 words of memory out of 5000000 - 29363 multiletter control sequences out of 15000+600000 - 629322 words of font info for 45 fonts, out of 8000000 for 9000 + 4481 strings out of 469007 + 58078 string characters out of 5454840 + 592612 words of memory out of 5000000 + 33137 multiletter control sequences out of 15000+600000 + 629490 words of font info for 46 fonts, out of 8000000 for 9000 319 hyphenation exceptions out of 8191 - 49i,8n,52p,357b,206s stack positions out of 10000i,1000n,20000p,200000b,200000s - -Output written on resume.pdf (3 pages, 77604 bytes). -PDF statistics: - 39 PDF objects out of 1000 (max. 8388607) - 24 compressed objects within 1 object stream - 0 named destinations out of 1000 (max. 500000) - 1 words of extra memory for PDF output out of 10000 (max. 10000000) + 49i,8n,59p,828b,464s stack positions out of 10000i,1000n,20000p,200000b,200000s +Output written on resume.dvi (3 pages, 26000 bytes). diff --git a/resume.pdf b/resume.pdf index b1e9f46..2962ffd 100644 Binary files a/resume.pdf and b/resume.pdf differ diff --git a/resume.tex b/resume.tex index f30e0d2..62ccc43 100644 --- a/resume.tex +++ b/resume.tex @@ -52,7 +52,7 @@ \section{\centerline{SUMMARY}} \vspace{8pt} % Gap between title and text -Staff Software Engineer and published author ("Rust Web Development" -- Manning) with 15+ years making pragmatic architecture decisions for backend systems at scale. Currently shipping Rust, C++, and Python code to hundreds of millions of Firefox users at Mozilla. Founded Rust\&Tell Berlin, the largest Rust meetup globally. +Staff Software Engineer at Mozilla, shipping Rust, C++, and Python to hundreds of millions of Firefox users. Published author (``Rust Web Development'' -- Manning). Founder of Rust\&Tell Berlin, the largest Rust meetup globally. %---------------------------------------------------------------------------------------- @@ -65,12 +65,11 @@ Staff Software Engineer and published author ("Rust Web Development" -- Manning) \section{\centerline{SKILLS}} \vspace{8pt} % Gap between title and text -{\bf Languages:} Rust, Python, TypeScript, JavaScript, Go \\ -{\bf Frontend:} React, Angular, Vue.js \\ -{\bf Backend:} Rust (Actix, Warp, Axum), Python (FastAPI), Node.js, Go \\ -{\bf Patterns:} REST, GraphQL, gRPC, async Rust, distributed systems (P2P) \\ +{\bf Languages:} Rust, C++, Python, TypeScript, Go \\ +{\bf Backend \& Systems:} Rust (Actix, Warp, Axum), Python (FastAPI), Node.js, async Rust, FFI/UniFFI \\ +{\bf Patterns:} REST, GraphQL, gRPC, distributed systems (P2P), microservices \\ {\bf Infrastructure:} AWS, Google Cloud, Docker, Kubernetes, CI/CD, Grafana \\ -{\bf Domains:} Systems Programming, FFI, Distributed Systems, Web Services, Micro Services, IoT, Blockchain, Firefox +{\bf AI Tooling:} Claude Code, GitHub Copilot %---------------------------------------------------------------------------------------- @@ -84,114 +83,70 @@ Staff Software Engineer and published author ("Rust Web Development" -- Manning) \vspace{8pt} % Gap between title and text -{\sl Staff Software Engineer - Full-time} \hfill February 2026 - Now \\ -{\sl Senior Software Engineer - Full-time} \hfill July 2024 - January 2026 \\ +{\sl Staff Software Engineer (promoted from Senior)} \hfill July 2024 - Present \\ Mozilla, Remote \\ -Shipping Rust, C++, and Python code across Firefox desktop and mobile to hundreds of millions of users. All work is open source. \begin{itemize} \itemsep -2pt -\item Consolidated four separate favicon implementations across Firefox teams into a single Image Service -- chose to extend an existing Python/Airflow pipeline rather than build a new microservice, now serving 4 teams from one manifest behind a GCS-backed API -\item Implemented Oblivious HTTP (OHTTP) from scratch in application-services (shared Rust component cross-compiled to Swift and Kotlin via UniFFI) plus handwritten C++ and Rust for Firefox Desktop -- users are now unidentifiable when making privacy-sensitive requests across all platforms -\item Maintained Firefox Push notification service (50k requests/second, sub-200ms latency): reduced memory footprint, added circuit breakers, and built Grafana dashboards for operational visibility -\item Contributor and code reviewer for UniFFI, Mozilla's multi-language bindings generator enabling Rust code to be called from Kotlin, Swift, Python, and JavaScript -\item Built Rust extensions for Merino (Python/FastAPI service powering Firefox Suggest); wrote RFCs, mapped out project plans, and surfaced cross-team blockers early -\item Led ``Rusty Fridays'' internal education sessions, guiding engineers through Rust adoption and mentoring junior contributors across teams +\item Implemented Oblivious HTTP (OHTTP) from scratch in application-services (shared Rust component cross-compiled to Swift/Kotlin via UniFFI) plus C++ and Rust for Firefox Desktop -- users are now unidentifiable when making privacy-sensitive requests across all platforms +\item Consolidated four separate favicon implementations into a single Image Service -- extended an existing Python/Airflow pipeline rather than building a new microservice, now serving 4 teams from one manifest behind a GCS-backed API +\item Maintained Firefox Push notification service (50k req/s, sub-200ms latency): reduced memory footprint, added circuit breakers, built Grafana dashboards +\item Contributor and code reviewer for UniFFI, Mozilla's multi-language bindings generator (Rust to Kotlin, Swift, Python, JavaScript) +\item Led ``Rusty Fridays'' internal education sessions, mentoring engineers across teams through Rust adoption \end{itemize} -{\sl Senior Systems Engineer, Team Lead - Full-time} \hfill April 2023 - June 2024 \\ +{\sl Senior Systems Engineer, Team Lead} \hfill 2023 - 2024 \\ Toposware, Remote \\ Core team of 4 building a peer-to-peer distributed network protocol from scratch in Rust. \begin{itemize} \itemsep -2pt -\item Achieved 10x throughput per node by profiling and targeting the actual bottleneck -- optimized batch processing and serialization paths, tuned message volumes to avoid throughput degradation -- rather than redesigning the consensus layer -\item Led benchmark initiative with 3 engineers that revealed nodes were compute-bound on crypto operations, not network-limited -- redirected optimization effort accordingly -\item Rewrote the CLI from scratch, replacing error-prone CLI parameters with local config files -- reduced operator misconfiguration during node setup +\item Achieved 10x throughput per node by profiling the actual bottleneck -- optimized batch processing and serialization paths rather than redesigning the consensus layer +\item Led benchmark initiative that revealed nodes were compute-bound on crypto operations, not network-limited -- redirected optimization effort accordingly \item Built an EVM bridge connecting external Ethereum-compatible chains to the core network -\item Set up load testing, CI/CD pipelines, and Grafana dashboards for production observability \end{itemize} -{\sl Senior Software Engineer - Full-time} \hfill August 2022 - February 2023 \\ +{\sl Senior Software Engineer} \hfill 2022 - 2023 \\ Centrifuge, Remote \\ -Protocol team building DeFi applications on Substrate/Polkadot in a self-governed organization. +Protocol team building DeFi applications on Substrate/Polkadot in Rust. \begin{itemize} \itemsep -2pt -\item Implemented fund pool mutations on-chain, enabling users to adjust capital allocations in live pools -- core feature for the lending protocol -\item Built client-facing APIs on top of fund pools, giving external integrators programmatic access to pool operations -\item Replaced manual documentation with CI-driven auto-generation from Rust source on every PR -- eliminated persistent drift between code and public docs -\item Co-authored RFCs to build consensus on new protocol features across the decentralized team +\item Implemented on-chain fund pool mutations -- core feature for the lending protocol enabling live capital allocation adjustments +\item Replaced manual documentation with CI-driven auto-generation from Rust source -- eliminated persistent drift between code and public docs \end{itemize} -{\sl Author of "Rust Web Development"} \hfill October 2020 - December 2022 \\ -Manning Publications, Remote \\ -\begin{itemize} \itemsep -2pt -\item Published ``Rust Web Development'' through Manning -- end-to-end guide covering async Rust, web frameworks, and production deployment, distributed globally -\end{itemize} +{\sl Author, ``Rust Web Development''} \hfill 2020 - 2022 \\ +Manning Publications \\ +Published end-to-end guide covering async Rust, web frameworks, and production deployment. -{\sl Sr. Solutions Architect (Professional Services) - Full-time} \hfill May 2021 - July 2022 \\ -{\sl Solutions Architect (Professional Services) - Full-time} \hfill June 2020 - May 2021 \\ +\vspace{4pt} + +{\sl Sr. Solutions Architect (promoted from SA)} \hfill 2020 - 2022 \\ Twilio Inc., Remote \\ -Second Solutions Architect hired for the new EMEA Professional Services team. Led enterprise integrations across contact center, messaging, and voice products. \begin{itemize} \itemsep -2pt -\item Technical lead for Fortune 500 engagements: debugged audio quality and latency issues, redesigned messaging flows, and advised clients on achievable architectures given their team size and resources -\item Advocated for combining two existing lower-cost Twilio products over adopting a newer, more expensive one for a major engagement -- reduced client spend while using battle-tested components -\item Created reusable engagement playbooks (setup checklists, edge-case discovery questions, technical review templates) adopted across the EMEA team -\item Hired and onboarded engineers to scale the Professional Services team +\item Technical lead for Fortune 500 engagements: debugged latency issues, redesigned messaging flows, advised on architectures matching client team size and resources +\item Created reusable engagement playbooks adopted across the EMEA Professional Services team \end{itemize} -{\sl Systems Engineer - Contract} \hfill August 2019 - May 2020 \\ -Kraken Digital Currency Exchange, Remote (San Francisco)\\ -Member of the first Rust engineering team (12 engineers), replacing core banking infrastructure and API gateway. +{\sl Systems Engineer} \hfill 2019 - 2020 \\ +Kraken Digital Currency Exchange, Remote \\ \begin{itemize} \itemsep -2pt -\item Migrated core banking services and API gateway from PHP to Rust, achieving 100x throughput improvement -- enabling the exchange to absorb order-of-magnitude traffic growth without scaling hardware -\item Built new Rust services from scratch with comprehensive test coverage and security-first design +\item Migrated core banking services and API gateway from PHP to Rust, achieving 100x throughput improvement -- enabling order-of-magnitude traffic growth without scaling hardware \item Worked directly with the CTO on privacy-focused architectural decisions for the trading platform \end{itemize} -{\sl Rust Developer - Freelance} \hfill March 2019 - July 2019 \\ -Self Employed, Berlin/Toronto \\ -\begin{itemize} \itemsep -2pt -\item Founded the monthly ``Rust \& Tell Berlin'' meetup -- grew it into the largest Rust meetup globally, still running years later -\item Contributed to Rust core and ecosystem libraries -\item Created Rust learning resources specifically for Node.js developers transitioning to systems programming -\end{itemize} +\vspace{4pt} -{\sl Sr. Software Engineer - Freelance} \hfill March 2016 - February 2019 \\ -OSRAM, K\"orber Digital, Avenga, ERGO Group, GIATA, PaperHive, Glispa (Berlin) \\ -Freelance consultant for enterprise clients across IoT, logistics, tourism, and ad-tech. +{\sl Earlier Career} \hfill 2014 - 2019 \\ +Sr. Software Engineer across enterprise clients (OSRAM, K\"orber Digital, GIATA, Avenga) and startups (Dalia Research, blogfoster, smartB) in Berlin. \begin{itemize} \itemsep -2pt -\item Designed authentication infrastructure for OSRAM's IoT platform (thousands of connected lighting devices) using Keycloak for user auth and service-to-service auth across microservices (Node.js, Go, Lua) -\item First engineering hire at K\"orber Digital: chose Node.js/React/AWS stack, built real-time data pipelines with a time-series database optimized for fast retrieval of sensor data -\item Decomposed GIATA's monolithic tourism ERP into 6 Docker-based microservices -- rewrote the hotel ingestion pipeline and mass photo upload system, significantly improving UI responsiveness and system scalability -\item Tech Lead at Avenga: introduced Scrum and refactored a monolith into microservices to unblock parallel team development -\item Built analytics dashboards and ad platforms at Glispa (AngularJS); mentored teams on modern JavaScript practices -\end{itemize} - -{\sl Software Engineer - Full-time} \hfill August 2015 - February 2016 \\ -smartB Energy Management GmbH, Berlin \\ -Small agile team building energy monitoring applications for business owners. -\begin{itemize} \itemsep -2pt -\item Introduced pair programming and component-based frontend architecture, enabling multiple developers to work on the same codebase without conflicts -\item Full-stack development with JavaScript and Python using TDD -\end{itemize} - -{\sl Software Engineer - Freelance} \hfill March 2015 - July 2015 \\ -blogfoster GmbH, Berlin \\ -First developer hired to replace legacy PHP/Backbone application with Node.js and React. -\begin{itemize} \itemsep -2pt -\item Built the first version of the ad marketplace; co-designed architecture with the CTO using TDD from day one -\end{itemize} - -{\sl Frontend Developer - Full-time} \hfill February 2014 - March 2015 \\ -Dalia Research, Berlin \\ -First and sole frontend developer at 8-person startup. -\begin{itemize} \itemsep -2pt -\item Bootstrapped the customer-facing survey platform and analytics dashboards in AngularJS -- core UI remained largely untouched in production for close to 10 years +\item Founded ``Rust \& Tell Berlin'' meetup -- grew it into the largest Rust meetup globally, still running years later +\item Designed IoT authentication infrastructure at OSRAM for thousands of connected devices (Node.js, Go, Lua) +\item First engineering hire at K\"orber Digital: built real-time sensor data pipelines on AWS +\item Decomposed GIATA's monolithic ERP into 6 Docker-based microservices, improving system scalability \end{itemize} \section{\centerline{EDUCATION}} \vspace{8pt} % Gap between title and text -{\sl Bachelor of Science, Computer Science} \hfill September 2010 - February 2014 \\ -TH Ingolstadt\\ -Scholarship from Allianz Deutschland AG to study Computer Science, fully funded and with trainings in Scrum, Java, PL/I and mainframe systems on the side. +{\sl Bachelor of Science, Computer Science} \\ +TH Ingolstadt -- Scholarship from Allianz Deutschland AG (fully funded) diff --git a/resume.xref b/resume.xref index f1ffd28..5ae92bc 100644 --- a/resume.xref +++ b/resume.xref @@ -5,4 +5,4 @@ \:CrossWord{)Qx1-10000}{1}{1}% \:CrossWord{)Qx1-20000}{1}{1}% \:CrossWord{)Qx1-30000}{1}{1}% -\:CrossWord{)Qx1-40000}{1}{5}% +\:CrossWord{)Qx1-40000}{1}{3}%