├── src
├── react-app-env.d.ts
├── index.css
├── components
│ ├── Banner.tsx
│ ├── TerminalOutput.tsx
│ ├── ErrorMessage.tsx
│ ├── WelcomeMessage.tsx
│ ├── InputArea.tsx
│ └── Terminal.tsx
├── index.tsx
├── firebase.ts
├── App.tsx
├── App.css
└── serviceWorker.ts
├── .firebaserc
├── README.md
├── public
├── CV.pdf
├── robots.txt
├── favicon.ico
├── logo192.png
├── logo512.png
├── MSc_Thesis.pdf
├── manifest.json
└── index.html
├── firebase.json
├── .gitignore
├── tsconfig.json
└── package.json
/src/react-app-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
85 | Wow, I thought the only people who would visit this site would be bots 86 | and spammers, guess I was wrong. Just type any of the commands below 87 | to get some more info. You can even type a few letters and press [tab] 88 | or '.' to autocomplete. 89 |
90 |120 | Hey there! Thanks for taking such a keen interest in me. Hopefully 121 | you're not gonna spam or stalk me... Okay, I guess if you must stalk 122 | me, just give me fair warning so I can look presentable when you 123 | arrive at my door. 124 |
125 |
126 | Right, so, where to begin? Well, my parents met in... Nah, just
127 | kidding.
128 |
129 | As you probably know, my name is {glow("Craig Feldman")}. I'm a{" "}
130 | {getAge(new Date(1992, 12, 23))} year old {glow("Computer Scientist")}{" "}
131 | born and bred in the beautiful South Africa and currently living in
132 | Cape Town. I primarily work as a backend endgineer in the{" "}
133 | {glow("fintech")} space, but lately have been working as a platform
134 | engineer.
135 |
137 | In my spare time, you'll catch me walking my dog, Daisy, on the 138 | promenade or mountain. If I'm not with Daisy, I'm probably at the gym 139 | or trying out a new coffee shop with some friends. 140 |
141 | 142 |144 | I thrive in complex problem spaces, where deliberate design and 145 | scalable solutions deliver meaningful impact. While I feel that I have 146 | a lot to offer, I am fully cognisant of the fact that the way to 147 | better oneself (and the end product) is to be surrounded with 148 | exceptional peers from whom one can learn from, but at the same time 149 | contribute to. As such, what I value most is to be able to make 150 | meaningful contributions and work on challenging projects with 151 | talented colleagues. 152 |
153 | 154 |156 | I completed a Bachelor of Business Science degree (specialising in 157 | Computer Science) at the University of Cape Town, South Africa where I 158 | also completed a number of additional courses in fields such as 159 | finance, statistics, and economics. I graduated in the top 1% of the 160 | cohort across disciplines and furthered my academic career in 2016 161 | when I was awarded a full academic scholarship to study an MSc in 162 | Computer Science at the University of Oxford. At Oxford, I studied a 163 | variety of courses with a focus on machine learning and computer 164 | security. My thesis involved investigating the applicability of a 165 | blockchain based electronic voting system. 166 |
167 |168 | At university, I took a particularly keen interest in machine learning 169 | and computer security & cryptography. Oh, I also got very into rowing 170 | at and I'm pretty sure I left Oxford with my croquet skills being 171 | top-notch too! 172 |
173 | 174 |176 | I have worked across several different domains, including finance, 177 | payments, cryptocurrency, and an image and content creation app. I am 178 | proficient across the full stack, with primary expertise in{" "} 179 | {glow("backend architecture, and platform and scalability")}. Most 180 | recently, I manage the platform team for one of South Africa's largest 181 | payments service providers. 182 |
183 |184 | My experience includes working within highly specialised and focused 185 | teams, as well as working on cross functional projects with looser 186 | team structures and rapidly evolving requirements. I have worked as an 187 | engineer as well as a technical and team lead and have been a key 188 | stakeholder in driving design and architectural decisions across the 189 | companies I have worked at. I am fortunate to have joined several 190 | companies at the early stage and have worked in fast-paced and dynamic 191 | environments. Having been a key stakeholder in the growth of these 192 | companies, I also understand how goals and metrics shift as a company 193 | develops. My most recent role involves ensuring efficient and 194 | effective scalability and growth from a technical perspective. 195 |
196 | 197 | My previous formal work experience includes: 198 |235 | Nowadays I'm developing a method to download food... I wish! I am 236 | currently working at{" "} 237 | 242 | Stitch 243 | 244 | , helping to develop South Africa's leading payment's platform. To see 245 | detailed info about my {glow("experience and employment")}, just type 246 | 'employment'. 247 |
248 |249 | Please feel free to get in touch with me to discuss any cool 250 | opportunities. My contact details can be found by typing 'contact', 251 | and if you would like to check out my {glow("CV")}, simply type 'cv' 252 | or click{" "} 253 | 254 | here 255 | 256 | . 257 |
258 | > 259 | ), 260 | employment: ( 261 | <> 262 |273 | Stitch is one of South Africa's largest payment service providers. 274 | Stitch operates across the online and in-person payments space, 275 | including solutions designed for e-commerce platforms and tools for 276 | more effective finance management. 277 |
278 |279 | Development is mainly in a nodejs (Typescript) environment. There is 280 | some C# and React on the frontend and the overriding architecture is a 281 | monorepo of microservices - driven by docker/kubernetes. 282 | Infrastructure is predominantly hosted with Microsoft Azure. Other 283 | noteworthy tools and frameworks include: an event’s driven 284 | architecture, leveraging Redis, Kafka and BullMQ, Hasura, Postgres, 285 | Tailscale, Tilt, GraphQL, Helm, Datadog, and Terraform (amongst 286 | others). 287 |
288 |289 | I joined Stitch when it was an early stage startup and helped scale it 290 | from ~500 daily payments to tens of thousands. Being one of the most 291 | tenured engineers at Stitch, I have worked on a variety of projects 292 | and within a variety of roles, including: 293 |
294 |310 | In my role as a team lead, I was responsible for the ground-up 311 | development of an enterprise-grade reporting dashboard. This allows 312 | our enterprise clients to easily view and manage their accounts and 313 | transactions. Another major project was the development of a 314 | self-service onboarding and management platform that allows SMEs to 315 | sign up with Stitch and create and track payments - all without ever 316 | having to speak to the sales team! Under my leadership, this project 317 | spun off into its own business domain, generating more than 318 | $100k/month. 319 |
320 |321 | For the past two years, I have been a key member of the platform team. 322 | The work here involves developer and tech enablement and includes: 323 | scaling, improving the CI/CD process, addressing performance 324 | bottlenecks, improving the developer experience, monitoring and 325 | alerting, etc. Some of my key work here involves effective and 326 | efficient scaling - allowing us to handle hundreds of requests per 327 | second whilst also improving the efficiency of our infrastructure 328 | usage (finding cost savings of over $15k/month). Other, perhaps more 329 | mundane but equally important tasks, involve ensuring our CI/CD and 330 | testing pipeline is quick and effective and that our developers are 331 | enabled to perform effectively and efficiently 332 |
333 | 334 |341 | Luno is Africa's largest cryptocurrency wallet and exchange. During my 342 | time at Luno, I worked in the cross-functional Payment Operations team 343 | - developing software, tools, and internal systems to support the 344 | operational side of fiat payments within the app. Work involved 345 | improving the processes of how one gets fiat currency into and out of 346 | Luno, along with developing a system to perform automatic recon on 347 | these accounts. 348 |
349 |350 | At Luno, I worked closely with many senior software engineers and the 351 | tech leadership/executive team. Development was mostly in Go and 352 | Typescript, with a focus on developing our own customised internal 353 | tooling and frameworks. 354 |
355 | 356 |367 | Over is a graphic design app for mobile devices. Similar to Canva, it 368 | allows one to easily edit images and videos on your mobile device. I 369 | joined Over as an early employee in the backend/services team where we 370 | primarily used Kotlin for our services, and Typescript with Angular 371 | for our internal content management system. When I joined Over, I was 372 | part of a small team responsible for the full backend system. 373 |
374 |375 | Within the two years of me joining Over, the company grew from about 376 | 20 employees to over 150. I left Over to join Luno shortly after Over 377 | was acquired by GoDaddy and rebranded as GoDaddy Studio. 378 |
379 | > 380 | ), 381 | projects: ( 382 | <> 383 |384 | I'm always working on comp sciey (not really a word) things. Why don't 385 | you check out a few of my public code repositories? Just type 'repo' 386 | to get the links. 387 |
388 |389 | I've also dabbled in producing a{" "} 390 | 395 | property-management portal 396 | {" "} 397 | that provides property managers and buildings with some really cool 398 | software and tools. The project uses TypeScript, Node.js, React (with 399 | Material-UI components) and Firebase. 400 |
401 |402 | You can also check out my MSc thesis{" "} 403 | 404 | An investigation into the applicability of a blockchain based voting 405 | system 406 | {" "} 407 | - this one took a while! 408 |
409 | > 410 | ), 411 | contact: ( 412 | <> 413 |630 | I built this website from scratch using {glow("React")} and{" "} 631 | {glow("TypeScript")}. It is a rewrite of my{" "} 632 | 637 | previous 638 | {" "} 639 | website that used{" "} 640 | 645 | JQuery Terminal Plugin 646 | {" "} 647 | (and some inspiration from{" "} 648 | 653 | Ronnie Pyne 654 | 655 | ). 656 |
657 |658 | The source code for this site can be found on{" "} 659 | 664 | GitHub 665 | 666 | . Feel free to use this website for inspiration, or go ahead and copy 667 | some of the code! If you do, all I ask is that you give this site a 668 | mention :) 669 |
670 | > 671 | ), 672 | }; 673 | 674 | const processCommand = (input: string) => { 675 | logEvent(analytics, "command_received", { command: input }); 676 | 677 | // Store a record of this command with a ref to allow us to scroll it into view. 678 | // Note: We use a ref callback here because setting the ref directly, then clearing output seems to set the ref to null. 679 | const commandRecord = ( 680 |