this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

cv: finished v1 version

+110 -106
+9
.claude/settings.local.json
··· 1 + { 2 + "permissions": { 3 + "allow": [ 4 + "Bash(typst compile:*)" 5 + ], 6 + "deny": [], 7 + "ask": [] 8 + } 9 + }
+29 -26
configuration.yaml
··· 1 1 contacts: 2 - name: Tim Chmielecki 3 - title: Systems Engineer 2 + name: TYMEK CHMIELECKI 3 + title: SYSTEMS ENGINEER 4 4 email: me@timchmielecki.com 5 5 address: Krakow, PL 6 6 location: Poland ··· 19 19 tagline: I am a systems engineer with a strong background in blockchain, cryptography, and P2P networking. Looking for a challenging role in backend engineering, with an interest in developing decentralized systems and solving scaling problems. In my spare time, I enjoy rock climbing, electronic/jazz music, and cooking. 20 20 21 21 jobs: 22 - - position: Blockchain-focused Systems Engineer 22 + - position: Systems Engineer 23 23 company: 24 24 name: TokenTax 25 25 link: "https://tokentax.co" 26 26 description: 27 - - Implemented e2e testing for crucial internal services, ensuring accurate tax calculation results. 28 - - Reduced database size by 99% and significantly improved response times on internal APIs by creating a second-generation data parsing system. 29 - - Increased block parsing throughput by 3-5x by introducing concurrent programming and optimizing transaction parsing in our Go codebase. 30 - - Gained extensive knowledge of the go-ethereum codebase, maintained multiple forked cryptocurrency nodes, and managed Kubernetes-based block-data parsing infrastructure. 31 - from: "09.2021" 32 - to: "present" 27 + - Joined as an early engineer and took ownership of the EVM data ingestion pipeline, operating and tuning full nodes for Ethereum, Polygon (Matic), BSC, etc., and iterating on how we index on-chain data for tax reporting 28 + - Designed a wallet-centric sync pipeline using chain explorer APIs and batched checkpoints across all EVM chains, replacing our full-chain indexer, cutting storage by ~99% and increasing ingestion throughput ~3× while reliably syncing 2k+ wallets/day (up to 100k tx per wallet) 29 + - Built an end-to-end regression harness that diffs per-wallet outputs between old and new pipelines, enabling a safe migration with no changes to user tax outcomes 30 + - Became the main Go specialist on the accounting backend, ported the regression harness into the accounting service and then rewrote core internals to work around legacy design constraints, reducing memory usage by 60–70% while continuously verifying that user-level tax results remained identical 31 + - Proposed and co-designed a new account-based data model for movements to align with updated IRS rules, then worked with the app backend team to implement it end-to-end (auto-labeling accounts across heterogeneous sources and computing per-account, day-by-day running balances) 32 + - Since mid-2025, leading the entire syncing layer (not just EVM), sunsetting the legacy Go-based pipeline and porting protocol-specific parsing into the TypeScript codebase using a forked Goldrush decoder, while mentoring two junior engineers and reviewing PRs with a focus on data correctness and observability 33 + from: "September 2021" 34 + to: "Ongoing" 33 35 location: New York, USA (Remote) 34 36 - position: Backend and DevOps Engineer 35 37 company: 36 38 name: HID Global 37 39 link: "https://www.hidglobal.com" 38 40 description: 39 - - Developed smart-card authentication mechanisms based on Assa Abloy SEOS (THEBE research project) 40 - - Initiated experimental project to develop HSM emulator in a Docker container running in a TEE, authored a Go library to expose functionality with an API 41 - from: "06.2019" 42 - to: "09.2021." 41 + - "Proposed and built a software HSM: Go/cgo wrapper over a C++ crypto library, exposed as a secure network service and deployed in Docker on AWS Nitro Enclaves, providing a middle ground between hardware HSMs and an unsecured software process, plus contributions to smart-card auth based on Assa Abloy SEOS." 42 + from: "June 2019" 43 + to: "September 2021" 43 44 location: Krakow, PL 44 45 - position: Full-stack developer 45 46 company: 46 47 name: APCD Diffusion 47 48 link: "" 48 49 description: 49 - - Developed a network of Raspberry Pis with external displays, allowing to upload and schedule ad transmissions through a web app, using Go for the back-end, Bootstrap4 for the front-end, and Python for Raspberry Pi programming. 50 - from: "01.2018." 51 - to: "01.2019." 50 + - Developed IoT network of Raspberry Pis with Go backend, Bootstrap4 frontend, and Python embedded programming for digital advertising displays 51 + from: "Jan 2018" 52 + to: "Jan 2019" 52 53 location: Paris, FR (Remote) 53 - - position: Volunteer computer science and mathematics teacher 54 + - position: Programming and Mathematics Tutor 54 55 company: 55 - name: Local hobby group 56 + name: Freelance/Local groups 56 57 link: "" 57 58 description: 58 - - Taught programming, basic algorithms, and mathematics to students aged 10-18, helping them develop analytical thinking skills and prepare for future computer science studies and final exams. 59 + - Taught programming fundamentals to kids aged 10-15 and provided paid mathematics tutoring for middle/high school exam preparation 59 60 from: "2017" 60 61 to: "2021" 61 62 location: Krakow, PL ··· 67 68 - Systems engineering and performance optimization 68 69 69 70 languages: 71 + - name: Polish 72 + level: native 70 73 - name: French 71 - level: 5 72 - note: native 73 - - name: Polish 74 - level: 5 75 - note: native 74 + level: native 76 75 - name: English 77 - level: 5 78 - note: "" 76 + level: C2 77 + - name: Spanish 78 + level: A2 79 + - name: Dutch 80 + level: A1 79 81 80 82 education: 81 83 - place: ··· 86 88 from: "09.2018" 87 89 to: "02.2022" 88 90 location: Krakow, PL 91 + thesis: "Bachelor thesis: From-scratch implementation of the CryptoNote v2 ring-signature transaction scheme (basis of Monero)."
example.pdf

