Add CTA to the website when page is printed as PDF

This commit is contained in:
doylet
2026-08-31 17:17:19 +10:00
parent b071f19362
commit 22318601f6
+234 -227
View File
@@ -56,24 +56,30 @@
.favicon { height: 16px; vertical-align: text-bottom; padding-left: 0.5em; padding-right: 0.5em; } .favicon { height: 16px; vertical-align: text-bottom; padding-left: 0.5em; padding-right: 0.5em; }
.bullet-points { list-style: circle; margin-left: 1.5rem; } .bullet-points { list-style: circle; margin-left: 1.5rem; }
@media print { /*
.pagebreak { Helper classes for printing to PDF. A class with `print-show` will only show up in in
page-break-before: always; printing mode. `print-hide` will hide the tagged class when in printing mode.
} */
} @media screen { .print-show { display: none; } }
@media print { .print-hide { display: none; } }
</style> </style>
</head> </head>
<body> <body>
<header> <header>
<div> <div>
<h1>doylet <em class=title-note>// doy-lee</em></h1> <h1>doylet <em class=title-note>// doy-lee</em></h1>
<p>Low-level programmer since 2016. Uses C/C++ often. Passion for tools, privacy & game technology. Curious & learning every day.</p> <p>Low-level programmer since 2016. Uses C/C++ often. Passion for tools, privacy & game technology. Curious & learning every day.</p>
</div> </div>
</header> </header>
<main> <main>
<section class="print-show" aria-label="Redirect to website">
<div><hr></div>
<div style="font-size: 1.1em; text-align: center;">
Visit <em>https://doylet.dev</em> for comfortable viewing of this resume with videos and more projects. Thanks!
</div>
</section>
<div><hr></div> <div><hr></div>
<section aria-label="About"> <section aria-label="About">
<h2>About</h2> <h2>About</h2>
@@ -410,7 +416,7 @@
<li>Cross-Platform (Win32/Emscripten)</li> <li>Cross-Platform (Win32/Emscripten)</li>
</ul> </ul>
<table> <table>
<tr> <tr class="print-hide">
<td><img src="assets/projects_tely_0.jpg"></td> <td><img src="assets/projects_tely_0.jpg"></td>
</tr> </tr>
<tr> <tr>
@@ -480,236 +486,237 @@
</p> </p>
</div> </div>
<h3>Archived</h3> <section aria-label="Archived">
<div> <h3>Archived</h3>
<p class=job-role style="border-color: #E8976B">2024 - 2025: Liquid++ (Closed Source)</p> <div>
<ul class=keywords-list> <p class=job-role style="border-color: #E8976B">2024 - 2025: Liquid++ (Closed Source)</p>
<li>C style C++</li> <ul class=keywords-list>
<li>Chainflip</li> <li>C style C++</li>
<li>Market Making</li> <li>Chainflip</li>
<li>ImGui</li> <li>Market Making</li>
<li>Sokol</li> <li>ImGui</li>
<li>SQLite</li> <li>Sokol</li>
<li>Backend</li> <li>SQLite</li>
</ul> <li>Backend</li>
<table>
<tr><td><img src="assets/projects_liquidpp.png"></td></tr>
</table>
<p>
A market-making bot written in C++ for Chainflip, a decentralised cross-chain exchange.
The bot provides liquidity by placing limit orders on Chainflip's concentrated liquidity
AMM, then hedges directional exposure by taking opposing perpetual positions on
Hyperliquid. It pulls price data from Bybit as a secondary oracle to inform pricing.
</p>
<p>
The system connects to three exchanges simultaneously via WebSocket, each with dedicated
rate limiters and staleness detection to prevent trading on stale data. Orders are priced
using the external mid-price plus a configurable profit margin, and a kill-order is
scheduled for the next block to cancel unfilled orders before they can be picked up at an
unfavourable price.
</p>
<p>
It has hot-reload DLL support, a platform layer (Sokol) separates business logic into a
reloadable DLL. Dear ImGui is used for monitoring positions, order fills, and exchange
connectivity. A separate web dashboard server (CivetWeb) publishes binary heartbeats over
WebSocket for remote monitoring in a browser.
</p>
</div>
<div>
<p class=job-role style="border-color: #E8749E">2023: Terry Cherry <a href="https://game.doylet.dev/terry_cherry/">game.doylet.dev/terry_cherry/</a></p>
<ul class=keywords-list>
<li>C style C++</li>
<li>Raylib</li>
<li>Emscripten</li>
<li>2D Tower Defence-Esque</li>
</ul>
<table>
<tr>
<td><img src="assets/projects_terry_cherry_1.jpg"></td>
<td><img src="assets/projects_terry_cherry_0.jpg"></td>
</tr>
</table>
<p>
A 2-player local co-op top-down tower defence game developed over 4 weekends in a game
jam. Players defend "Terry's Heart" from waves of love-themed enemies (catfish, smoochie
teleporters, and clinger dashers) that march along waypoint paths toward the base.
</p>
<p>
Players earn coins by defeating enemies and purchase upgrades or buildings from the
storefronts. A pub that slows enemies, a church that converts them to allies and an
airport that flies them to the back of the queue. Monkey totems spawn periodically which
can disable enemy portals when delivered to them shutting them down permanently to win.
</p>
<p>
The engine features a tree-based entity system with generation-indexed
handles[<a href="projects-terry-cherry-handles">1</a>] to prevent use-after-free bugs,
fixed-timestep physics with swept AABB collision and a waypoint path-finding system. Built
on Raylib with a custom C++ meta-build system, hot-reload DLL support, and an Emscripten
web build targeting WebGL.
</p>
<small>
<ul class=citations>
<li>Source Code <a href="https://git.doylet.dev/doylet/feely_pona">git.doylet.dev/doylet/feely_pona</a></li>
<li>[1] Handles are the better pointers <a href="https://floooh.github.io/2018/06/17/handles-vs-pointers.html">floooh.github.io/2018/06/17/handles-vs-pointers.html</a></li>
</ul> </ul>
</small> <table>
</div> <tr><td><img src="assets/projects_liquidpp.png"></td></tr>
</table>
<p>
A market-making bot written in C++ for Chainflip, a decentralised cross-chain exchange.
The bot provides liquidity by placing limit orders on Chainflip's concentrated liquidity
AMM, then hedges directional exposure by taking opposing perpetual positions on
Hyperliquid. It pulls price data from Bybit as a secondary oracle to inform pricing.
</p>
<p>
The system connects to three exchanges simultaneously via WebSocket, each with dedicated
rate limiters and staleness detection to prevent trading on stale data. Orders are priced
using the external mid-price plus a configurable profit margin, and a kill-order is
scheduled for the next block to cancel unfilled orders before they can be picked up at an
unfavourable price.
</p>
<p>
It has hot-reload DLL support, a platform layer (Sokol) separates business logic into a
reloadable DLL. Dear ImGui is used for monitoring positions, order fills, and exchange
connectivity. A separate web dashboard server (CivetWeb) publishes binary heartbeats over
WebSocket for remote monitoring in a browser.
</p>
</div>
<div> <div>
<p class=job-role style="border-color: #C4A35A">2020: intc Software u128/256 bit port to C <a href="https://git.doylet.dev/doylet/intc">git.doylet.dev/doylet/intc</a></p> <p class=job-role style="border-color: #E8749E">2023: Terry Cherry <a href="https://game.doylet.dev/terry_cherry/">game.doylet.dev/terry_cherry/</a></p>
<ul class=keywords-list> <ul class=keywords-list>
<li>C99/C++</li> <li>C style C++</li>
<li>Open Source</li> <li>Raylib</li>
<li>Single File Library Port</li> <li>Emscripten</li>
</ul> <li>2D Tower Defence-Esque</li>
<p>
intc is a port of calccrypto's uint128/256 library into a single header file library to
allow u128/256 calculations. This port is primarily C first and provides C++ helpers like
operator overloads that are opt in.
</p>
<small>
<ul class=citations>
<li>calccrypto's uint256_t <a href="https://github.com/calccrypto/uint256_t">github.com/calccrypto/uint256_t</a></li>
</ul> </ul>
</small> <table>
</div> <tr>
<td><img src="assets/projects_terry_cherry_1.jpg"></td>
<td><img src="assets/projects_terry_cherry_0.jpg"></td>
</tr>
</table>
<p>
A 2-player local co-op top-down tower defence game developed over 4 weekends in a game
jam. Players defend "Terry's Heart" from waves of love-themed enemies (catfish, smoochie
teleporters, and clinger dashers) that march along waypoint paths toward the base.
</p>
<p>
Players earn coins by defeating enemies and purchase upgrades or buildings from the
storefronts. A pub that slows enemies, a church that converts them to allies and an
airport that flies them to the back of the queue. Monkey totems spawn periodically which
can disable enemy portals when delivered to them shutting them down permanently to win.
</p>
<p>
The engine features a tree-based entity system with generation-indexed
handles[<a href="projects-terry-cherry-handles">1</a>] to prevent use-after-free bugs,
fixed-timestep physics with swept AABB collision and a waypoint path-finding system. Built
on Raylib with a custom C++ meta-build system, hot-reload DLL support, and an Emscripten
web build targeting WebGL.
</p>
<small>
<ul class=citations>
<li>Source Code <a href="https://git.doylet.dev/doylet/feely_pona">git.doylet.dev/doylet/feely_pona</a></li>
<li>[1] Handles are the better pointers <a href="https://floooh.github.io/2018/06/17/handles-vs-pointers.html">floooh.github.io/2018/06/17/handles-vs-pointers.html</a></li>
</ul>
</small>
</div>
<div> <div>
<p class=job-role style="border-color: #9B8EC4">2020: RaylibSIMD SIMD Software rendering in C <a href="https://git.doylet.dev/doylet/RaylibSIMD">git.doylet.dev/doylet/RaylibSIMD</a></p> <p class=job-role style="border-color: #C4A35A">2020: intc Software u128/256 bit port to C <a href="https://git.doylet.dev/doylet/intc">git.doylet.dev/doylet/intc</a></p>
<ul class=keywords-list> <ul class=keywords-list>
<li>C99</li> <li>C99/C++</li>
<li>SSE2</li> <li>Open Source</li>
<li>Graphics Programming</li> <li>Single File Library Port</li>
</ul>
<p>
Raylib is a game-engine by Raysan5 whose main focus is to make game engine programming
simple and enjoyable. In this project, I rewrote the software-rendering routine to use
SSE2/3 instructions to attain the expected 4x speed-up by taking advantage of
data-parallelism offered by SIMD.
</p>
<small>
<ul class=citations>
<li>Raylib Website <a href="https://raylib.com/">raylib.com</a></li>
</ul> </ul>
</small> <p>
</div> intc is a port of calccrypto's uint128/256 library into a single header file library to
allow u128/256 calculations. This port is primarily C first and provides C++ helpers like
operator overloads that are opt in.
</p>
<small>
<ul class=citations>
<li>calccrypto's uint256_t <a href="https://github.com/calccrypto/uint256_t">github.com/calccrypto/uint256_t</a></li>
</ul>
</small>
</div>
<div> <div>
<p class=job-role style="border-color: #D4A574">2017: DTRenderer 3D Software rendering in C++ <a href="https://git.doylet.dev/doylet/DTRenderer">git.doylet.dev/doylet/DTRenderer</a></p> <p class=job-role style="border-color: #9B8EC4">2020: RaylibSIMD SIMD Software rendering in C <a href="https://git.doylet.dev/doylet/RaylibSIMD">git.doylet.dev/doylet/RaylibSIMD</a></p>
<table> <ul class=keywords-list>
<tr><td><img src="assets/projects_dtrenderer.gif"></td></tr> <li>C99</li>
</table> <li>SSE2</li>
<p> <li>Graphics Programming</li>
DTRenderer is an attempt to build a simple software renderer from the ground up. The main
goal is to build an intuitive understanding of graphics mathematics, rendering pipeline
and core concepts. It runs as a Win32 program with minimal dependencies.
</p>
<ul class=bullet-points>
<li>2D Software Rendering</li>
<li>Alpha Blending</li>
<li>Bilinear Filtering</li>
<li>Correct Color Space Pipeline (SRGB <-> Linear)</li>
<li>Rasterisation</li>
<li>Texture Mapping</li>
<li>Translation, Rotation, Scale</li>
<li>3D Software Rendering</li>
<li>Full Bright, Flat, Gouraud Shading</li>
<li>Orthographic, Perspective Projections</li>
<li>Custom Wavefront Obj Loader (minimal subset)</li>
<li>Hot Reloadable DLL for Renderer Code (taken from Handmade Hero)</li>
</ul>
</div>
<div>
<p class=job-role style="border-color: #E9B84D">2017: Math Masher Math game for mobile <a href="luneaustralia/">doylet.dev/luneaustralia</a></p>
<table>
<tr>
<td><img src="assets/projects_math_masher_screen_1.jpg"></td>
<td><img src="assets/projects_math_masher_screen_2.jpg"></td>
<td><img src="assets/projects_math_masher_screen_3.jpg"></td>
</tr>
</table>
<p>
Math Masher is a cross-platform mobile app that aims to teach basic arithmetic skills
including addition, subtraction and multiplication by gamifying the learning experience.
The app was developed in a team using the Cocos2DX framework in C++. My role in the
project is as the lead developer and assisting role with asset design.
</p>
<ul class=bullet-points>
<li>Project management (Trello, minutes meeting, code review etc.)</li>
<li>Game engine architecture (Gameplay, UI, shopping mechanics, debug)</li>
<li>Basic sound editing (Compressor, EQing, normalisation)</li>
<li>Asset designs (Creating graphical assets with Photoshop)</li>
</ul>
<small>
<ul class=citations>
<li>Trailer <a href="https://youtube.com/watch?v=AUozUZ8aY7g">youtube.com/watch?v=AUozUZ8aY7g</a></li>
</ul> </ul>
</small> <p>
</div> Raylib is a game-engine by Raysan5 whose main focus is to make game engine programming
simple and enjoyable. In this project, I rewrote the software-rendering routine to use
SSE2/3 instructions to attain the expected 4x speed-up by taking advantage of
data-parallelism offered by SIMD.
</p>
<small>
<ul class=citations>
<li>Raylib Website <a href="https://raylib.com/">raylib.com</a></li>
</ul>
</small>
</div>
<div> <div>
<p class=job-role style="border-color: #7FB5B0">2017: DCHIP8 Chip8 interpreter <a href="https://git.doylet.dev/doylet/dchip-8">git.doylet.dev/doylet/dchip-8</a></p> <p class=job-role style="border-color: #D4A574">2017: DTRenderer 3D Software rendering in C++ <a href="https://git.doylet.dev/doylet/DTRenderer">git.doylet.dev/doylet/DTRenderer</a></p>
<table> <table>
<tr> <tr><td><img src="assets/projects_dtrenderer.gif"></td></tr>
<td><img src="assets/projects_dchip8_screen_1.png"></td> </table>
<td><img src="assets/projects_dchip8_screen_2.png"></td> <p>
</tr> DTRenderer is an attempt to build a simple software renderer from the ground up. The main
</table> goal is to build an intuitive understanding of graphics mathematics, rendering pipeline
<p> DCHIP8 aims to emulate the CHIP8 architecture to better understand at a lower level and core concepts. It runs as a Win32 program with minimal dependencies.
operations between memory, cpu, input and output.</p> </p>
<ul class=bullet-points> <ul class=bullet-points>
<li>Fetch, Decode, Execute Opcodes</li> <li>2D Software Rendering</li>
<li>Modelling memory, registers and basic CPU architecture</li> <li>Alpha Blending</li>
<li>Software Rendering and interaction with Win32</li> <li>Bilinear Filtering</li>
<li>Minimal dependencies, single file executable</li> <li>Correct Color Space Pipeline (SRGB <-> Linear)</li>
</ul> <li>Rasterisation</li>
<small> <li>Texture Mapping</li>
<ul class=citations> <li>Translation, Rotation, Scale</li>
<li>Specification Sheet <a href="http://devernay.free.fr/hacks/chip8/C8TECH10.HTM">devernay.free.fr/hacks/chip8/C8TECH10.HTM</a></li> <li>3D Software Rendering</li>
<li>Full Bright, Flat, Gouraud Shading</li>
<li>Orthographic, Perspective Projections</li>
<li>Custom Wavefront Obj Loader (minimal subset)</li>
<li>Hot Reloadable DLL for Renderer Code (taken from Handmade Hero)</li>
</ul> </ul>
</small> </div>
</div>
<div> <div>
<p class=job-role style="border-color: #C49A6C">2016: Dengine 2D engine for asteroids <a href="https://git.doylet.dev/doylet/dengine">git.doylet.dev/doylet/dengine</a></p> <p class=job-role style="border-color: #E9B84D">2017: Math Masher Math game for mobile <a href="luneaustralia/">doylet.dev/luneaustralia</a></p>
<table> <table>
<tr> <tr>
<td><img src="assets/projects_dengine_screen_1.png"></td> <td><img src="assets/projects_math_masher_screen_1.jpg"></td>
<td><img src="assets/projects_dengine_demo.gif"></td> <td><img src="assets/projects_math_masher_screen_2.jpg"></td>
</tr> <td><img src="assets/projects_math_masher_screen_3.jpg"></td>
</table> </tr>
<p> </table>
Dengine is a solo project, 2D game engine developed with OpenGL and low-level libraries in <p>
C. The main goal of Dengine is to facilitate learning from many aspects of Computer Math Masher is a cross-platform mobile app that aims to teach basic arithmetic skills
Science. Alongside Dengine, Asteroids is being built which guides the development of including addition, subtraction and multiplication by gamifying the learning experience.
features for the game. Dengine is inspired by Handmade Hero, with a focus on developing as The app was developed in a team using the Cocos2DX framework in C++. My role in the
many features with minimal libraries, such that it is not too time-consuming and project is as the lead developer and assisting role with asset design.
counter-productive to do so. </p>
</p> <ul class=bullet-points>
<ul class=bullet-points> <li>Project management (Trello, minutes meeting, code review etc.)</li>
<li>Asset Management (load data into intermediate representations)</li> <li>Game engine architecture (Gameplay, UI, shopping mechanics, debug)</li>
<li>Audio API from OpenAL</li> <li>Basic sound editing (Compressor, EQing, normalisation)</li>
<li>Basic 2D Game Mathematics/Physics (Vector, Trig, Explicit Euler)</li> <li>Asset designs (Creating graphical assets with Photoshop)</li>
<li>Collision Detection (Single Axis Theorem, Minkowski Sum/Diff, AABB)</li>
<li>Debug Services & Displays</li>
<li>Entity Component Systems</li>
<li>IMGUI Systems</li>
<li>Input Parsing</li>
<li>Push-Buffer Memory Systems</li>
<li>Small Size Array Optimisations</li>
<li>Standard Library Replacements (e.g. atoi, strlen, itoa, string)</li>
<li>Texture Atlas Support, Runtime Font Packing</li>
<li>OpenGL 2D Rendering Pipeline & Batching Render Calls</li>
</ul>
<small>
<ul class=citations>
<li>Handmade Hero <a href="https://handmadehero.org/">handmadehero.org</a></li>
</ul> </ul>
</small> <small>
</div> <ul class=citations>
<li>Trailer <a href="https://youtube.com/watch?v=AUozUZ8aY7g">youtube.com/watch?v=AUozUZ8aY7g</a></li>
</ul>
</small>
</div>
<div>
<p class=job-role style="border-color: #7FB5B0">2017: DCHIP8 Chip8 interpreter <a href="https://git.doylet.dev/doylet/dchip-8">git.doylet.dev/doylet/dchip-8</a></p>
<table>
<tr>
<td><img src="assets/projects_dchip8_screen_1.png"></td>
<td><img src="assets/projects_dchip8_screen_2.png"></td>
</tr>
</table>
<p> DCHIP8 aims to emulate the CHIP8 architecture to better understand at a lower level
operations between memory, cpu, input and output.</p>
<ul class=bullet-points>
<li>Fetch, Decode, Execute Opcodes</li>
<li>Modelling memory, registers and basic CPU architecture</li>
<li>Software Rendering and interaction with Win32</li>
<li>Minimal dependencies, single file executable</li>
</ul>
<small>
<ul class=citations>
<li>Specification Sheet <a href="http://devernay.free.fr/hacks/chip8/C8TECH10.HTM">devernay.free.fr/hacks/chip8/C8TECH10.HTM</a></li>
</ul>
</small>
</div>
<div>
<p class=job-role style="border-color: #C49A6C">2016: Dengine 2D engine for asteroids <a href="https://git.doylet.dev/doylet/dengine">git.doylet.dev/doylet/dengine</a></p>
<table>
<tr>
<td><img src="assets/projects_dengine_screen_1.png"></td>
<td><img src="assets/projects_dengine_demo.gif"></td>
</tr>
</table>
<p>
Dengine is a solo project, 2D game engine developed with OpenGL and low-level libraries in
C. The main goal of Dengine is to facilitate learning from many aspects of Computer
Science. Alongside Dengine, Asteroids is being built which guides the development of
features for the game. Dengine is inspired by Handmade Hero, with a focus on developing as
many features with minimal libraries, such that it is not too time-consuming and
counter-productive to do so.
</p>
<ul class=bullet-points>
<li>Asset Management (load data into intermediate representations)</li>
<li>Audio API from OpenAL</li>
<li>Basic 2D Game Mathematics/Physics (Vector, Trig, Explicit Euler)</li>
<li>Collision Detection (Single Axis Theorem, Minkowski Sum/Diff, AABB)</li>
<li>Debug Services & Displays</li>
<li>Entity Component Systems</li>
<li>IMGUI Systems</li>
<li>Input Parsing</li>
<li>Push-Buffer Memory Systems</li>
<li>Small Size Array Optimisations</li>
<li>Standard Library Replacements (e.g. atoi, strlen, itoa, string)</li>
<li>Texture Atlas Support, Runtime Font Packing</li>
<li>OpenGL 2D Rendering Pipeline & Batching Render Calls</li>
</ul>
<small>
<ul class=citations>
<li>Handmade Hero <a href="https://handmadehero.org/">handmadehero.org</a></li>
</ul>
</small>
</div>
</section>
</section> </section>
</main> </main>