chore: update structure and text
This commit is contained in:
parent
f48c0f5c34
commit
9624514c38
12 changed files with 657 additions and 323 deletions
48
Makefile
48
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|</head>|<link href="style.css" rel="stylesheet" type="text/css" /></head>|; s|<title></title>|<title>Bastian Gruber - CV</title>|' resume.html
|
||||
sed -i 's|linkedin.com/in/bastiangruber|<a href="https://linkedin.com/in/bastiangruber">linkedin.com/in/bastiangruber</a>|g' resume.html
|
||||
sed -i 's|rustwebdevelopment.com|<a href="https://rustwebdevelopment.com">rustwebdevelopment.com</a>|g' resume.html
|
||||
sed -i 's|gruberbastian@me.com|<a href="mailto:gruberbastian@me.com">gruberbastian@me.com</a>|g' resume.html
|
||||
sed -i 's|github.com/gruberb|<a href="https://github.com/gruberb">github.com/gruberb</a>|g' resume.html
|
||||
sed -i 's|code.novanexus.ca/gruberb|<a href="https://code.novanexus.ca/gruberb">code.novanexus.ca/gruberb</a>|g' resume.html
|
||||
sed -i 's|bastiangruber.ca|<a href="https://bastiangruber.ca">bastiangruber.ca</a>|g' resume.html
|
||||
sed -i 's|Mozilla, Remote|<span class="company">Mozilla</span>, Remote|g' resume.html
|
||||
sed -i 's|Toposware, Remote|<span class="company">Toposware</span>, Remote|g' resume.html
|
||||
sed -i 's|Centrifuge, Remote|<span class="company">Centrifuge</span>, Remote|g' resume.html
|
||||
sed -i 's|Manning Publications, Remote|<span class="company">Manning Publications</span>, Remote|g' resume.html
|
||||
sed -i 's|Twilio Inc., Remote|<span class="company">Twilio Inc.</span>, Remote|g' resume.html
|
||||
sed -i 's|Kraken Digital Currency Exchange, Remote|<span class="company">Kraken Digital Currency Exchange</span>, Remote|g' resume.html
|
||||
sed -i 's|Self Employed, Berlin/Toronto|<span class="company">Self Employed</span>, Berlin/Toronto|g' resume.html
|
||||
sed -i 's|smartB Energy Management GmbH, Berlin|<span class="company">smartB Energy Management GmbH</span>, Berlin|g' resume.html
|
||||
sed -i 's|blogfoster GmbH, Berlin|<span class="company">blogfoster GmbH</span>, Berlin|g' resume.html
|
||||
sed -i 's|Dalia Research, Berlin|<span class="company">Dalia Research</span>, Berlin|g' resume.html
|
||||
sed -i 's|TH Ingolstadt|<span class="company">TH Ingolstadt</span>|g' resume.html
|
||||
sed -i 's|OSRAM|<span class="company">OSRAM</span>|g' resume.html
|
||||
sed -i 's|Körber Digital|<span class="company">Körber Digital</span>|g' resume.html
|
||||
sed -i 's|Avenga|<span class="company">Avenga</span>|g' resume.html
|
||||
sed -i 's|ERGO Group|<span class="company">ERGO Group</span>|g' resume.html
|
||||
sed -i 's|GIATA|<span class="company">GIATA</span>|g' resume.html
|
||||
sed -i 's|PaperHive|<span class="company">PaperHive</span>|g' resume.html
|
||||
sed -i 's|Glispa|<span class="company">Glispa</span>|g' resume.html
|
||||
htlatex resume.tex "resume.cfg,html5" "" "" ""
|
||||
LANG=C LC_ALL=C sed -i '' 's|</head>|<link href="style.css" rel="stylesheet" type="text/css" /></head>|; s|<title></title>|<title>Bastian Gruber - CV</title>|' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|linkedin.com/in/bastiangruber|<a href="https://linkedin.com/in/bastiangruber">linkedin.com/in/bastiangruber</a>|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|rustwebdevelopment.com|<a href="https://rustwebdevelopment.com">rustwebdevelopment.com</a>|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|gruberbastian@me.com|<a href="mailto:gruberbastian@me.com">gruberbastian@me.com</a>|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|github.com/gruberb|<a href="https://github.com/gruberb">github.com/gruberb</a>|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|code.novanexus.ca/gruberb|<a href="https://code.novanexus.ca/gruberb">code.novanexus.ca/gruberb</a>|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|bastiangruber.ca|<a href="https://bastiangruber.ca">bastiangruber.ca</a>|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|Mozilla, Remote|<span class="company">Mozilla</span>, Remote|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|Toposware, Remote|<span class="company">Toposware</span>, Remote|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|Centrifuge, Remote|<span class="company">Centrifuge</span>, Remote|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|Manning Publications|<span class="company">Manning Publications</span>|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|Twilio Inc., Remote|<span class="company">Twilio Inc.</span>, Remote|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|Kraken Digital Currency Exchange, Remote|<span class="company">Kraken Digital Currency Exchange</span>, Remote|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|TH Ingolstadt|<span class="company">TH Ingolstadt</span>|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|OSRAM|<span class="company">OSRAM</span>|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|GIATA|<span class="company">GIATA</span>|g' resume.html
|
||||
LANG=C LC_ALL=C sed -i '' 's|Avenga|<span class="company">Avenga</span>|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
|
||||
|
|
|
|||
339
index.html
339
index.html
|
|
@ -1,156 +1,197 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang='en-US' xml:lang='en-US'>
|
||||
<head> <title>Bastian Gruber - CV</title>
|
||||
<meta charset='utf-8' />
|
||||
<meta content='TeX4ht (https://tug.org/tex4ht/)' name='generator' />
|
||||
<meta content='width=device-width,initial-scale=1' name='viewport' />
|
||||
<link href='resume.css' rel='stylesheet' type='text/css' />
|
||||
<meta content='resume.tex' name='src' />
|
||||
<link href="style.css" rel="stylesheet" type="text/css" /></head><body>
|
||||
<div class='resume'> <!-- tex4ht:inline --><div class='tabular'> <table class='tabular' id='TBL-1'><colgroup id='TBL-1-1g'><col id='TBL-1-1' /></colgroup><tr id='TBL-1-1-' style='vertical-align:baseline;'><td class='td00' id='TBL-1-1-1' style='white-space:nowrap; text-align:left;'><span class='cmbx-12'>Bastian Gruber</span> </td></tr><tr id='TBL-1-2-' style='vertical-align:baseline;'><td class='td00' id='TBL-1-2-1' style='white-space:nowrap; text-align:left;'> </td>
|
||||
</tr><tr id='TBL-1-3-' style='vertical-align:baseline;'><td class='td00' id='TBL-1-3-1' style='white-space:nowrap; text-align:left;'> </td></tr></table> </div>
|
||||
<table class='center-addresses'><tr><td class='first-address'><!-- tex4ht:inline --><div class='tabular'> <table class='tabular' id='TBL-2'><colgroup id='TBL-2-1g'><col id='TBL-2-1' /></colgroup><tr id='TBL-2-1-' style='vertical-align:baseline;'><td class='td00' id='TBL-2-1-1' style='white-space:nowrap; text-align:left;'><span class='cmbx-10'>Professional </span> </td>
|
||||
</tr><tr id='TBL-2-2-' style='vertical-align:baseline;'><td class='td00' id='TBL-2-2-1' style='white-space:nowrap; text-align:left;'>LinkedIn: <a href="https://linkedin.com/in/bastiangruber">linkedin.com/in/bastiangruber</a> </td>
|
||||
</tr><tr id='TBL-2-3-' style='vertical-align:baseline;'><td class='td00' id='TBL-2-3-1' style='white-space:nowrap; text-align:left;'>Book: <a href="https://rustwebdevelopment.com">rustwebdevelopment.com</a> </td>
|
||||
</tr><tr id='TBL-2-4-' style='vertical-align:baseline;'><td class='td00' id='TBL-2-4-1' style='white-space:nowrap; text-align:left;'>E-Mail: <a href="mailto:gruberbastian@me.com">gruberbastian@me.com</a> </td>
|
||||
</tr><tr id='TBL-2-5-' style='vertical-align:baseline;'><td class='td00' id='TBL-2-5-1' style='white-space:nowrap; text-align:left;'>Website: <a href="https://bastiangruber.ca">bastiangruber.ca</a> </td></tr></table> </div></td><td class='second-address'><!-- tex4ht:inline --><div class='tabular'> <table class='tabular' id='TBL-3'><colgroup id='TBL-3-1g'><col id='TBL-3-1' /></colgroup><tr id='TBL-3-1-' style='vertical-align:baseline;'><td class='td00' id='TBL-3-1-1' style='white-space:nowrap; text-align:left;'><span class='cmbx-10'>Code </span> </td>
|
||||
</tr><tr id='TBL-3-2-' style='vertical-align:baseline;'><td class='td00' id='TBL-3-2-1' style='white-space:nowrap; text-align:left;'>GitHub: <a href="https://github.com/gruberb">github.com/gruberb</a> </td>
|
||||
</tr><tr id='TBL-3-3-' style='vertical-align:baseline;'><td class='td00' id='TBL-3-3-1' style='white-space:nowrap; text-align:left;'>Git: <a href="https://code.novanexus.ca/gruberb">code.novanexus.ca/gruberb</a> </td></tr></table> </div></td></tr></table>
|
||||
<h4 class='sectionHead' id='summary'><a id='x1-10000'></a><div class='centerline'> SUMMARY </div></h4><div class='section'>
|
||||
<!-- l. 55 --><p class='noindent'>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.
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-US" xml:lang="en-US" >
|
||||
<head> <title>Bastian Gruber - CV</title>
|
||||
<meta charset="iso-8859-1" />
|
||||
<meta name="generator" content="TeX4ht (https://tug.org/tex4ht/)" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||
<link rel="stylesheet" type="text/css" href="resume.css" />
|
||||
<meta name="src" content="resume.tex" />
|
||||
<link href="style.css" rel="stylesheet" type="text/css" /></head><body
|
||||
>
|
||||
<div class="resume"> <!--tex4ht:inline--><div class="tabular"> <table id="TBL-1" class="tabular"
|
||||
|
||||
><colgroup id="TBL-1-1g"><col
|
||||
id="TBL-1-1" /></colgroup><tr
|
||||
style="vertical-align:baseline;" id="TBL-1-1-"><td style="white-space:normal; text-align:left;" id="TBL-1-1-1"
|
||||
class="td00"><span
|
||||
class="cmbx-12">Bastian Gruber</span> </td></tr><tr
|
||||
style="vertical-align:baseline;" id="TBL-1-2-"><td style="white-space:normal; text-align:left;" id="TBL-1-2-1"
|
||||
class="td00">  </td>
|
||||
</tr><tr
|
||||
style="vertical-align:baseline;" id="TBL-1-3-"><td style="white-space:normal; text-align:left;" id="TBL-1-3-1"
|
||||
class="td00">  </td></tr></table> </div>
|
||||
<table class="center-addresses"><tr><td class="first-address"><!--tex4ht:inline--><div class="tabular"> <table id="TBL-2" class="tabular"
|
||||
|
||||
><colgroup id="TBL-2-1g"><col
|
||||
id="TBL-2-1" /></colgroup><tr
|
||||
style="vertical-align:baseline;" id="TBL-2-1-"><td style="white-space:normal; text-align:left;" id="TBL-2-1-1"
|
||||
class="td00"><span
|
||||
class="cmbx-10">Professional </span> </td>
|
||||
</tr><tr
|
||||
style="vertical-align:baseline;" id="TBL-2-2-"><td style="white-space:normal; text-align:left;" id="TBL-2-2-1"
|
||||
class="td00">LinkedIn: <a href="https://linkedin.com/in/bastiangruber">linkedin.com/in/bastiangruber</a> </td>
|
||||
</tr><tr
|
||||
style="vertical-align:baseline;" id="TBL-2-3-"><td style="white-space:normal; text-align:left;" id="TBL-2-3-1"
|
||||
class="td00">Book: <a href="https://rustwebdevelopment.com">rustwebdevelopment.com</a>  </td>
|
||||
</tr><tr
|
||||
style="vertical-align:baseline;" id="TBL-2-4-"><td style="white-space:normal; text-align:left;" id="TBL-2-4-1"
|
||||
class="td00">E-Mail: <a href="mailto:gruberbastian@me.com">gruberbastian@me.com</a>  </td>
|
||||
</tr><tr
|
||||
style="vertical-align:baseline;" id="TBL-2-5-"><td style="white-space:normal; text-align:left;" id="TBL-2-5-1"
|
||||
class="td00">Website: <a href="https://bastiangruber.ca">bastiangruber.ca</a>  </td></tr></table> </div></td><td class="second-address"><!--tex4ht:inline--><div class="tabular"> <table id="TBL-3" class="tabular"
|
||||
|
||||
><colgroup id="TBL-3-1g"><col
|
||||
id="TBL-3-1" /></colgroup><tr
|
||||
style="vertical-align:baseline;" id="TBL-3-1-"><td style="white-space:normal; text-align:left;" id="TBL-3-1-1"
|
||||
class="td00"><span
|
||||
class="cmbx-10">Code </span> </td>
|
||||
</tr><tr
|
||||
style="vertical-align:baseline;" id="TBL-3-2-"><td style="white-space:normal; text-align:left;" id="TBL-3-2-1"
|
||||
class="td00">GitHub: <a href="https://github.com/gruberb">github.com/gruberb</a>  </td>
|
||||
</tr><tr
|
||||
style="vertical-align:baseline;" id="TBL-3-3-"><td style="white-space:normal; text-align:left;" id="TBL-3-3-1"
|
||||
class="td00">Git: <a href="https://code.novanexus.ca/gruberb">code.novanexus.ca/gruberb</a> </td></tr></table> </div></td></tr></table>
|
||||
<h4 class="sectionHead"><a
|
||||
id="x1-10000"></a><div
|
||||
class="centerline"> SUMMARY </div></h4><div class="section">
|
||||
<!--l. 55--><p class="noindent" >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.
|
||||
</p>
|
||||
</div><h4 class='sectionHead' id='skills'><a id='x1-20000'></a><div class='centerline'> SKILLS </div></h4><div class='section'>
|
||||
<!-- l. 68 --><p class='noindent'><span class='cmbx-10'>Languages: </span>Rust, Python, TypeScript, JavaScript, Go <br class='newline' /><span class='cmbx-10'>Frontend: </span>React, Angular, Vue.js <br class='newline' /><span class='cmbx-10'>Backend: </span>Rust (Actix, Warp, Axum), Python (FastAPI), Node.js, Go <br class='newline' /><span class='cmbx-10'>Patterns: </span>REST, GraphQL, gRPC, async Rust, distributed systems (P2P) <br class='newline' /><span class='cmbx-10'>Infrastructure: </span>AWS, Google Cloud, Docker, Kubernetes, CI/CD, Grafana <br class='newline' /><span class='cmbx-10'>Domains: </span>Systems Programming, FFI, Distributed Systems, Web Services, Micro Services, IoT, Blockchain,
|
||||
Firefox
|
||||
</div><h4 class="sectionHead"><a
|
||||
id="x1-20000"></a><div
|
||||
class="centerline"> SKILLS </div></h4><div class="section">
|
||||
<!--l. 68--><p class="noindent" ><span
|
||||
class="cmbx-10">Languages: </span>Rust, C++, Python, TypeScript, Go <br
|
||||
class="newline" /><span
|
||||
class="cmbx-10">Backend & Systems: </span>Rust (Actix, Warp, Axum), Python (FastAPI), Node.js, async Rust, FFI/UniFFI
|
||||
<br
|
||||
class="newline" /><span
|
||||
class="cmbx-10">Patterns: </span>REST, GraphQL, gRPC, distributed systems (P2P), microservices <br
|
||||
class="newline" /><span
|
||||
class="cmbx-10">Infrastructure: </span>AWS, Google Cloud, Docker, Kubernetes, CI/CD, Grafana <br
|
||||
class="newline" /><span
|
||||
class="cmbx-10">AI Tooling: </span>Claude Code, GitHub Copilot
|
||||
</p>
|
||||
</div><h4 class='sectionHead' id='professional-experience'><a id='x1-30000'></a><div class='centerline'> PROFESSIONAL EXPERIENCE </div></h4><div class='section'>
|
||||
<!-- Mozilla -->
|
||||
<p class='noindent'><span class='cmsl-10'>Staff Software Engineer - Full-time </span>February 2026 - Now
|
||||
<br class='newline' /><span class='cmsl-10'>Senior Software Engineer - Full-time </span>July 2024 - January 2026
|
||||
<br class='newline' /><span class="company">Mozilla</span>, Remote <br class='newline' />Shipping Rust, C++, and Python code across Firefox desktop and mobile to hundreds of millions of users. All work is open source.
|
||||
</p>
|
||||
<ul class='itemize1'>
|
||||
<li class='itemize'>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
|
||||
</li>
|
||||
<li class='itemize'>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
|
||||
</li>
|
||||
<li class='itemize'>Maintained Firefox Push notification service (50k requests/second, sub-200ms latency): reduced memory footprint, added circuit breakers, and built Grafana dashboards for operational visibility
|
||||
</li>
|
||||
<li class='itemize'>Contributor and code reviewer for UniFFI, Mozilla’s multi-language bindings generator enabling Rust code to be called from Kotlin, Swift, Python, and JavaScript
|
||||
</li>
|
||||
<li class='itemize'>Built Rust extensions for Merino (Python/FastAPI service powering Firefox Suggest); wrote RFCs, mapped out project plans, and surfaced cross-team blockers early
|
||||
</li>
|
||||
<li class='itemize'>Led “Rusty Fridays” internal education sessions, guiding engineers through Rust adoption and mentoring junior contributors across teams</li></ul>
|
||||
</div><h4 class="sectionHead"><a
|
||||
id="x1-30000"></a><div
|
||||
class="centerline"> PROFESSIONAL EXPERIENCE </div></h4><div class="section">
|
||||
<!--l. 86--><p class="noindent" ><span
|
||||
class="cmsl-10">Staff Software Engineer (promoted from Senior) </span>July 2024 - Present
|
||||
<br
|
||||
class="newline" /><span class="company">Mozilla</span>, Remote <br
|
||||
class="newline" /></p>
|
||||
<ul class="itemize1">
|
||||
<li class="itemize">
|
||||
<!--l. 89--><p class="noindent" >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
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 90--><p class="noindent" >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
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 91--><p class="noindent" >Maintained Firefox Push notification service (50k req/s, sub-200ms latency): reduced memory footprint,
|
||||
added circuit breakers, built Grafana dashboards
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 92--><p class="noindent" >Contributor and code reviewer for UniFFI, Mozilla’s multi-language bindings generator (Rust to Kotlin,
|
||||
|
||||
<!-- Toposware -->
|
||||
<p class='noindent'><span class='cmsl-10'>Senior Systems Engineer, Team Lead - Full-time </span>April 2023 - June 2024
|
||||
<br class='newline' /><span class="company">Toposware</span>, Remote <br class='newline' />Core team of 4 building a peer-to-peer distributed network protocol from scratch in Rust.</p>
|
||||
<ul class='itemize1'>
|
||||
<li class='itemize'>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
|
||||
</li>
|
||||
<li class='itemize'>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
|
||||
</li>
|
||||
<li class='itemize'>Rewrote the CLI from scratch, replacing error-prone CLI parameters with local config files – reduced operator misconfiguration during node setup
|
||||
</li>
|
||||
<li class='itemize'>Built an EVM bridge connecting external Ethereum-compatible chains to the core network
|
||||
</li>
|
||||
<li class='itemize'>Set up load testing, CI/CD pipelines, and Grafana dashboards for production observability</li></ul>
|
||||
Swift, Python, JavaScript)
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 93--><p class="noindent" >Led “Rusty Fridays” internal education sessions, mentoring engineers across teams through Rust
|
||||
adoption</p></li></ul>
|
||||
<!--l. 96--><p class="noindent" ><span
|
||||
class="cmsl-10">Senior Systems Engineer, Team Lead </span>2023 - 2024
|
||||
<br
|
||||
class="newline" /><span class="company">Toposware</span>, Remote <br
|
||||
class="newline" />Core team of 4 building a peer-to-peer distributed network protocol from scratch in Rust. </p>
|
||||
<ul class="itemize1">
|
||||
<li class="itemize">
|
||||
<!--l. 100--><p class="noindent" >Achieved 10x throughput per node by profiling the actual bottleneck – optimized batch processing and
|
||||
serialization paths rather than redesigning the consensus layer
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 101--><p class="noindent" >Led benchmark initiative that revealed nodes were compute-bound on crypto operations, not
|
||||
network-limited – redirected optimization effort accordingly
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 102--><p class="noindent" >Built an EVM bridge connecting external Ethereum-compatible chains to the core network</p></li></ul>
|
||||
<!--l. 105--><p class="noindent" ><span
|
||||
class="cmsl-10">Senior Software Engineer </span>2022 - 2023
|
||||
<br
|
||||
class="newline" /><span class="company">Centrifuge</span>, Remote <br
|
||||
class="newline" />Protocol team building DeFi applications on Substrate/Polkadot in Rust. </p>
|
||||
<ul class="itemize1">
|
||||
<li class="itemize">
|
||||
<!--l. 109--><p class="noindent" >Implemented on-chain fund pool mutations – core feature for the lending protocol enabling live capital
|
||||
allocation adjustments
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 110--><p class="noindent" >Replaced manual documentation with CI-driven auto-generation from Rust source – eliminated
|
||||
persistent drift between code and public docs</p></li></ul>
|
||||
<!--l. 113--><p class="noindent" ><span
|
||||
class="cmsl-10">Author, “Rust Web Development” </span>2020 - 2022
|
||||
<br
|
||||
class="newline" /><span class="company">Manning Publications</span> <br
|
||||
class="newline" />Published end-to-end guide covering async Rust, web frameworks, and production deployment.
|
||||
</p><!--l. 119--><p class="noindent" ><span
|
||||
class="cmsl-10">Sr. Solutions Architect (promoted from SA) </span>2020 - 2022
|
||||
<br
|
||||
class="newline" /><span class="company">Twilio Inc.</span>, Remote <br
|
||||
class="newline" /></p>
|
||||
<ul class="itemize1">
|
||||
<li class="itemize">
|
||||
<!--l. 122--><p class="noindent" >Technical lead for Fortune 500 engagements: debugged latency issues, redesigned messaging flows,
|
||||
advised on architectures matching client team size and resources
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 123--><p class="noindent" >Created reusable engagement playbooks adopted across the EMEA Professional Services team</p></li></ul>
|
||||
|
||||
<!-- Centrifuge -->
|
||||
<p class='noindent'><span class='cmsl-10'>Senior Software Engineer - Full-time </span>August 2022 - February 2023
|
||||
<br class='newline' /><span class="company">Centrifuge</span>, Remote <br class='newline' />Protocol team building DeFi applications on Substrate/Polkadot in a self-governed organization.</p>
|
||||
<ul class='itemize1'>
|
||||
<li class='itemize'>Implemented fund pool mutations on-chain, enabling users to adjust capital allocations in live pools – core feature for the lending protocol
|
||||
</li>
|
||||
<li class='itemize'>Built client-facing APIs on top of fund pools, giving external integrators programmatic access to pool operations
|
||||
</li>
|
||||
<li class='itemize'>Replaced manual documentation with CI-driven auto-generation from Rust source on every PR – eliminated persistent drift between code and public docs
|
||||
</li>
|
||||
<li class='itemize'>Co-authored RFCs to build consensus on new protocol features across the decentralized team</li></ul>
|
||||
|
||||
<!-- Manning -->
|
||||
<p class='noindent'><span class='cmsl-10'>Author of “Rust Web Development” </span>October 2020 - December 2022
|
||||
<br class='newline' /><span class="company">Manning Publications</span>, Remote</p>
|
||||
<ul class='itemize1'>
|
||||
<li class='itemize'>Published “Rust Web Development” through Manning – end-to-end guide covering async Rust, web frameworks, and production deployment, distributed globally</li></ul>
|
||||
|
||||
<!-- Twilio -->
|
||||
<p class='noindent'><span class='cmsl-10'>Sr. Solutions Architect (Professional Services) - Full-time </span>May 2021 - July 2022
|
||||
<br class='newline' /><span class='cmsl-10'>Solutions Architect (Professional Services) - Full-time </span>June 2020 - May 2021
|
||||
<br class='newline' /><span class="company">Twilio Inc.</span>, Remote <br class='newline' />Second Solutions Architect hired for the new EMEA Professional Services team. Led enterprise integrations across contact center, messaging, and voice products.
|
||||
</p>
|
||||
<ul class='itemize1'>
|
||||
<li class='itemize'>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
|
||||
</li>
|
||||
<li class='itemize'>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
|
||||
</li>
|
||||
<li class='itemize'>Created reusable engagement playbooks (setup checklists, edge-case discovery questions, technical review templates) adopted across the EMEA team
|
||||
</li>
|
||||
<li class='itemize'>Hired and onboarded engineers to scale the Professional Services team</li></ul>
|
||||
|
||||
<!-- Kraken -->
|
||||
<p class='noindent'><span class='cmsl-10'>Systems Engineer - Contract </span>August 2019 - May 2020
|
||||
<br class='newline' /><span class="company">Kraken Digital Currency Exchange</span>, Remote (San Francisco)<br class='newline' />Member of the first Rust engineering team (12 engineers), replacing core banking infrastructure and API gateway.</p>
|
||||
<ul class='itemize1'>
|
||||
<li class='itemize'>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
|
||||
</li>
|
||||
<li class='itemize'>Built new Rust services from scratch with comprehensive test coverage and security-first design
|
||||
</li>
|
||||
<li class='itemize'>Worked directly with the CTO on privacy-focused architectural decisions for the trading platform</li></ul>
|
||||
|
||||
<!-- Self Employed -->
|
||||
<p class='noindent'><span class='cmsl-10'>Rust Developer - Freelance </span>March 2019 - July 2019
|
||||
<br class='newline' /><span class="company">Self Employed</span>, Berlin/Toronto</p>
|
||||
<ul class='itemize1'>
|
||||
<li class='itemize'>Founded the monthly “Rust & Tell Berlin” meetup – grew it into the largest Rust meetup globally, still running years later
|
||||
</li>
|
||||
<li class='itemize'>Contributed to Rust core and ecosystem libraries
|
||||
</li>
|
||||
<li class='itemize'>Created Rust learning resources specifically for Node.js developers transitioning to systems programming</li></ul>
|
||||
|
||||
<!-- Freelance -->
|
||||
<p class='noindent'><span class='cmsl-10'>Sr. Software Engineer - Freelance </span>March 2016 - February 2019
|
||||
<br class='newline' /><span class="company">OSRAM</span>, <span class="company">Körber Digital</span>, <span class="company">Avenga</span>, <span class="company">ERGO Group</span>, <span class="company">GIATA</span>, <span class="company">PaperHive</span>, <span class="company">Glispa</span> (Berlin) <br class='newline' />Freelance consultant for enterprise clients across IoT, logistics, tourism, and ad-tech.</p>
|
||||
<ul class='itemize1'>
|
||||
<li class='itemize'>Designed authentication infrastructure for <span class="company">OSRAM</span>’s IoT platform (thousands of connected lighting devices) using Keycloak for user auth and service-to-service auth across microservices (Node.js, Go, Lua)
|
||||
</li>
|
||||
<li class='itemize'>First engineering hire at <span class="company">Körber Digital</span>: chose Node.js/React/AWS stack, built real-time data pipelines with a time-series database optimized for fast retrieval of sensor data
|
||||
</li>
|
||||
<li class='itemize'>Decomposed <span class="company">GIATA</span>’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
|
||||
</li>
|
||||
<li class='itemize'>Tech Lead at <span class="company">Avenga</span>: introduced Scrum and refactored a monolith into microservices to unblock parallel team development
|
||||
</li>
|
||||
<li class='itemize'>Built analytics dashboards and ad platforms at <span class="company">Glispa</span> (AngularJS); mentored teams on modern JavaScript practices</li></ul>
|
||||
|
||||
<!-- smartB -->
|
||||
<p class='noindent'><span class='cmsl-10'>Software Engineer - Full-time </span>August 2015 - February 2016
|
||||
<br class='newline' /><span class="company">smartB Energy Management GmbH</span>, Berlin <br class='newline' />Small agile team building energy monitoring applications for business owners.
|
||||
</p>
|
||||
<ul class='itemize1'>
|
||||
<li class='itemize'>Introduced pair programming and component-based frontend architecture, enabling multiple developers to work on the same codebase without conflicts
|
||||
</li>
|
||||
<li class='itemize'>Full-stack development with JavaScript and Python using TDD</li></ul>
|
||||
|
||||
<!-- blogfoster -->
|
||||
<p class='noindent'><span class='cmsl-10'>Software Engineer - Freelance </span>March 2015 - July 2015
|
||||
<br class='newline' /><span class="company">blogfoster GmbH</span>, Berlin <br class='newline' />First developer hired to replace legacy PHP/Backbone application with Node.js and React.</p>
|
||||
<ul class='itemize1'>
|
||||
<li class='itemize'>Built the first version of the ad marketplace; co-designed architecture with the CTO using TDD from day one</li></ul>
|
||||
|
||||
<!-- Dalia -->
|
||||
<p class='noindent'><span class='cmsl-10'>Frontend Developer - Full-time </span>February 2014 - March 2015
|
||||
<br class='newline' /><span class="company">Dalia Research</span>, Berlin <br class='newline' />First and sole frontend developer at 8-person startup.</p>
|
||||
<ul class='itemize1'>
|
||||
<li class='itemize'>Bootstrapped the customer-facing survey platform and analytics dashboards in AngularJS – core UI remained largely untouched in production for close to 10 years</li></ul>
|
||||
|
||||
</div><h4 class='sectionHead' id='education'><a id='x1-40000'></a><div class='centerline'> EDUCATION </div></h4><div class='section'>
|
||||
<p class='noindent'><span class='cmsl-10'>Bachelor of Science, Computer Science </span>September 2010 - February 2014
|
||||
<br class='newline' /><span class="company">TH Ingolstadt</span><br class='newline' />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.
|
||||
<!--l. 126--><p class="noindent" ><span
|
||||
class="cmsl-10">Systems Engineer </span>2019 - 2020
|
||||
<br
|
||||
class="newline" /><span class="company">Kraken Digital Currency Exchange</span>, Remote <br
|
||||
class="newline" /></p>
|
||||
<ul class="itemize1">
|
||||
<li class="itemize">
|
||||
<!--l. 129--><p class="noindent" >Migrated core banking services and API gateway from PHP to Rust, achieving 100x throughput
|
||||
improvement – enabling order-of-magnitude traffic growth without scaling hardware
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 130--><p class="noindent" >Worked directly with the CTO on privacy-focused architectural decisions for the trading platform</p></li></ul>
|
||||
<!--l. 135--><p class="noindent" ><span
|
||||
class="cmsl-10">Earlier Career </span>2014 - 2019
|
||||
<br
|
||||
class="newline" />Sr. Software Engineer across enterprise clients (<span class="company">OSRAM</span>, Körber Digital, <span class="company">GIATA</span>, <span class="company">Avenga</span>) and startups (Dalia
|
||||
Research, blogfoster, smartB) in Berlin. </p>
|
||||
<ul class="itemize1">
|
||||
<li class="itemize">
|
||||
<!--l. 138--><p class="noindent" >Founded “Rust & Tell Berlin” meetup – grew it into the largest Rust meetup globally, still running
|
||||
years later
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 139--><p class="noindent" >Designed IoT authentication infrastructure at <span class="company">OSRAM</span> for thousands of connected devices (Node.js,
|
||||
Go, Lua)
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 140--><p class="noindent" >First engineering hire at Körber Digital: built real-time sensor data pipelines on AWS
|
||||
</p></li>
|
||||
<li class="itemize">
|
||||
<!--l. 141--><p class="noindent" >Decomposed <span class="company">GIATA</span>’s monolithic ERP into 6 Docker-based microservices, improving system scalability</p></li></ul>
|
||||
</div><h4 class="sectionHead"><a
|
||||
id="x1-40000"></a><div
|
||||
class="centerline"> EDUCATION </div></h4><div class="section">
|
||||
<!--l. 148--><p class="noindent" ><span
|
||||
class="cmsl-10">Bachelor of Science, Computer Science </span><br
|
||||
class="newline" /><span class="company">TH Ingolstadt</span> – Scholarship from Allianz Deutschland AG (fully funded)
|
||||
</p>
|
||||
</div></div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
11
resume.css
11
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%;}
|
||||
|
|
|
|||
BIN
resume.dvi
BIN
resume.dvi
Binary file not shown.
BIN
resume.idv
BIN
resume.idv
Binary file not shown.
11
resume.lg
11
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%;}
|
||||
|
|
|
|||
444
resume.log
444
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 <?xml version=...?> 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
|
||||
</Users/bastian/Library/texlive/2026basic/texmf-var/fonts/pk/ljfour/jknappen
|
||||
/ec/tcrm1000.600pk></usr/local/texlive/2026basic/texmf-dist/fonts/type1/public/
|
||||
amsfonts/cm/cmbx10.pfb></usr/local/texlive/2026basic/texmf-dist/fonts/type1/pub
|
||||
lic/amsfonts/cm/cmbx12.pfb></usr/local/texlive/2026basic/texmf-dist/fonts/type1
|
||||
/public/amsfonts/cm/cmr10.pfb></usr/local/texlive/2026basic/texmf-dist/fonts/ty
|
||||
pe1/public/amsfonts/cm/cmsl10.pfb>
|
||||
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).
|
||||
|
|
|
|||
BIN
resume.pdf
BIN
resume.pdf
Binary file not shown.
121
resume.tex
121
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)
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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}%
|
||||
|
|
|
|||
Loading…
Reference in a new issue