This is a binary file and will not be displayed.

+43 -19
example.typ
··· 1 - #import "vantage-typst.typ": vantage, term, skill, language, styled-link 1 + #import "vantage-typst.typ": vantage, term, skill, language, styled-link, icon 2 2 #let configuration = yaml("configuration.yaml") 3 3 4 4 #vantage( ··· 16 16 17 17 == Experience 18 18 19 - #for job in configuration.jobs [ 20 - === #job.position #h(5pt) _#link(job.company.link)[#job.company.name]_ #h(1fr) #term[#job.from --- #job.to][#job.location] 19 + #for (idx, job) in configuration.jobs.enumerate() [ 20 + #table( 21 + columns: (1fr, auto), 22 + stroke: none, 23 + inset: 0pt, 24 + column-gutter: 1em, 25 + row-gutter: 0.6em, 26 + [=== #job.position], 27 + align(left)[#text(9.5pt, fill: rgb("#555C65"))[#icon("calendar") #job.from --- #job.to]], 28 + [#text(9.5pt)[#if job.company.link != "" [#link(job.company.link)[#job.company.name]] else [#job.company.name]]], 29 + align(left)[#text(9.5pt, fill: rgb("#555C65"))[#icon("location") #job.location]] 30 + ) 21 31 22 - #for point in job.description [ 23 - - #point 32 + #if job.description.len() == 1 [ 33 + #text(10pt, style: "italic", fill: rgb("#333333"))[#job.description.at(0)] 34 + ] else [ 35 + #for point in job.description [ 36 + - #point 37 + ] 38 + ] 39 + 40 + #if idx < configuration.jobs.len() - 1 [ 41 + #v(0.1em) 42 + #line(length: 100%, stroke: (paint: rgb("#D4DCE8"), thickness: 0.5pt, dash: "solid")) 43 + #v(0.1em) 44 + ] else [ 45 + #v(0.2em) 24 46 ] 25 47 ] 26 48 ], 27 49 gridBelow: ( 28 50 [ 51 + == Languages 52 + #for lang in configuration.languages [ 53 + #language(lang.name, lang.level) 54 + ] 55 + ], 56 + [ 29 57 == Education 30 58 #for edu in configuration.education [ 31 59 === #if edu.place.link != "" [ 32 - #link(edu.place.link)[#edu.place.name]\ 60 + #link(edu.place.link)[#edu.place.name] 33 61 ] else [ 34 - #edu.place.name\ 62 + #edu.place.name 63 + ] 64 + #text(10pt)[#edu.degree in #edu.major]\ 65 + #text(9.5pt, fill: rgb("#555C65"))[#icon("calendar") #edu.from - #edu.to] 66 + #if "thesis" in edu [ 67 + \ 68 + #text(9.5pt, style: "italic", fill: rgb("#333333"))[#edu.thesis] 35 69 ] 36 - #edu.degree in #edu.major 37 - 38 - #term[#edu.from - #edu.to][#edu.location] 39 - 40 - 41 - ] 42 - ], 43 - [ 44 - == Languages 45 - #for lang in configuration.languages [ 46 - #language(lang.name, lang.note, lang.level) 47 70 ] 48 71 ], 49 72 [ 50 73 == Skills/Exposure 74 + #set par(justify: false) 51 75 #for skill in configuration.skills [ 52 - • #skill 76 + - #skill 53 77 ] 54 78 ] 55 79 )
+29 -61
vantage-typst.typ
··· 1 - #let primary_colour = rgb("#5f89ad") 2 - #let secondary_colour = rgb("#81a2be") 3 - #let link_colour = rgb("#8abeb7") 1 + #let primary_colour = rgb("#244C74") 2 + #let secondary_colour = rgb("#244C74") 3 + #let link_colour = rgb("#3A5F8E") 4 + #let meta_grey = rgb("#555C65") 4 5 5 6 #let icon(name, shift: 1.5pt) = { 6 7 box( ··· 12 13 } 13 14 14 15 #let findMe(services) = { 15 - set text(8pt) 16 + set text(8.5pt) 16 17 let icon = icon.with(shift: 2.5pt) 17 18 18 19 services.map(service => { 19 20 icon(service.name) 20 21 21 - if "display" in service.keys() { 22 + if service.link == "" { 23 + if "display" in service.keys() { 24 + service.display 25 + } 26 + } else if "display" in service.keys() { 22 27 link(service.link)[#{service.display}] 23 28 } else { 24 29 link(service.link) ··· 30 35 } 31 36 32 37 #let term(period, location) = { 33 - text(9pt)[#icon("calendar") #period #h(1fr) #icon("location") #location] 38 + text(9.5pt, fill: meta_grey)[#icon("calendar") #period #h(1fr) #icon("location") #location] 34 39 } 35 40 36 41 ··· 79 84 [\ ] 80 85 } 81 86 82 - #let language(name, note, rating) = { 83 - let done = false 84 - let i = 1 85 - 87 + #let language(name, level) = { 86 88 name 87 - emph(text(6pt)[ (#{note})]) 88 - h(7fr) 89 - 90 - while (not done){ 91 - let colour = rgb("#c0c0c0") 92 - let strokeColor = rgb("#c0c0c0") 93 - let radiusValue = (left: 0em, right: 0em) 94 - 95 - if (i <= rating){ 96 - colour = primary_colour 97 - strokeColor = primary_colour 98 - } 99 - 100 - // Add rounded corners for the first and last boxes 101 - if (i == 1) { 102 - radiusValue = (left: 2em, right: 0em) 103 - } else if (i == max_rating) { 104 - radiusValue = (left: 0em, right: 2em) 105 - } 106 - 107 - box(rect( 108 - height: 0.3em, 109 - width: 1.5em, 110 - stroke: strokeColor, 111 - fill: colour, 112 - radius: radiusValue 113 - )) 114 - 115 - if (max_rating == i){ 116 - done = true 117 - } 118 - 119 - i += 1 120 - } 89 + h(1fr) 90 + text(9pt, fill: meta_grey)[#{level}] 121 91 122 92 [\ ] 123 93 } ··· 140 110 title: name + "'s CV", 141 111 author: name, 142 112 ) 143 - set text(10pt, font: "SF Pro") 113 + set text(9.5pt, font: "Public Sans", weight: "medium", fill: rgb("#111111")) 114 + set par(leading: 0.65em) 144 115 set page( 145 116 margin: (x: 1.2cm, y: 1.2cm), 146 117 ) 147 118 148 - show heading.where(level: 1) : it => text(16pt,[#{it.body} #v(5pt, weak: true)]) 119 + show link: it => text(fill: link_colour, it) 120 + 121 + show heading.where(level: 1) : it => text(18pt, weight: "extrabold",[#{it.body} #v(5pt, weak: true)]) 149 122 150 123 show heading.where( 151 124 level: 2, 152 125 ): it => text( 126 + 12pt, 127 + weight: "bold", 153 128 fill: primary_colour, 154 129 [ 155 - #{it.body} 130 + #{upper(it.body)} 156 131 #v(-7pt) 157 132 #line(length: 100%, stroke: 0.5pt + primary_colour) 158 133 ] ··· 160 135 161 136 show heading.where( 162 137 level: 3 163 - ): it => text(fill: secondary_colour, it.body) 138 + ): it => text(11pt, weight: "semibold", fill: secondary_colour, it.body) 164 139 165 140 show heading.where( 166 141 level: 4 167 142 ): it => text( 143 + 10.5pt, 144 + weight: "semibold", 168 145 fill: primary_colour, 169 146 it.body 170 147 ) 171 148 172 149 [= #name] 173 - text(11pt, weight: "medium",[#position]) 150 + text(11.5pt, weight: "semibold",[#position]) 174 151 175 152 v(0pt) 176 153 findMe(links) 177 154 178 - tagline 155 + text(9pt)[#tagline] 179 156 180 157 181 158 experience 182 159 183 - // box( 184 - // rect( 185 - // width: 100%, 186 - // height: 2pt, 187 - // fill: secondary_colour, 188 - // radius: (left: 1em, right: 1em) 189 - // ) 190 - // ) 191 - 192 160 grid( 193 - columns: gridBelow.len(), 194 - column-gutter: 2em, 161 + columns: (15%, 30%, 55%), 162 + column-gutter: 1.5em, 195 163 ..gridBelow, 196 164 ) 197 165 }