-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
1092 lines (1046 loc) · 70.2 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en" class="darkmode">
<head>
<!-- I'm sorry for snooping on you but I wanna know who visits my page :( -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-151064305-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'UA-151064305-1');
</script>
<title>Konstantin Wohlwend</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="format-detection" content="telephone=no">
<meta name="Description" content="Personal page of Konstantin 'N2D4' Wohlwend.">
<meta name="keywords"
content="stan, konstantin, wohlwend, stan wohlwend, konstantin wohlwend, cv, informatik, informatics, computer, computer science, programming, java, javascript, javascript, python, c, c++, cpp, resume, lebenslauf, n2d4, eth zurich, switzerland, zürich, schweiz" />
<meta name="theme-color" content="#BDBBBA" />
<base target="_blank">
<link rel="stylesheet" href="index.css">
<style>
/**/
.unimportant {
display: none;
}
/**/
</style>
</script>
</head>
<body>
<script>
if (window.matchMedia('(prefers-color-scheme: light)').matches) {
document.getElementsByTagName('html')[0].classList.remove('darkmode');
}
</script>
<div class="titleline">
<h1 class="noprint shout">
<i>shout</i>("<b class="hilitecol">hey</b>")
</h1>
<div id="stylecontainer">
<a id="darkmode" class="noprint titlecol" style="float: right; font-size: 80%;"
onclick="document.getElementsByTagName('html')[0].classList.toggle('darkmode')"
href="javascript:void(0)" target="_self"></a><br>
<a id="inccontrast" class="noprint titlecol" style="float: right; font-size: 80%;"
onclick="document.getElementsByTagName('html')[0].classList.toggle('contrastplus')"
href="javascript:void(0)" target="_self"></a>
</div>
</div>
<div class="noprint">
<span class="nowrap">Konstantin "Stan" Wohlwend,</span>
<span class="nowrap">life is great.</span>
</div>
<div class="noprint">
Previously <b>Google</b>, <b>Jane Street</b>, <b>Y Combinator</b> (W23, S24).
</div>
<div class="noprint">
Now I build open-source authentication. <a href="https://stack-auth.com">stack-auth.com</a>
</div>
<h1 class="print" style="text-align: center; font-weight: normal;">
Konstantin <span style="font-weight: bold;">"Stan"</span> Wohlwend
</h1>
<p class="print" style="font-size: 80%; text-align: center;">
German (native) and English (fluent).
Based in Zurich, happy to travel!<br>
Proficient in <b>Java</b>, <b>JavaScript</b>, <b>TypeScript</b> and <b>Python</b>, decent in <b>C</b>,
<b>C++</b>,
<b>Rust</b> and <b>Go</b>
</p>
<p class="print" style="font-size: 80%; text-align: center;">
Previously <b>Google</b>, <b>Jane Street</b>, <b>Y Combinator</b> (W23, S24).
</p>
<p class="print" style="font-size: 80%; text-align: center;">
Check out my portfolio! <a href="http://n2d4.github.io">n2d4.github.io</a>
</p>
<!-- Kind of ugly, but the fact that it's a pure CSS slideshow makes up for it doesn't it :) -->
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw1"
checked="checked">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw2">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw3">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw4">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw5">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw6">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw7">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw8">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw9">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw10">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw11">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw12">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw13">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw14">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw15">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw16">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw17">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw18">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw19">
<input type="radio" name="slideshow-cntrl-buttons" class="noprint slideshow-cntrl-button" id="sldshw20">
<!-- to add new slides, add a new <div class="project"> in the slideshow and a label to .slideshow-controls -->
<!-- if you want more than 20 radio buttons, adding a radio here is not enough, you'll also need to add CSS definitions -->
<div class="noprint slideshow-outer">
<div class="slideshow-nav slideshow-left">
<div class="el"></div>
<div class="el"></div>
</div>
<div class="slideshow-nav slideshow-right">
<div class="el"></div>
<div class="el"></div>
</div>
<div class="slideshow">
<div class="slideshow-container">
<div class="project">
<img src="assets/generai.jpeg">
<h1>🖼️ Generai 🖼️</h1>
<p class="tagline">AI image generation before it was cool</p>
<p class="links">
With
<a href="https://github.com/realChesta">Kyrill Hux</a>,
<a href="https://github.com/municola">Nicolas Muntwyler</a>,
<a href="https://github.com/shnippi">Jan Schnyder</a><br>
<a href="https://generai.art">Try it out!</a><br>
<a href="https://generai.art/gallery">Visit the gallery</a>
</p>
<p class="textblock">
In early 2022, Jan shared with me some AI image generation models he had found. It took me by storm; I was already impressed by the results of DALL-E at the time, but those models seemed a step up. So we decided to try and make them even better.
</p>
<p class="textblock">
At the time, there was no Stable Diffusion, and only one version of DALL-E. We trained a pipeline consisting of language & image models and the results were really impressive; before the AI hype, the competition was kinda dog, and our model gave state-of-the-art outputs (which, at the time, was Midjourney). We were also the first to generate (decent) 4K+ images.
</p>
<img src="assets/generai-blades.jpeg" class="right">
<p class="textblock">
So we built a platform around it. We got in touch with Stability AI and got pre-beta access for what would later become Stable Diffusion, were featured at the Zurich PopCon 2022, and got the chance to take the project to Y Combinator's W23 batch, starting what would later become <a href="https://nunu.ai" target="_blank">nunu.ai</a>. We never managed to make Generai pay our rent because we realized we don't really have any of the skills that B2C needs, and after a few months Stable Diffusion created a lot of strong competition in the space, but it was fun to try.
</p>
<p class="textblock">
<i>Prompt engineering</i> was what people called the (at the time fairly hard) task of translating human thoughts into a prompt the machine does well on. Alongside parameter tuning, this was a significant blocker to getting good results. By analyzing over 3000 prompts submitted by our users, we built a collection of UX tricks and language models to get the prompts a professional prompt engineer would've made.
</p>
<img src="assets/generai-how-it-works.png">
<p class="textblock">
Sadly, we were broke students, and didn't get to buy our own A100 GPU clusters. So we had to stick to 3090s that we rented off of Ethereum miners (a bubble that coincidentally just popped). It was painful! Turns out that crypto miners are not generally good server admins (we were seeing a server failure more than once a day on average), but it taught us how to build a resilient system that can handle a lot of crashing. This way, we reduced our hardware costs from ~$2-8 per image on the big cloud providers to about 10c. At peak usage, we had over one hundred 3090s running at the same time.
</p>
<p class="textblock">
The platform was built on Firebase, with Next.js, in TypeScript and a Python backend. We used Google Cloud & Vercel for deployments, Shopify for our print store, and Stripe for payments.
</p>
</div>
<div class="project">
<img src="assets/eternal-sunset.jpg">
<h1>⛰️ Eternal Sunset ⛰️</h1>
<p class="tagline">Basically Cube World but roguelike and (kinda) not dead</p>
<p class="links">
With
<a href="https://github.com/rikidere">Patrick Eppensteiner</a>,
<a href="https://github.com/janniku9">Jannik Gartmann</a>,
<a href="https://github.com/Rasilu">Rasmus Lüscher</a>,
<a href="https://github.com/bazumo">Moritz Schneider</a>,
<a href="https://github.com/skaan">Kaan Sentürk</a><br>
<a href="https://www.youtube.com/watch?v=JP2pmngg5tY">Watch the trailer</a>
</p>
<blockquote style="margin-top: 32px; margin-bottom: 32px;">
<p class="textblock">
For many eternities<br>
the sun rose as it set,<br>
Until some day much later<br>
Apopis put it to rest.<br>
</p>
<p class="textblock">
Awakened by Ra<br>
There is only one chance<br>
To travel through time<br>
And return to old strength.<br>
</p>
<p class="textblock">
Follow the cats<br>
To dig up Khafre's throne<br>
And turn into blood<br>
What turns you into stone.<br>
</p>
</blockquote>
<p class="textblock">
We made this for the Game Programming Lab course at ETH, but we basically ended up making this a 200% full-time job. Eternal Sunset is a two-player co-op roguelike voxel adventure game. It's procedurally generated and features a progression system on infinite terrain.
</p>
<img src="assets/eternal-sunset-view.png" class="right">
<p class="textblock">
At the core is the time mechanic. When the hourglass runs out of sand, the player will travel back in time right back to their spawn, but the world that they know will remain the same. As they explore more and more, they have to find a route to kill the final boss within the time limit. If they succeed, their run and the time they needed will be registered in the weekly leaderboard; at the beginning of the next week, a whole new world will be procedurally generated, meaning there is always fresh competition.
</p>
<p class="textblock">
By the time the course ended, we had four different biomes with unique generation, seven dungeon types (each of which can create many variations using procedural generation), 9 unique enemies & NPCs (25 total variants), 71 items with unique behaviour, 13 of which being weapons split up into 4 classes with 3 attacks each, and over 1000 commits on our Git repo.
</p>
<img src="assets/eternal-sunset-temple.png">
<p class="textblock">
The game is written in C#, but not using Unity, instead we built our own engine on MonoGame (everything from voxel rendering to 3D physics is custom-made, though MonoGame provides us with some low-level rendering primitives). The world is divided into small chunks which are generated and loaded individually. This happens separately from the main thread, so it won't freeze the game; in fact, it can leverage as many CPU cores as available, resulting in a satisfying experience even when exploring a large world. This, plus the fact that we use advanced rendering techniques, allows us to render millions and millions of blocks with ease, far more than even established voxel games like Minecraft (which was developed with single-core systems in mind).
</p>
<p class="textblock">
Animations in a block world are considerably different from what we know from real life. We built our own animation framework to facilitate this; it allows us to express complex transitions with just a few lines of code. We interpolate animations independently from game ticks, something that is required because time is our central mechanic and there are items which allow players to mess with tick duration & behaviour. This meant we had to scrap a large part of the MonoGame update loop, but the results are incredibly smooth 120FPS+ movements.
</p>
<p class="textblock">
I could go on, but there's only so much space on this website. If you're interested, please don't be shy and reach out. And if you'd like to play the game, we do want to put it on Steam eventually :)
</p>
<iframe style="display: block; margin: auto; width: 100%;" width="560" height="315" src="https://www.youtube.com/embed/JP2pmngg5tY?si=YPMKu6LDiYCbjrit" title="Eternal Sunset Trailer" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div>
<div class="project">
<img src="assets/card-game.png">
<h1>🃏 card-game 🃏</h1>
<p class="tagline">Playing card games in your web browser</p>
<p class="links">
With <a href="https://github.com/janniku9">Jannik Gartmann</a><br>
<a href="https://jass.n2d4.com">Play it online!</a><br>
<a href="https://github.com/N2D4/card-game">Source on GitHub</a>
</p>
<p class="textblock">
<i>Jass</i> is a card game in the Bézique family, originally played in the Netherlands but since
then it has quickly gained popularity throughout the entirety
of Switzerland. Today, Jass is considered Switzerland's national card game, so understandably demand
for a digital version is huge. However, unfortunately we
were very unsatisfied with the choices we had as many online-Jass portals run on Adobe Flash, while
others are hidden behind a paywall or tons of ads, so we
figured it would be our best bet to start work on our own engine. This way, we can also implement
variants of the game that are popular in only small parts of
Switzerland that many other apps don't support.
</p>
<p class="textblock">
card-game is written in TypeScript and uses a modern, ES6-based coding style. One of our design
goals was to make it easily adaptable to new game modes, meaning
with just a few lines of code you can implement entirely new variants of Jass. In fact, because
everything is modular, it could be easily transformed into an
engine for any other card game.
</p>
</div>
<div class="project">
<img src="assets/multiple-choices.png">
<h1>✅ multiple-choices ✅</h1>
<p class="tagline">Assisting my students in passing the first year</p>
<p class="links">
<a href="https://n.ethz.ch/~wohlwenk/kapitel6">Try it online!</a><br>
<a href="https://github.com/N2D4/multiple-choices">Source on GitHub</a>
</p>
<p class="textblock">
Discrete Mathematics is often considered one of the most challenging subjects in the first year of
the Computer Science
Bachelor at ETH Zurich. I had the chance to be a teaching assistant during the autumn semester of
2018, leading a group
of 25 Discrete Maths students through their first semester. multiple-choices is a tool that uses
gamification and a
simple and intuitive interface to motivate students to test their knowledge using multiple choice
exercises. It turned
out the tool spread a tad bit, so people outside my exercise class got the chance to use it, too! :D
</p>
<p class="textblock">
multiple-choices is a frontend vanilla HTML/CSS/JS web app. It runs entirely in the user's browser
and its only external
dependency is KaTeX, a JavaScript LaTeX renderer.
</p>
</div>
<div class="project">
<img src="assets/mips-sim.png">
<h1>🖥 mips-sim 🖥</h1>
<p class="tagline">A MIPS assembler and emulator</p>
<p class="links">
With <a href="https://github.com/bazumo">Moritz Schneider</a><br>
<a href="https://bazumo.github.io/mips-sim">Try it online!</a><br>
<a href="https://github.com/bazumo/mips-sim">Source on GitHub</a>
</p>
<p class="textblock">
I don't think MIPS needs an introduction – 40 years old and some people still use it in production!
(For better or worse.) It's interesting because it survived the test of time, and also because it's
one of the (if not the one) most idiomatic reduced ISAs out there.
</p>
<p class="textblock">
Containing only a small set of instructions, MIPS is much simpler to implement than CISCs like x86.
So, Moritz and I decided to work on a MIPS editor, assembler and emulator for the browser. We spent
a lot of time planning the software infrastructure so implementing our interface for a different
architecture would be no harder than translating the specification document to source code. This
resulted in a modular design where adding, removing and modifying opcodes is trivial.
</p>
</div>
<div class="project">
<img src="assets/bobby-trawler.png">
<h1>♟ bobby-trawler ♟</h1>
<p class="tagline">A somewhat stupid chess computer</p>
<p class="links">
<a href="https://chess.n2d4.com">Fight me online!</a><br>
<a href="https://github.com/N2D4/bobby-trawler">Source on GitHub</a>
</p>
<p class="textblock">
In 1996, Deep Blue was the first chess computer to defeat the then world champion, Garry Kasparov.
In 2019, Bobby Trawler was the first chess computer to defeat
me, Stan Wohlwend. Granted, that is not quite true given I've already lost to a good bunch of chess
computers before that and it also doesn't say much given I'm
a terrible chess player, but it makes for a good introductory line.
</p>
<p class="textblock">
Bobby Trawler consists of two engines, namely Tanner and Daedrian. Tanner is a brute-force engine
that simply runs a search on all possible chess moves, using
various techniques such as memoization to speed up the process. Daedrian uses a min-max algorithm,
allowing it to have more elaborate game plans, but that also
means it is less consistent. Because my chess knowledge is limited, the board valuation method is
very basic, and also neither of the two engines use an opening
book, making Bobby Trawler very vulnerable in the early game. However, if you can not get a decent
lead against the computer early on, it becomes hard to defeat
in the later stages of the game.
</p>
<p class="textblock">
I've made a lot of optimizations on the assembly level to improve performance. By using benchmarking
tools and analyzing compiler output, I found out which
parts of the program can be improved by inlining critical functions and making the program less
vulnerable to low-level issues like cache misses.
</p>
</div>
<div class="project">
<img src="assets/evil-inc.png">
<h1>🚩 Evil Inc. 🚩</h1>
<p class="tagline">A somewhat sophisticated beginner CTF</p>
<p class="links">
<a href="https://github.com/N2D4/evil-inc">Source on GitHub</a><br>
</p>
<p class="textblock">
<b>SPOILER WARNING!</b> If you're planning on trying this challenge yourself, stop reading right
now.
</p>
<p class="textblock">
Oh no! Evil Inc., a secretive organisation with the sole goal of total annihilation is about to
destroy the universe and no one can stop them! No one? No, not
quite! There is still hope, as there is a smart hacker on their mission to break into Evil Inc.'s
systems and save the world! (That smart hacker is you.)
</p>
<p class="textblock">
Yea, that's cheesy. But I need to hype it up somehow. Computer security is all about breaking into
things, and in Evil Inc. your goal is to break into a server
and steal a secret flag given just their website.
</p>
<p class="textblock">
The player starts by doing simple attacks like SQL injection and directory traversal to gain read
access over the user folder. But then, things become much more
complicated. The player is presented with a Discord bot and a Minecraft server which were set up by
unexperienced server admins, allowing the player to attack
it. A combination of multiple vulnerabilities to first open a reverse shell, then gain root access
over the system is needed to open the secret flag file.
</p>
<p class="textblock">
Evil Inc. runs as a Docker container and is written in HTML/CSS/JS, Python, and Java. It requires no
prior experience in computer security, though programming
skills are important.
</p>
</div>
<div class="project">
<img src="assets/uncharted.png">
<h1>📈 uncharted 📈</h1>
<p class="tagline">A code-driven data visualization tool</p>
<p class="links">
<a href="https://n2d4.github.io/uncharted">Try it online!</a><br>
<a href="https://github.com/N2D4/uncharted">Source on GitHub</a>
</p>
<p class="textblock">
Hah, usually it's the other way around, coding being data-driven and stuff, isn't it? Anyways, a
vast majority of my
plotting needs are "I have a (possibly complex) function and want to see how it looks like with
different
parameters". Sure, there are ways to do that (matplotlib, Mathematica, etc.), but I figured I spend
most of my time
not on the function but on making the plots look nice. I mean, do I <i>really</i> have to care about
step size just
to watch two lines intersect? And I wanna share the plots, too. I'm not gonna teach my friends
Octave to show them
how gas emissions affect the climate.
</p>
<p class="textblock">
Uncharted is an opinionated charting tool with "reasonable" defaults. It takes a TypeScript function
and a bunch of
parameter values and does exactly one thing, plot that. Utilizing inferred parameter & result types
from
TypeScript's compiler, it presents
a UI to let you tweak the values as you wish. The app is built with SvelteKit and uses a
cutting-edge web stack.
</p>
</div>
<div class="project">
<img src="assets/deep-duel.png">
<h1>⚔ Deep Duel ⚔</h1>
<p class="tagline">A 2D multiplayer browser game</p>
<p class="links">
With <a href="https://github.com/realChesta">Kyrill Hux</a><br>
<a href="https://github.com/realChesta/deep-duel">Source on GitHub</a><br>
</p>
<p class="textblock">
While we initially started Deep Duel with the goal of making an AI learn to play a simple fighting
game, we never ended up doing that and instead just
emphasized on the fighting game part. Deep Duel is a fast-paced multiplayer duel game where you try
to out-maneuver your opponent by hitting, dashing and
shooting them on a two-dimensional plane.
</p>
<p class="textblock">
Deep Duel is written in HTML, CSS, and JavaScript, using React for the UX elements, PixiJS for
rendering and lance.gg as a multiplayer engine.
</p>
</div>
<div class="project">
<img src="assets/contest-library.png">
<h1>📚 Contest Library 📚</h1>
<p class="tagline">Reusing algorithms at a low performance cost</p>
<p class="links">
<a href="https://github.com/N2D4/contest-library">Source on GitHub</a>
</p>
<p class="textblock">
When participating in competitive programming contests, you often end up using the same algorithms
over and over again. For this purpose, I've started putting
them into a library where I can re-use them whenever. Being competitive by heart, this library now
contains thousands of lines of code and many algorithms and
data structures, such as sparse matrices, segment trees, range lists, primitive collections,
multimaps, graphs, coloring, cycle detection, flow algorithms, tree
traversal, prime factorization, modular arithmetic, string utilities, histograms, fast I/O, genetic
optimization, and many more. Note that I can't just use
third-party libraries as these are forbidden in most contests.
</p>
<p class="textblock">
The number one goal is to learn more about the algorithms I'm implementing, which is why I'm always
trying to find common ancestors of algorithms and data
structures. For example, an adjacency list graph is equivalent to an adjacency matrix graph using a
row-list sparse matrix, and Prim's algorithm is really just
a special case of A* with a certain heuristics function. This kind of code re-use means that any
performance improvement or heuristic I implement on the A*
algorithm will subsequently also speed up Prim's.
</p>
<p class="textblock">
It turns out that most competitive programmers use C++, and the exercises sometimes even expect you
to. Java usually is slower, and the fact that I'm using an
abstraction above everything does not help. Even though you'd expect constants to not matter in
these contests, it turns out they do, and especially in Java
where boxing and unboxing primitives is the default when working with generic types cache misses
will generally do a huge difference. The library uses several
tricks (eg. primitive collections) and heuristics (eg. using a linear search list instead of a hash
map for small maps) to combat this.
</p>
<p class="textblock">
Additionally, it performs some other jobs that can be useful during a contest; it has a built-in
(disk) caching feature for large pre-processed data, reads
input and output files, automatically off-loads work onto multiple threads, bundles and compresses
multiple source code files into one big file, and eliminates
unneeded classes.
</p>
</div>
<div class="project">
<img src="assets/ml-ann.png">
<h1>🧠 Machine Learning and Artifical Neural Networks 🧠</h1>
<p class="tagline">Helping Rachel on her quest to world domination</p>
<p class="links">
<a href="https://n2d4.github.io/ml-ann/paper.pdf">Read the paper</a><br>
<a href="https://github.com/N2D4/ml-ann">Source on GitHub</a><br>
<a href="https://n2d4.github.io/ml-ann/qlearner/index.html">Try the Q-Learning visualizer</a>
</p>
<p class="textblock">
I've been coding for a long time. Both my high school term papers were about artificial
intelligence, one in philosophy and one in computer science. The latter
is about helping Rachel, an artificial intelligence running on my computer, learn to play a simple
card game so that she can finally take over the world.
</p>
<p class="textblock">
To achieve her goal, Rachel uses Q-learning to understand the concept of a game state. For this
purpose, I've created a visualization tool in Processing (using
Java) which helps readers understand the concept of Q-learning. You can try this tool online using
the link above.
</p>
<p class="textblock">
Furthermore, I've implemented a simple feed-forward neural network in Java which can be used in
conjunction with the Q-Learner, in a very similar (but heavily
simplified!) fashion to what Google's DeepMind is doing with AlphaGo. It features several different
activation functions and error propagation mechanisms.
Combining the two allows Rachel to learn a very simple card game. For more information, please take
a look at the paper! :D
</p>
</div>
<div class="project">
<img src="assets/fractal-flames.png">
<h1>🔥 fractal-flames 🔥</h1>
<p class="tagline">Generating nice pictures</p>
<p class="links">
<a href="https://github.com/N2D4/processing-fractal-flames">Source and gallery on GitHub</a><br>
</p>
<p class="textblock">
Invented by Scott Draves in 1992, Fractal Flames build the basis for programs like Electric Sheep
and Apophysis. The algorithm procedurally creates nice-looking
pictures from only a single initial seed. This technique is now commonly used in computer graphics
to generate flame-like or chaotic structures.
</p>
<p class="textblock">
What initially was just supposed to be a high school project for computer science class is now a
fully working
implementation of the original Fractal Flames algorithm, with a bunch of optional tweaks. It's both
less efficient and
less powerful than modern implementations like those mentioned above – yet still, it can serve as a
reference
implementation of the algorithm in Processing.
</p>
</div>
<div class="project">
<img src="assets/sbserver.png">
<h1>🎮 SBServer and SBAPI 🎮</h1>
<p class="tagline">Developing a Minecraft minigame server with friends</p>
<p class="links">
With <a href="https://github.com/janniku9">Jannik Gartmann</a> (and others)
</p>
<p class="textblock">
During high school, gaming after school has bonded our class together. One of the video games we
played is called
<i>Minecraft</i>, famous for many things; amongst them the countless modding and minigame
communities. In a group of
friends, we had been building a Minecraft minigame server – for this, Jannik and I have coded the
required mods in Java.
</p>
<p class="textblock">
The architecture is split into two mods. The first is SBAPI, a minigame API. Minecraft is a sandbox
game and not a minigame toolkit, and as such creating
minigame mods is a hassle. To make this a little easier, we built an entire abstraction layer on top
of Minecraft, allowing you to build customizable minigames
using only our API in a few lines of code, while leaving all the world generation, match-making,
glitch prevention etc. to the API.
</p>
<p class="textblock">
The other mod is SBServer. It contains the actual game logic and concepts of our server. Minigames
include KitPvP (players choose one of many kits each unique
with abilities, then fight in an arena), Bedwars (players defend their own bed whilst trying to
destroy other players' beds), One in the Quiver (everyone gets a
bow, every hit is a kill), Lobby Hockey (ice hockey, but in Minecraft), and many more. Most of these
are popular games on many Minecraft servers among the
community, but all our games always have unique features and twists which make them somewhat
different.
</p>
<p class="textblock">
The programming was done by Jannik and me, whereas various other friends worked with us on level
building and game design/balance. We've also had several game
testing sessions with a broader circle of friends to make sure our games are fair. SBServer had been
a pet project for all of us for a very long time; in fact,
I don't think there's any other project I've contributed as much code to as this one.
</p>
</div>
<div class="project">
<h1>...and there's always more!</h1>
<p class="textblock">
Throughout the past few years, I've almost always been working on at least one coding project. While some of them I will gladly show to the world, a vast majority have either never seen the daylight or just aren't big enough to be an entry here. After all, who finishes every side project they start? :)
</p>
<p class="textblock">
Some examples:
<ul>
<li>a food delivery app</li>
<li>TV box software written for personal use on my Raspberry Pi</li>
<li>a graphical IDE for making Minecraft modifications without programming experience</li>
<li>a tool that can be used to crack LCGs (most notably java.util.Random)</li>
<li><a href="https://cfour.n2d4.com" style="color: inherit;">a minimalistic Connect-Four game</a> with multiplayer and singleplayer (vs. computer) support</li>
<li>a less polished linear algebra version of multiple-choices</li>
<li><a href="https://n2d4.github.io/kelly" style="color: inherit;">a biased betting simulator</a></li>
<li>a Discord bot using Markov chains to learn from my conversations</li>
<li>countless game prototypes</li>
<li><a href="https://stanza.ink" style="color: inherit;">a generative poem visualizer</a></li>
<li>a Minecraft magic mod with spells, wands, and adventures</li>
</ul>
and more.
</p>
<p class="textblock">
If you have any questions, drop me a message on <a href="mailto:[email protected]">[email protected]</a> :D
</p>
</div>
</div>
</div>
</div>
<div class="noprint slideshow-controls">
<label for="sldshw1"></label>
<label for="sldshw2"></label>
<label for="sldshw3"></label>
<label for="sldshw4"></label>
<label for="sldshw5"></label>
<label for="sldshw6"></label>
<label for="sldshw7"></label>
<label for="sldshw8"></label>
<label for="sldshw9"></label>
<label for="sldshw10"></label>
<label for="sldshw11"></label>
<label for="sldshw12"></label>
<label for="sldshw13"></label>
<label for="sldshw14"></label>
</div>
<script>
'use strict';
const enableTransitions = true;
let lastSelected = 1;
let interval;
function slplus(i, b) {
if (!b && enableTransitions) clearInterval(interval);
lastSelected += i;
const m = document.querySelectorAll('.slideshow-controls > label').length;
lastSelected = ((lastSelected - 1) % m + m) % m + 1;
const cur = document.getElementById('sldshw' + lastSelected);
cur.checked = true;
}
document.addEventListener('keydown', e => (f => f && slplus(f))({ 37: -1, 39: 1 }[e.keyCode]));
document.querySelector('.slideshow-left').addEventListener('click', () => slplus(-1));
document.querySelector('.slideshow-right').addEventListener('click', () => slplus(1));
// could use CSS animations for this as well...
if (enableTransitions) {
interval = setInterval(() => {
const prev = document.getElementById('sldshw' + lastSelected);
if (!prev.checked) {
clearInterval(interval);
return;
}
slplus(1, true);
}, 7000);
document.querySelectorAll('.slideshow-controls > label').forEach(a => a.addEventListener('click', () => {
clearInterval(interval);
lastSelected = [...a.parentNode.children].indexOf(a) + 1;
}));
}
</script>
<div class="noprint">
If you wanna know more about me, take a look at my CV below :)
</div>
<hr class="noprint">
<a class="noprint titlecol" style="float: right; font-size: 80%;" onclick="window.print()" href="javascript:void(0)"
target="_self">
[print]
</a>
<div class="cv">
<div class="cvcol multi">
<div class="noprint">
<div class="sectionheader">
<span class="noprint">Personal details</span>
<span class="print">Personal Details</span>
</div>
<table>
<tr>
<td>Name</td>
<td><b class="titlecol">Konstantin "Stan" Wohlwend</b></td>
</tr>
<tr>
<td>E-Mail</td>
<td>
<b class="titlecol"><a href="mailto:[email protected]">[email protected]</a></b><br>
</td>
</tr>
<tr>
<td>Languages</td>
<td><b class="titlecol">German</b> (native), <b class="titlecol">English</b> (fluent)</td>
</tr>
<tr>
<td>Preferred programming languages</td>
<td>
<b class="titlecol">Java</b>,
<b class="titlecol">JavaScript</b>,
<b class="titlecol">TypeScript</b>,
<b class="titlecol">Python</b>,
<b class="titlecol">C</b>,
<b class="titlecol">C++</b>,
<b class="titlecol">Rust</b>
<span class="nowrap">(in no particular order)</span>
</td>
</tr>
</table>
</div>
<div>
<div class="sectionheader">
Education
</div>
<table>
<tr>
<td><span class="nowrap">Sep<span class="noprint">tember</span> 2017</span> – today</td>
<td>
<b class="tbtitle">BSc. & MSc. in Computer Science, ETH Zurich, Switzerland</b><br>
<div class="textblock">
<p>GPA (BSc.): 5.1<sup>1</sup></p>
<p>Graduation year (BSc.): 2021</p>
<p>Expected graduation year (MSc.): 3157<sup>2</sup></p>
</div>
</td>
</tr>
<tr class="unimportant">
<td><span class="nowrap">Aug<span class="noprint">ust</span> 2010</span> – <span class="nowrap">Jul<span
class="noprint">y</span> 2017</span></td>
<td>
<b class="tbtitle">Liechtensteinisches Gymasium, Vaduz, Liechtenstein</b><br>
<span class="noprint">
Term papers:
<ul class="compressed">
<li>In computer science: <a class="noprintdec" href="https://n2d4.github.io/ml-ann/paper.pdf"
style="color: inherit;"><cite>Machine Learning and
Artificial Neural Networks</cite></a></li>
<li>In philosophy: <cite>Artificial Intelligence and Ethics</cite></li>
</ul>
</span>
</td>
</tr>
</table>
</div>
<div>
<div class="sectionheader">
Experience <span style="font-size: 70%; font-weight: normal; color: var(--text-col, rgb(81, 81, 81));">(most relevant achievements <span class="emphasize">highlighted</span>)</span>
</div>
<table>
<tr class="emphasize">
<td><span class="nowrap"><span class="nowrap">Feb<span class="noprint">e</span> 2024</span> – <span class="nowrap">today</span></span></td>
<td>
<b class="tbtitle">Co-Founder, Stack Auth</b><br>
<div class="textblock">
<p>Co-founded <a href="https://stack-auth.com">Stack Auth</a> (YC S24), building the most developer-friendly open-source <b>authentication</b> and <b>authorization</b> service</p>
<p>Took leadership in <b>product development</b>, <b>legal</b>, <b>accounting</b>, <b>sales</b>, and <b>management</b> together with my co-founder Zai</p>
</div>
</td>
</tr>
<tr class="emphasize">
<td><span class="nowrap"><span class="nowrap">Jun<span class="noprint">e</span> 2022</span> – <span class="nowrap">Nov<span class="noprint">ember</span> 2023</span></span></td>
<td>
<b class="tbtitle">Co-Founder, nunu.ai</b><br>
<div class="textblock">
<p>Co-founded <a href="https://nunu.ai">nunu.ai</a> (aka Generai, Waveline), a <b>Y Combinator</b> (W23) company that (across pivotes) generated <b>AI</b> images, helped businesses <b>parse documents</b>, and built <b>AGI for games</b></p>
<p>Experienced all the parts of startup life, from <b>product development</b> over <b>infrastructure & software architecture</b> to <b>sales & marketing</b> and <b>AI research</b></p>
</div>
</td>
</tr>
<tr>
<td>
<span class="nowrap">Sep<span class="noprint">tember</span> 2020</span> – <span class="nowrap">Mar<span class="noprint">ch</span> 2023</span><br>
<i class="noprint">(committee member since <span class="nowrap">February 2019)</span></i>
</td>
<td>
<b class="tbtitle">President of the ACM Committee, VIS @ ETHZ</b> <i class="nowrap">(volunteer)</i><br>
<div class="textblock">
<p><b>Organized coding competitions</b> for the 1800+ members of VIS<span class="noprint">, the Association of CS Students</span> @ ETH Zurich</p>
<p>Expanded our committee by <b>planning & executing</b> new contests & events, both in-house and with external partners & companies</p>
<p><span class="noprint">Other volunteer roles at VIS include: Layouting for our quarterly magazine, co-organizing the Kontaktparty (largest academic IT recruiting fair in Switzerland)</span></p>
</div>
</td>
</tr>
<tr>
<td><span class="nowrap"><span class="nowrap">Sep<span class="noprint">tember</span> 2021</span> – <span class="nowrap">Mar<span class="noprint">ch</span> 2022</span></span></td>
<td>
<b class="tbtitle">Software Eng., ProgrammWerk</b><br>
<div class="textblock">
<p>Developed <b>custom full-stack solutions</b> for our clients to fit their mid-sized enterprise needs</p>
<p>Worked on a variety of workloads, from <b>websites</b> over <b>Shopify plug-ins</b> to <b>logging utilities</b> and <b>webscrapers</b></p>
</div>
</td>
</tr>
<tr class="emphasize">
<td><span class="nowrap"><span class="nowrap">Jun<span class="noprint">e</span></span> – <span class="nowrap">Sep<span class="noprint">tember</span> 2021</span></span></td>
<td>
<b class="tbtitle">Software Eng. Intern, Jane Street London</b><br>
<div class="textblock">
<p>Designed & implemented a new version of a crucial service in <b>OCaml</b> by modeling it as a <b>state machine</b></p>
<p>Using <b>profiling</b>, discovered bottlenecks in a central data engine improving benchmarks by <b>30%</b>, furthermore implemented <b>sharding</b> to support horizontal scaling</p>
</div>
</td>
</tr>
<tr class="emphasize">
<td><span class="nowrap">Jun<span class="noprint">e</span></span> – <span class="nowrap">Aug<span
class="noprint">ust</span> 2020</span></td>
<td>
<b class="tbtitle">Software Eng. Intern, Google Zurich</b><br>
<div class="textblock">
<p><b>Front-end</b> for a user-favorite tool in a team with three other interns</p>
<p><b>TypeScript</b> and <b>Angular</b> in a modern codebase, took over <b>CI & deployment</b> amongst other things</p>
</div>
</td>
</tr>
<tr>
<td><span class="nowrap">Jul<span class="noprint">y</span></span> – <span class="nowrap">Sep<span
class="noprint">tember</span> 2019</span></td>
<td>
<b class="tbtitle">Software Eng. Intern, Bloomberg London</b><br>
<div class="textblock">
<p><b>Back-end</b> service creating a daily personalized summary of the most important market events</p>
<p>Various <b>full-stack</b> tasks after completing the project</p>
<p>Worked with <b>Python</b>, <b>C++</b> and <b class="nowrap">JavaScript</b> in a team of motivated engineers</p>
</div>
</td>
</tr>
<tr>
<td>
<span class="nowrap">Feb<span class="noprint">ruary</span></span> – <span class="nowrap">Jul<span
class="noprint">y</span><span class="print">
2019</span></span><br>
<span class="nowrap">Sep<span class="noprint">tember</span></span> – <span class="nowrap">Oct<span
class="noprint">ober</span> 2019</span>
</td>
<td>
<b class="tbtitle">Software Eng., uLegale</b> <i class="nowrap">(part-time)</i><br>
<div class="textblock">
<p>Digital lawyer chatbot using <b class="nowrap">NodeJS</b> and <b class="nowrap">React</b> for a small lawtech startup</p>
<p>Built entire software infrastructure from scratch, <b>full-stack</b>, <b>databases</b>, <b>CI</b>, and <b>devops</b>, took a leading role in many design decisions</p>
</div>
</td>
</tr>
<tr class="noprint">
<td><span class="nowrap">Feb<span class="noprint">ruary</span></span> – <span class="nowrap">Jun<span
class="noprint">e</span> 2019</span></td>
<td>
<b class="tbtitle">Research Programmer, ETHZ Network Security Group</b> <i class="nowrap">(part-time)</i><br>
<div class="textblock">
<p>Fully-fletched <b>SSH</b> and <b class="nowrap">netcat</b> clients and servers in <b>Go</b> for the SCION Internet architecture</p>
<p>Many existing UNIX tools can now be ported to SCION</p>
<p>Showed <b>thorough knowledge of UNIX internals & ecosystem</b></p>
</div>
</td>
</tr>
<tr>
<tr class="noprint">
<td><span class="nowrap">Sep<span class="noprint">tember</span> 2018</span> – <span class="nowrap">Jan<span
class="noprint">uary</span> 2019</span></td>
<td>
<b class="tbtitle">Teaching Assistant Discrete Mathematics, ETH Zurich</b> <i class="nowrap">(part-time)</i><br>
<div class="textblock">
<p><b>Taught discrete mathematics</b> to an exercise class of 25 students for one semester</p>
<p><span class="noprint">Developed an easily accessible exercise generator & solver used by numerous of my students and colleagues</span></p>
</div>
</td>
</tr>
<tr class="unimportant">
<td>Summer 2016</td>
<td>
<b class="tbtitle">Development for <cite>Rio 2016 – wir sind dabei!</cite></b><br>
<div class="textblock">
<p>Government-funded event in Liechtenstein to celebrate the Olympic Summer Games 2016</p>
<p>Developed web interface for a swimming contest (<b>PHP</b>, <b>JavaScript</b> and <b>CSS</b>)</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="cvcol single">
<div>
<div class="sectionheader">
<span class="noprint">Things I made</span>
<span class="print">Selection of Personal Projects</span>
</div>
<table>
<tr>
<td><span class="nowrap">Spring</span> – <span class="nowrap">Winter 2024</span></td>
<td>
<b class="tbtitle">pgmock</b><br>
<div class="textblock">
<p>The <b>world's first</b> feature-complete <b>PostgreSQL</b> database running purely in the browser with <b>WebAssembly</b>, nicely packaged for <b>npm</b></p>
<p>Over <b>1000 GitHub stars</b> within a few days after a successful launch on Hacker News</b></p>
<p><a href="https://github.com/stack-auth/pgmock">https://github.com/stack-auth/pgmock</a></p>
</div>
</td>
</tr>
<tr>
<td><span class="nowrap">Spring</span> – <span class="nowrap">Winter 2022</span></td>
<td>
<b class="tbtitle">Generai</b><br>
<div class="textblock">
<p>A state-of-the-art <b>AI image generation</b> platform before Stable Diffusion was a thing, with <b>over 10,000 unique generations</b> from users</p>
<p>Built and deployed a <b>custom AI model & pipeline</b> with high uptime while <b>working tightly with customers</b></p>
<p><a href="https://generai.art">https://generai.art</a></p>
</div>
</td>
</tr>
<tr>
<td><span class="nowrap">Spring 2022</span></td>
<td>
<b class="tbtitle">Eternal Sunset</b><br>
<div class="textblock">
<p>A <b>voxel adventure game</b> built by a team of 6</p>
<p>Created in a highly extendable custom engine based on <b>MonoGame</b> in <b>C#</b> providing great voxel performance</p>
<p>Extremely rapid development on a tight schedule, requiring <b>cooperation</b> and <b>leadership skills</b></p>
</div>
</td>
</tr>
<tr>
<td><span class="nowrap">Winter 2021</span></td>
<td>
<b class="tbtitle">Uncharted</b><br>
<div class="textblock">
<p>Code-driven <b>data visualization tool</b> helping users plot charts quickly</p>
<p>Built as a web app in <b>SvelteKit</b>, utilizing the <b>TypeScript compiler API</b> to infer parameter types</p>
<p><a href="https://n2d4.github.io/uncharted">https://n2d4.github.io/uncharted</a></p>
<p><a href="https://github.com/N2D4/uncharted">https://github.com/N2D4/uncharted</a></p>
</div>
</td>
</tr>
<tr>
<td><span class="nowrap">Spring 2020</span> – <span class="nowrap">Spring 2021</span></td>
<td>
<b class="tbtitle">Evil Inc.</b><br>
<div class="textblock">
<p>Cross-category <b>Capture the Flag</b> challenge designed as an introduction to IT security</p>
<p>Player works through layers of common vulnerabilities to gain root access to the entire <b>Docker</b> container</p>
<p><a href="https://github.com/N2D4/evil-inc">https://github.com/N2D4/evil-inc</a></p>
</div>
</td>
</tr>
<tr>
<td><span class="nowrap">Spring 2018</span> – <span class="nowrap">Winter 2019</span></td>
<td>
<b class="tbtitle">Contest Library</b><br>
<div class="textblock">
<p>General purpose <b>Java library</b> containing various <b>data structures</b> such as multisets, trees, more collections, and <b>algorithms</b> for graph theory, linear algebra, and number theory</p>
<p>Mainly for personal use in coding contests</p>
<p><a href="https://github.com/N2D4/contest-library">https://github.com/N2D4/contest-library</a></p>
</div>
</td>
</tr>
<tr>
<td><span class="nowrap">Winter 2018</span> – <span class="nowrap">Summer 2019</span></td>
<td>
<b class="tbtitle">card-game</b><br>
<div class="textblock">
<p><b>TypeScript</b> multiplayer implementation of the Swiss card game <cite>Jass</cite> running on <b class="nowrap">NodeJS</b></p>
<p><a href="https://github.com/N2D4/card-game">https://github.com/N2D4/card-game</a></p>
</div>
</td>
</tr>
<tr>
<td><span class="nowrap">Winter 2018</span></td>
<td>
<b class="tbtitle">Bobby Trawler</b><br>
<div class="textblock">
<p>Chess computer written from scratch in <b>C++</b>, optimized for <b>performance</b>. Can beat most humans</p>
<p><a href="https://chess.n2d4.com">https://chess.n2d4.com</a></p>
<p><a href="https://github.com/N2D4/bobby-trawler">https://github.com/N2D4/bobby-trawler</a></p>
</div>
</td>
</tr>
<tr>
<td>Autumn – <span class="nowrap">Winter 2018</span></td>
<td>
<b class="tbtitle">Multiple Choices</b><br>
<div class="textblock">
<p>Exercise generator for Discrete Maths in vanilla <b>HTML</b>, <b>CSS</b> and <b>JS</b>, used by many students to prepare for exams. Simple, elegant, and intuitive</p>
<p><a href="https://n.ethz.ch/~wohlwenk/kapitel6/">https://n.ethz.ch/~wohlwenk/kapitel6/</a></p>
<p><a href="https://github.com/N2D4/multiple-choices">https://github.com/N2D4/multiple-choices</a></p>
</div>
</td>
</tr>
<tr>
<td><span class="nowrap">Summer 2016</span> – <span class="nowrap">Spring 2017</span></td>
<td>
<b class="tbtitle">Machine Learning and Artificial Neural Networks</b><br>
<div class="textblock">
<p>High-school term paper about using <b>reinforcement and supervised learning</b> to play simple card games, and a self-written neural network library for <b>Java</b></p>
<p><a href="https://n2d4.github.io/ml-ann/paper.pdf">https://n2d4.github.io/ml-ann/paper.pdf</a></p>
<p><a href="https://github.com/N2D4/ml-ann">https://github.com/N2D4/ml-ann</a></p>
</div>
</td>
</tr>
<tr class="noprint">
<td><span class="nowrap">Spring 2015</span> – <span class="nowrap">Spring 2016</span></td>
<td>
<b class="tbtitle">sb-server and SBAPI</b><br>
<div class="textblock">
<p>Minigame API for Minecraft multiplayer servers written in <b>Java</b></p>
<p>Built as an abstraction layer on-top of the Bukkit/Spigot plug-in system</p>
</div>
</td>
</tr>
<tr class="noprint">
<td><span class="nowrap">Spring 2015</span></td>
<td>
<b class="tbtitle">processing-fractal-flames</b><br>
<div class="textblock">
<p><b>Processing</b> implementation of the Fractal Flames algorithm</p>
<p><a href="https://github.com/N2D4/processing-fractal-flames">https://github.com/N2D4/processing-fractal-flames</a></p>
</div>
</td>
</tr>
</table>
</div>
<div class="noprint">
<div class="sectionheader">
Coding Competitions
</div>