Jack Morrison
- Cyber Security and Digital Forensics at Bournemouth University
- Builds infrastructure, frameworks and developer tools
- Bournemouth, UK
I'm a Cyber Security and Digital Forensics student who learns by building. Outside lectures I write the things I want to understand properly - a Go web framework, a desktop app shell, a multi-server hosting tool while writing up what I learn here.
.......'...
.. ..'`,````.
... .......'....''',;-,'
... ..''`'''``'`,'''.',,,``','
.. ..'.'```,,``'````''.`;;~-;'``
.. . ..'`::::``''''''::;-'',.
. .. ..''.....`,;;:,''`',;::`'`.
....''`:;:,,```,,,~,,,:~:,`'`.`;.
. '``,:-:;~~=+===+=++----,.... ',.
. ...':-;:;-=++*!!lili+i!*il+~:' '. '
.. .'`:;;-+***i*i!ilcooOOdO0Kkx*,. ... .'
. ..'',;~*!ililccxkddO0K0KWMWMKbk;.. . ..
.....';+*looookkkdddbOXXKW@@MMW0Kc~' . .. ..
'.'',~=*icxxxkddkddbOOX0MMMMMM@0bk*:. .
.`..:+++!lcxxkkddddkdOK0WMWWWMMMMM0k*:'. ''
..'.+ilooxkxxkdbbkOXKKK@M@@MWWMMW0W@O+`'.. .`'
. ....`;*okkdbdddxollllodM@MW@@M00Oc,;;. .. ,.
. .'''. .:*lxkxol-;;-:'.``,:--!bWWKO-,;:`` .'
' . .`~lool!~:`,~+ikocilco!ii!+*+icl=~dW0*'':;`.'
.,' .,,```''``,-i!=+-,`,=cKWKKdoxllkb0@MMMKXxiX@X..`:``
``` ,,```'....' .:=':''`~dW@Mb!+~,,,:!*xdbXKKXb0@.```.+.
'.' .:``''...`;;,'=o`,,'`~kXKK0k=`~=' .~*;+xOX0XKM,;`.'lx
''` .:``,`''`,:;==~:;````+d0KO0Mi~=!i+!KOi+odOM0K@~'. X~k.
,' .:,,:;:::;;~~~-:`'``'~kKXXXMdi++lxbdKWW000M0X@* oMco
,' ';,,:-~~~~~~~-:,,````+X0OXXK@0ObOOKMW0WKWMW0X@; -@dX.
', .;,,,;-~==~-;;:,````-iObbbK0WWWKOOKWWWWMMWW0KM- -X@~
;' ;,,,:;--~--;:,,`'`,*cxdbbd0MWWWWKXKKWWWWW000X:.i@O
:, :,,,,:;;;-;,,,``,`:locXW@WOMWW00WWKK0WWK00KKX`;@@`
'.`:,,,::;;;::,``',..=x=xd:lKK0K00KW000W0000K0x.c@=
`':,,,:::::::,`''' '-:kO--b00XX00WWW0000W0XK;;@+
'; :,,,:::::;::,``..``;iOO0XMWW000WMWW0000WKXk,*~
~.`,,,,::;;;--;,'.':+l;=i!~KWMMW0WWWWWWWK0KK=:=.
,,',`,,:::;-:,`..',:+=.,=!-*xxkO@MW0WW0WKK0K,;+
:```,,::::`''`'`,``=!+~:~ioll!ilWM0W000KXKl;='
.`'`,,,,,,'`;.. .'''.,:;;==~;-*+lM00KK0OKO;-;
`'`,,,,::;+;'`'':=ll*!oddkkKWdbb00KXbKdO!,i
'`'`,,,,:;-:::::::~+*!ckdX0M@WXK0KXXbbX*:=-
-'',,,,,:::::::;-=~=+!kbOXKKKKKXXOKWXi:*:
``',,,,:::::;~,;--+cxxbOKK0000XXKXb=;d-
;..'`,,:;-~~;;~*!ck00KWWMM0KXX0Kl::oW
' .',``,;~=--*ilddK0WM0XXWKOKk~:cOKW
'. .''',,,~~~+!**xdcOlxoodxo+;;=X0M@o
,. . ..'`:,;~+!++=+*!+=l*;:`!okMMMMM@+
:,`' `'.,`,:::;~;;:;,`:-!lM@@@@MK0@c
::,`... .'.. ...,''.''`'~+kMW@@@@@MWM@`
.-``''''.. . . .,'-kbc@@M@@@@@@@@:
';`,,,````'...'`;+~!xkMMWMMW@@@@@@@@,
;,,,,,,,,`,,,-=!xbbXXKXK0WWM@@@@@@O.
.:``,,,:::::;=!coxdbbbXXK0WWMMWM@@+
',````,:---~=+!loxkdkbOXK0000W@@o.
'``````:-=++**iloooxkdbXKKKW@@x'
'``````,-+!!i!iccoccokbXKW@@c'
,```````;*illlllliiilxOWMb+.
`=;,,``',*ooooci!==*oXKc:
'**~;,''~okxcli*++ii~.
`~*+~:=xXXdo!~:'
.'`,;~;`.
.....''.....'''''''
.... ....'.......`,,,`'.
... .......`,::;-,;:.
... ....... ... .'`''..'.,--=*~`
.... .......''''',:,`'. .``'''',',,,::'
...... .'.'`'''''```'''```''`'. ',`:,`''`. '-:.
.... .. ...''`,,,,:,````'''`,`'''`'.',' `;:;=*;:=: :,'
.... . . .''...'`'```,:,``...',:,,,`..'' .:;':*~:~*`.`,,'
.. .. ...'`:;~-;:``'.'`'''''..`;,`,;'-=`',.:'
.. ............',::;::`,``''`',,. `-,:-,-`.``':'
..... ..'.'''........',:-~~;:,`'..',`.::;;-`;'.`' '
... . ...''''````'''''.'.'`:;;;;,`'',``=:,,;':.'`' ',
... .....''''``::;-;;;;:,:`,,`:,',=+,;:,:::*-`:'``.`'..=*:
. .. . .''''`,;--:,;-;;---~~--:~*=:-=*:;;-~~;,` ..'' . '+;
.. .... ',,;:,:;--:,;~~~+=*i!*=*ii++!c*==~~-;-;,'' .'. . .`'
.. ....'`,:;,,`,;;~==++**li!!iicxxc*=*!==*+!l==~;:, .. ''... .,
.. . .. .',:-===-~~---+il!***=+llli!*+!loxooxbXbbci=,:, ..'... ..
... . ..',::;;,,:-*!!ii!*!+icii!ilcokxdK0KKdO00WKkkbbi,:` .'.' .',
.. . ..'`,`',,;~+*=**!!!icl!loxkkddbXXKKK0KdKWMMW@WOkkX!'... ... ..
.....''''.`-=~!llloooclccoxxkkddbddbXK0XK00@@MMW0MM0Kdci: ... .. ...
'.. .'..':=!**llcclocokkkkdkkddddbOXKKXX00@@@MMMM0KK0Xl~~` . ..'. ...
.'....`..:~=+**icoxxoxxxkddkdbbbbbOXOObX00MMMMMMM@@@MKXOki;:,'.. .`
.'..''':-~~==!!lcxxxkkkkddddxkddObbOOOWKMMMMMWMMMWM@MKbkxoi;`'. . .'
'`..`.,~~+===ilcoxoxddkkbdddbdkkkdbOKWKWMMMWMMMWMWM@@@@WXo*~,...... ..
'.`' '.~+++*!i!cccxxxkkdkkbddddbbdXXKK00WMMMMWWWMMMMMMMWM@0Ool~;`'. . .::'
.. , :+!iicooccooxoxkkddbbbdkbOOdXKOK0MWMWMM@M0WWWMMWMW00MMOk+:'. .... .`,,,
. '' '~=*+**!lxddxoxkddbbdbddbOXKKbKkMM0O@@WMMMWWWMMMWW00W@Oc=,`',`.. .',
. .. .`:+okkxxddbddddbkxioll=b-*kdxbW@@@@WM@@WWKW00Obd~,:!,`.. .. .`;
.'. . . ..`+lockdkddkxoi-;-~:=~'-' .-=+**iclxO@@000KOWK+-.+::,'.,.. ':`
. .':--;-:``...''`~+!ooxxollc+---=;~=:.',:' .. ``'':iO@W0KKK+=',,:;',, .,.
.` ',~+cxcxkl*+~:,``:;~+!!xoolo!i!i!coi*li===~-~=~!xox!;`=bWKWM!+`'':::-` .`
`= . .,`. .. .'`,;~~+!illlci+~:,`,;~=+xbKOkkddbbdkollkOK00@MWKOKKO0Xl;:oXWMOi'..,,,-,.`,
`:,' .,:,`,,`,``'..``,;==cci=--~~:```,-+lbX0W0WKOklllo!icolckbXWM@M0Kkx0MxlK00@b. .',';``:.
.`',: `:```````'.'''.. .+,----,`''``:+xOWM@MWOxiiil+-;-+!okOOdxdXWWK0KbOdxXW@@' ````:..-
''.',. ::,```'''''. .,';. ; k- `+`.''``=xOWMMWKdc+=~:,'`''..~;-oXblldKKOKKXKK0W@' -,`'' ,K,
`'.'` .;:````'.'. '`-;:-'. =0x, .-`.'`,+obO0KWKWX!+,'`-~,' ~ `='-cdlkKOK00bO0K@,`+`.'' +X@`
''..` .;,`````'''''',:;;:;~++!=-=+,``'`':!kOK0XXKK@Wi*;=oo=!`..,@@c,.,lkbbXKM0KKW@;':,.. ~-.bk
`..:. ';,```,,``'`''``,:;~=~-;;::,''```':!kOWWXbKXM0i+~-~*l!l*cKOxdkx!=oxkbW@W00W@i `, :@X;cO
.'`; ';,,`,,::,```,,:;--~~~~~-;,`'`,``',!xdKKKOXKW@x++-:;=*cckdkO0XXK0W0KKWMW0K0@d`'. 0@b~Oc
`,` `;,,,,,;-;;;;;-~;-~=~~~-:,,````,`',*oX0OXKXXKMWkxoliloxkdbOKKK0KKKKWWW@W0X0@l' 'O@Kil@.
':` ,;,,,,,;--~~-~~~-~-~~~;:,,,,````'':ibK0XOXXXK0M@XkkkbKObK0WM00W0WKKMMWM0KX0@= ' o@@bl@-
.,: ,;,,,,,:;-~~==~==-~~;;::,,,``````,=lXWXOOOXKKKWMWWKXbdXX0WMMM0WMKWW@MWW00KK@! . oW@XMx
`:' `;,,,,,:;--~=~~=~~~;;:::,,``````,~+cOXbkObO00K0M00MWXXOOX0W0WMWWMMWWWWWKKKWW+. .lkM@@.
``, `;:,```,::;-~~=~---;;;::,````'``:=*lxxdkbdbO0MWWWW000WKOXK0KKWWWWWMMW0W00XWK=..,cb@@~
,~, .;,,,,,,::;;-----;-;;::,,,``'``,-*cxoxdkbXOdbM@WMMWWMWM0KXXKK0WMW0W0W0KKWKWb;` -OM@X
:-` .::,,,`,,,:;;;;--;;:,,,,,,`',```=okcokWMKX0KkO@WWWW0000WWWKX000W0W0XW0K0KOWx~ '@@@@,
.:,..,:,,,`,,,:;;;;--;;:,,````',,,,':icc*ibK0M@@WX0M0WW00K0WMWWK00WWWWWK0W00XO@k, l@M@i
.`. `:,,,,,,,:::;:;::::,,````.`,' .`=cc**x0d~-oKKX00KK0WWXKWWK0K00WW00K0WK0XXWi :!M@O
-..::,,,,,,:::;:;::::,,````.'`' :lc;;cW; `lbX00XOK000K0M00W00000WW00W0X0d- lK@K
:`.,:,,,,,,:::::::::::,,``''.......,:`=d0@Mo+xXKMW0XXK00MWWWMM0W00K0WW00OX0!``O@x
-: `::,,,,,::::::::;;,::,``''...''.',+dOdbKOKMWW00W0K0K0WWWWWW0W000KKW00bXO;,~b+
`l` ':,,,,,,::::;:;;;;;-;::,`''..,:-lc*idxxkox0MWWM0W0000MMWWW0000W000WK0O0c~:;*:
;=..,,,,,,,,,:::;;;:;--;;:``'..`-:*oi,-+=co--bMWK@@MM0WWWWW0WW0MWMWKKWKKKO-,-=*.
.~`.`,,`,,,::::,;;;--::;,`....``;:~!-`':-!l~;=xKdbWKXWWMWMW0WWWWWWM0X0KXMk,`-+:
:;'`,``,,,,:::,:;--;:,'`..' ``:::~*:..:~+i=-~+ixllokW@MWW00WWM00WKK00XW@l`;-!:
','`,``,,,,::::::;`'`'``..`,,`,,;kKk=~;;`~icxxiic!!ilb@@MWWMMM00WKXOKXOK=;;=+
,~'```,,,::,,::::..''`:```,,,'''``-i!~=;-=+cOoici*c=;i0@0WW0KWKWW0bOXbc,;+~
,'```,,,,:,,,,,,'.,;,. .. .'`,`'`,``,:'`:~l*-k@M0K0XX0W0KWKKO~:;!:
'''``,,,,,,,,::,:=+` ....':-+=l+=-;=!ixXWKbk!lkolldbxKW000KXbOKxxOWl,:=;
:,'`,,`,,,,,:::-+*-'',,`''`:~+cclc!cokdkccoxK@@@0ddOOKW0XXXKbXMXkbx;,;x,
`:.````,,,,,:::;~~;:::,::,,,,;=*i!!i!lcckbXKM@MMMKXOX0KK0XXbbxOdbx~;:*i`
.``..``,,,,,,::;;;::::::::;-:;-;-~++ixXbX0KXK0WWWKXKK0KKXOKKXbbXx;:;!~
-+'.`,,,,,,,,,:;::::::;:,-;:*~*~=*=+iooddbOKKKKKKXKKKK0OOXWWOOd-:;+~
,:`'`,,,,,,,,::::,,::;:-=`:c;=-~**!!xkdbOXKKKKK0KKKXbOXOXX0Xx~;!il.
.';.`,`,,,,,::;;;::;;-~;,,~`--=iobdxddXXKXX00W0000XOX0KObd!:`!@*.
'-..''```,,,:::--;-~--;::-==+ioob00KXK0W@WWWWK0KX0K0KKXc;':;K@`
=, .''`,,`,,:-~~=+-;;~*!lxiokkOM00WWMMKW@W0WOXbXOXXk+:`=i!@@`
`.. .'',,```::;-~~=-;~*!i+iOkbOX0K0MMMX0XW0MKbXXKdi;`;kXOkM@`
'`.....',`'`,`;;:=+-~~~!i*lcxkbXXXMKbb0b!kKKOOOXk*;;=+XKX0W@o
'.. .`..',:,'---~===*i!*=*xXxlcOc=okcckkoxxl=,`~;;kkW0@@M@b`
'''. .....`.`'```+:,~+~!+*!=!i~-*i!+o-*olii-;,,.!k**k@MWM@@0@@o.
.::'. .. ..'`,`.'=:;=+l=+~;~*i=-k=~;+i~-:,-,~b*0W0@@@@M@0XW@@+
`:`,''' .. ':..''-`,-:;,-,:-~:;~~,-:=',::,;+*=X@@@@@@@@MW00W@@*
::,:`,' . . `, .`'.'..''':,';,`'.,`;. :,;iiKObM@@@@@@@@MMWW@@@,
;;:,,`'.... .`.`. .' '`,..' .,`.;``!+!dkW@MW@@@@@@@@MMMMM@i
-;,,,''. ''. .. '. .... . . .,` .';cdi;b@@@MM@@@@@@@@@@@@@x
;;,`,`',''``..'. .. . ' '.'``:,~iXWXbd@@@WW@@@@@@@@@@@@@x
-:,,,,,`,````````' . ''`':=;=;~bki0@MWM@@0W0M@@@@@@@@@@@@@l
,-,,,,,,,```````'`:,`.`,::+!kkkcK0bKKXK000WMWMMM@@@@@@@@@@@=
-:`,,,,,,,`,,,,,`,,`,;+=+iokkbObbbXXXKKK0WWWWWMM@@@@@@@@@0`
';,``,,,,,,,::,:,,:,;~**iocoxxddbOObXXKXKW0WWMM@MMM@@@@@@l
,:,````,,,::::;;;;;;-=+*!lcoxdbbdbbOOXXX0000WWMWWWMM@@@X,
,,``````,,,:;;----~~=+*!ilooxdkddkdbOXXXK0000KW0WMM@@M=
,,````````,:;-~~~===++*ilcxoxoxkkkdbbOXXK0K00000M@@@!
.```````````:;-~=++++***iilcooooxxxkddOXXKKK000M@@@i.
.'``````````,:-==***!!!!llccooccoooxdbOXXKKK0W@@W+
''```````````,-=*!i!iiiiiccccocccccxkdOXK00W@@X+
`````````````,;=*iillllllllliliiilcxxdXK000Kx-
`;::,,,```````;+!llccoclllii!**!*!lodXKKKb!`
;=-::::,,```',~ioxoxxooclii*+=+*!ckO00x~.
:i!-:;;:,`''`;*okkxxoocli!+=~~+ldOdi,
.=x!=--;,`'',+ckbdkolli!+===*ii=,
.~ll!+-:`',~iokkxooccii!+-,.
`-*!!!+=*xX000Okl+:`
'``:;-~;,'Case files
5 featured / newest first
-
01
Nerve Media
Nerve Radio's listener website in Next.js 16, plus the Go tools behind it that replaced the station's legacy manager, recorder and now-playing software.
next.js / typescript / go / docker / 1 post
=@c *k*. !c; !!i~ +!!! i!!!********i; !!!!****!*~. i!!* ~i*l`;i!!!********! .ik@K!*iiicccccc: @@@@c M@@@ :@@@@@@@@@@@@@d @@@@@@@@@@@@X: M@@@= '@@@@ d@@@@@@@@@@@@@.i@MbbXXW@@!**!=KK @@@@@k K@@@ ,@M@0xxxxxxxxd+ M@@MkxxxkX@@@@:`@M@W d@M@! d@M@bxxxxxxxxk lWoM@@Mdd@XododMd @@@@@@O K@@@ ,@@@d @@@W =@@@0 b@@@! :@@@W d@@@, oxX@@@@@!@@KMK@@d @@@@@M@K K@@@ ,@@@d @@@W @@@M '@@@M X@@@= k@@@, cMc0@@Mkd@M@@@@@d ;' +. @@@Wb@M@M. K@@@ ,@@@K~======= @@@M:`,,,~K@@@x x@M@l -@@@K k@@@c~======: c@@KOXKM@@@@@@@@K @k :0- @@@W o@M@@, 0@@@ ,@@@@@@@@@@@@' @@@@@@@@@@@@@k @@@@ 0@@@; k@@@@@@@@@@@X .l!lcii!!lcl!!lc, @o @@@W l@@@@~X@@@ ,@@@MOOOOOOOX @@@@WWW@@@@d' i@M@c=@@@b k@@@KOOOOOOKc =d*kkO!~ddkbx' oKOOc@o '0: =OOOO~ @@@W *@@@@@@@@ ,@@@d @@@W c@@@0 M@@@@@@@' k@@@: c@d. -:!= k@' 0@: k@o ,@~ x@= *@c @@@W -@@@@@@@ ,@@@d @@@W d@M@0 +@@@@@@x k@@@, l@ `-~:i@: @+ @o ,@; @c k@ @@@W ,@@@@@@ ,@@@O.`''''''` @@@W X@M@O K@@@@@ k@@@+.`''''''` l@ 'MO**+c@, @= @o ,@; @i o@ @@@W .W@@@@ ,@@@@@@@@@@@@@x @@@W W@@@k ;@@@@i k@@@@@@@@@@@@@ i@ !@' *@: @K +@c ,@- X@. '@b @@@W 0@@@ ,@@@@@@@@@@@@@o @@@W '@@@@i b@@W k@@@@@@@@@@@@@ i@ O@bdKW@- :MMdXK@o ,@- b@bO@kX@@ +0WOk .o@K= -X@d, +KK+ ;;;;;; ,-;;;-: -;;;;;;;;;;;;;;;;;;;;;; -;;;;;;;;;;;;;;;, '-;;;;-. .-;;;;-' -;;;;;;;;;;;;;;;;;;;;;; -~cM@O=;-~~~~~~~~~~~~~~~~` @@@@@@d 0@@@@@0 .@@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@0k~ ;@@@@@@W 0@@@@@@:.@@@@@@@@@@@@@@@@@@@@@@@ 0@@@@@WW@@@@@@@@@@@@@@@@@@@` @@@@@@@X X@@@@@X @@@@@@@@@@@@@@@@@@@@@@M .@@@@@@@@@@@@@@@M@@@@@W~ x@@@@M@* +@M@@@@k '@@@@@@@@@@@@@@@@@@@@@@W M@@Mkccccclk@@@W 0@; @@@@@@@@W. X@@@@@X @@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@@@@c @@@@@@M M@@@@@@. '@@@@@@@@@@@@@@@@@@@@@@@ W@0+b@@@@@Md*M@@kxddxbdxkM@, @@@@@@@@@@: X@@@@@X @@@@@@k',,,,,,,,,,,,,,, .@@@@@@d',,,,,,-*b@@@@@@@= l@@@@@@c l@@@@@@l '@@@@@@o',,,,,,,,,,,,,,, W@-K@@@@@@@@b=@@@@kx@od@@@@, @@@@@@@@@@@~ X@@@@@X @@@@@@i .@@@@@@c -@@@@@@X W@@@@@@. @@@@@@M '@@@@@@* MK:@M@@@@@@@@:W@@@bb@dO@@@@, @@@@@@@@@@@@! X@@@@@X @@@@@@l .@@@@@@o b@@@@@M =@@@@@@k x@@@@@@+ '@@@@@@! W@-K@@@@@@@@b~@@@@@@@@@@@@@, @@@@@@@@@@@@@o X@@@@@X @@@@@@l .@@@@@@o 0@@@@@0 X@@@@@@, `@@@@@@K '@@@@@@! W@0+b@@@@@Md+M@@@@@@@@@@@@@: !l~ !li @@@@@@0@@@@@@@b X@@@@@X @@@@@@o .@@@@@@o `O@@@@@@o :@@@@@@O O@@@@@@: '@@@@@@l W@@Mxlcccclk@@@@@@@@@@@@@M@- @@b @@@. @@@@@@l'@@@@@@@K X@@@@@X @@@@@@@@@@@@@@@@@@M@o .@@@@@@WbOOOOOOXW@@@@@@@W k@@@@@@- -@@@@@@d '@@@@@@@@@@@@@@@@@@M@l M@@@@@@MM@@@@@@@@@@@@@@@@@@: W@k ... @@@@@@o 'W@@@@@@M' X@@@@@X @@@@@@@@@@@@@@@@@@@@o .@@@@@@@@@@@@@@@@@@@@@@X .@@@@@@0 K@@@@@@. '@@@@@@@@@@@@@@@@@@@@l *il!!!iiiili!!*!*!!illlll- W@k @@@@@@o K@@@@@@@: X@@@@@X @@@@@@@@@@@@@@@@@@@@k .@@@@@@@@@@@@@@@@@@@@O~ l@@@@@@! *@@@@@@c '@@@@@@@@@@@@@@@@@@@@o ;~' .~*+~` `~+!+~, -*ii+' W@k ;+~ `=ii*- @@@@@@o b@@@@@@@=O@@@@@X @@@@@@Xlcccccccccccx~ .@@@@@@MXXXX0@@@@@@@: M@@@@@W'W@@@@@M '@@@@@@Xlcccccccccccx- @@MW@@M@@@Kd@@@@WM@@@X' x@@@@M@@0M@k O@M *W@@@M@@@b' @@@@@@o o@@@@@@@@@@@@@X @@@@@@i .@@@@@@o O@@@@@@X +@@@@@@M@@@@@@* '@@@@@@* W@@0, ;+ i0* =@@W k@@o ~@@@k d@0 o@@o. ;0@@` @@@@@@o !@@@@@@@@@@@@X @@@@@@l .@@@@@@o 0@@@@@@O K@@@@@@@@@@@K '@@@@@@! W@M l@@, .@@b ~@@k b@0 `@@x @@X @@@@@@o ~@@@@@@@@@@@X @@@@@@l .@@@@@@o M@@@@@@d :@@@@@@@@@@@; '@@@@@@! W@d :=+++*=b@@, -@@+ M@k b@0 +@@; b@@ @@@@@@o ,@@@@@@@@@@X @@@@@@i .@@@@@@o '@@@@@@@o d@@@@@@@@@b '@@@@@@* W@d x@@@0KKKKM@@, ~@@- W@k b@0 *@@` k@@ @@@@@@o .W@@@@@@@@X @@@@@@Xlccccccccccccccc .@@@@@@o :@@@@@@@i .@@@@@@@@@' '@@@@@@Olccccccccccccccl W@d k@@- !@@, ;@@i @@k b@0 =@@~ K@M @@@@@@o K@@@@@@@X @@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@o =@@@@@@@+ c@@@@@@@o '@@@@@@@@@@@@@@@@@@@@@@@ W@d K@K b@@` @@0 c@@k b@0 @@K ~@@x @@@@@@o d@@@@@@X @@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@o !@@@@@@@- M@@@@@M '@@@@@@@@@@@@@@@@@@@@@@M W@d i@@b~,`,=X@@@` =@@W!:,~b@@@k b@0 -@@Mi;,~k@@b @@@@@@o x@@@@@X @@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@o x@@@@@@@` *@@@@@* '@@@@@@@@@@@@@@@@@@@@@@M W@d +0@@@@@@KO@@` ;X@@@@@@lW@k b@0 .xM@@@@@K+ -
02
Bosun
A zero-ceremony Go web framework. Types register themselves; the dependency graph, routes and OpenAPI spec are generated for you.
go
`=- xdl!xk=;' cc!xdXWMM0Oxi~, ''-xkbObO0@@@@@@0Okc*~:' .,,,:-+cb0@@@@@@@@@M0Okc*~:' ,=lkXW@@@@@@@@@@@@W0KXbkxl+=~;,' ';*xO0W0KKK0000000KdOc!bXXKXOddddddbbddddkxkxoi*+;` `+xOXXXXXXObdk~=l:looxxxxoxxxxxooxkkddd*oc!WWW0Xbo!~. -++=+==~-;,`!,``````````````'````,:'!~-cxbK0WM@@@Xl: `=+=-;;,`'```''',:;~~~~~===+++====~~-:::`,:~*icdOK0W@@Wd*' ~lkoccllll+;--~=*illlxxkdkbdbbdbOdbbkkxli!*=~-;;~+ixdXK0M@@d' -+Obxxooocxo!cloxccxkkkbdbOdOdbOdddkbdkddkOdbkxci+~~~~*cdbXKMMl ,o!oOdxooooxxdxdc+-;*OOX0MKX0@@0OW@@XOM000ObbkdkOOXOxi+~~~~*cdbbo, ,Olicxocckxkdl=-,-il~+lildlcoKdoloKKcck@KOKM@MWKbdxbdKOki+~;:;-:l!: xKxocccokoxl!llxdo*o*ilxllidxcloO0@Kooocclb0ddO@@M0XkkdXOki+-'~*`xc ;Wbxocl!**+**i!+:;oWxixMoilb0olObddkkxXdcbXOxciK0@M0@MXdoddbx*;:,'*l xKxooo!+*++!lobkbKXKXX0WKKM@WW@@MOdMOOxXcOdox@kddckb@@@WXxoxddc+-::; obooxlokxxbdbdddkkxkkxdkbddOOOOX00WWKMMOkoKb0xkloxlOXkdXMXdocxbo++;,,, ldoocool!!ilooxxoxoxkkbbKXXXbOddxkkkdkXX0MKb@0oxxbkiicxO0XXbl!+-:-:-cKbo+: !l+=:' .`;+icxdOXKKWKKXOOdbdXOWMKW@Oilcxcl*!cx~-;:;~ixxxkOKOo -, .`:~*lokbXXKXXbddOKWMKkXWk+!!*~~-~~-+*lccli!lbk' .;+iodOXKObkbXWMWd+l!;~:-=~*lddckbXOcidb: `-!cdOXOkdbK@Kd;=;;~,lkld=!+Xc0@kiOX~ ';lxodxxo0o;-;~~+bc-~*!Kk+kK@xObW- =oclxol;;:;+=lodd+~xk-*cdWdxcK* .iki+!;:`;o*iXiOl!d~=*ldWxlcK* ,ok*,`,,xo=lc:lx!~**lOXcikW* ~dx:`'iOi,=*=~::,-!cioxKK- !d+``xXo-:-~~=++~-!xXXo~ ;xc,,cOOxl*+==*ixOXx!: .lli=~!odOOOObbkl*=. =kdx*=~~=+**++!! .:=lxdbbxc*~:' ,;''-*; ;oOKOk!!c' lXl*~+**W@bx!~, -kko+=obbXWM@@@MKbo*-` ,di-xXbkxkdbOKKW@@@@@@MKdc+;' '`.-xOOXXOObdbOK00WMM@@@@@@@M0Okc*~:' `~!cxklcxxdOX0WMMMMM@@@@@@@@@@@M0Okc*~:' ',~!xOKWM@@MMMMMM@@@@@@@@@@@@WKOkl*~:' ';*obKWMM@@MMMMMMMMMMMM@@@@@@@@MW0KObkol!+~;,`' ,~!xO0WMMMWMMMMMMMMMMMMMMMM@@@@@@@@@@@0bb00XOdxci*=-:`,```.''''''. .. .;+obX00KKK000WWWWWWWWWWWW00KKbkkxl,*xdbbXXXXXXObbbOObOOOOOObbOOOOXXOXKK0KWboll=:. `~lkOXObddddddbbddkkkkocl+':bi,+icxkbOXXXK0OX000WWWWW000000KKXXbbdko~+Ki+K@@@WXdl+;' ,*xXWWW00KKKKKKK0KKXXO*.ko`*oxkxxoocccliiii!i!!!!***!!ilcoxkkdkl-xX;;lxdbKW@@@@@MKbo*` '-*ilclillll!++=~-,.+x; ``'.... ......''''`''. .....'.``,:,.oo'+OKKXObddbK0M@@@@@0o~ ```'.'''''.'. .~=.''`,,:--;-----~~~~~~~==~---;-;,,:,,' ;i, ,-+lkO000XObbOKWM@@@@bi, .:*i!!*+=~-;:,`'``,:,:,,`'`:-~~~=~~--;;;;:;;;;;;-----~~==+++++=;;~:```.',:~!lcb00KXbOXKW@@@@Wx=. -;*ocliiii!!i!!!+~--;;:````,:;;;-=+*ilcoxoxxkxkkxkkkocxcl!*++=~--;:;=+*+==~-:,,;=ikX0W0XOOK0M@@@@X+ ;-!dxxocccclllllll;`,;-~*!icxxkbbkkbXOdbKXddXKbbK0XbOWWXX0@@WKK0KXbkc!+=~~~=+*!+~-::;~ixO0WKObOKW@@@O, `*;kOdkxooooocccccdx!okclccclccciioollokolxdkcokxllxxlicxoilooxoxObkk0M0XXdoi+~-~=*!!+=;:;=cO0WXbdbXW@@o *l~c0bdkxxoooooooxxo!!!lcioxc*!ckkbbbOXKKK00000WWWWMMWKXKKXdbObbcckbo!okok00XWMXdc+-~=!ii*~;;=ioX0KOdbK@M* ~oll+dXbdkxocooooxkocbbbbbdi=~-::*bKKKKWWWMW0XK@M@@@KOK@@@@@00M@@MM00KObbbclxolb0KW@WOo+--+!i*+:,;=idKXkodOx. cbiil*obbkoccccxxxokXOc!!o=,;-;-*--di!ocxWKilcdbWMOicockW0@o*ixWMM@@M@@@MMW0XXkicxlxWWWMWOl~-=*i+-,`,~*oc;,dx ,KdliclicccoocxbxobOoi+~;`':~*xO!l;*!oo~do*oko!kKkckxc*xKdWxxko=K@OxxkbWWWW@@M@MKXbllocoK0WMbi~;~*!+-,'```b+;+~ x0Oxcoxocliiixolokl+~=~--!xXKb!~c=+!i**ccci!ixWxOocdiXWXM00bcxbxXccbkibMMWXkbX@@@@@0KOclxcdMMWXl~;~**-`'*l~,cKl ;0XXdxccooxxkxoxxccookOKW0bl=;~oXdilioKOolllcbd+x!+lcKkX@M@0!dx*icci!ckbX!cxxlK@MMM@@@@0Xdicxo0@0bi~;--:*-'',!KO' dKObkxocli**!!!!!iiicc!=:``;=i0WOicllW@l+lcliMMKixdOxbbcbKK+M!o@Wil@kXWbodxl+OW0M@@MWM@@@MXbc!xkd00bi-,`--` ,cO: =WObkooocol~;:::,,`'`',-!c=*oOXKKbdodW00KxckWMM0oxX@WWKxl~+d@iW@0;0d*@bWdxx!bXlx@0XcokWM@@@MWOxxlcddKKx*;;=+;. :!; o0bdxoooxclillli!xdbXKWWWKX00XXKWWKW0KWMMMMMM@@@@@@@@@@@WW@@bcx*O@lxObK-X*0@@odOl!xOXcW@@@@@@MKboccidXXXc=;=!=``:. cXkxxookxicdbbbodOObbObkbbdxddkcxkxodOdxOXObX00K0WWWMMM@@MM@WK@@Mkci!!lMx@@W-dXcickcod@MKbobXMW0bdc*lixKXk+;*!=`'. iOxxxoxc!cilliiicl!iclllcoocooolcoocoxocooclxxclxkclkbokXKK0@WMW@@M0b@@dioXdWildcool!bxioddiOW0WKKOxl+iodd!~~~~;-!oo!;. !bxxookcookoxkockbkdOXObKKObOXObXKXOK0KK0M0XKWKdbXbxkkllxc!okoxOXKM@M@@XbX@@ollbxxKxX!iiicdXXX0X00Kbc*!==;,:--:,::i0WWXx!;. *dxolillli=, ...''.'````'''''`,,:-=*cxkbXXXXKKK0WWMM0W@WdbOxcxclxbbbW@@@@@@lkXX@@oioc!cx!i0d*oilXXx!-`;;:::;;~cdbOOOK0W0Xx* +c;:-;' .,;~+!lcxkkkkdOOXK0WMM0W@0dddlcdodKW@@@@MWMx*cccoblc*+=il*!x+:=*-,:--~!ddxooocookdbO0k ;c!; ',;=*icoxkkkkkbbbKWM@@OXblobkO00M@WM0ckcWK0K+!!==l*+;++:;~~;=!+-===**+**icocxOd` . .`;~*icxkxocodX0@MOXdikdbK0W@WK0WK0i*iloic~-*-,~+~~=;;+lxdbObbbdc*=cbokO: ,+lxkxolcxOW@WOOlxbbX00WW0Wd+*!l*-`+;`-~===~*kxbKddxbObOK0d*+ddkX~ ';*cxxoclkK@MbbclOX0MW0@b!xx~:+~';-~=:-xb*lK+=~`-W!d@0M0c;kdxK* ,=lxxclkK@@xooldK0M@W0i,;i,;-~~`:kOx;Xb.cbl:XW+i0@WMx-Kbb0c ,=ill!iXK0xixodKMK~:=;,~~-=:lKcl+~lx++cMMb+=xMMMMcx@xKKk +dl==oXbkl*oko-;+`;~;~~*c0*k! .~*=o0l-*oOld@Wbl@lOX0, 'cOx*~lbKci!~,:='-~=+=icd=WW=ko,i0d,l=;kkbKKb!0!xKX` ,oXd!-+odl;';-.;~c!=!x0*O@O!*=kO*;-+x+lMKKb+b!xXX, -xbb*,;o+`:;.,~kl++oWo~lK*'kb~-=++-lkxW0oik*OXK; '*xOd+`;:,-.`=dol+ixb+`-KXdk=-+ocxOxK0O~kiiKOK: :!xKd:.'-,'-kdx!:-oo*:~i*=+=~;;-;iKX!do*bKXK, =lkKi..-``cbdc~`:!!*~;:``,'.,-ido=xd!bKOKx ,*cbk;'` ;dbbo+:`;+!i*=--~!cxl-;!l!bXOKO+- -ixb+,` ~bObdl~:``;~=+i!=-,,:+*cbOOKO+l- '*coo*`.~dXObxoci=-;,,,;=*ilodOOXOl=+` -cxi:~,,ibOObdddxxolccxxxdbbOOo~~~ 'lk+!o*::+odbOOObbObbdbOObkl-;+: =dxoxo!;`,-+icxkkkdkol+;,;!c` 'cdkkkxl!+;:,:::,,,,:~!xbc ;+iokbOXObdxxxxkdkxl=, `-!obK0Kbc+: ., -
03
Gantry
A Go framework for native desktop and Android apps with React frontends - frameless windows, tray icons, live reload, and a single .exe or APK out the other end.
go / typescript / react / webview2 / webkitgtk / kotlin
.` =MOl. ;bM@M@W~ ,;`;!dM@@0KX0WM, ;+=:;!lcoxdOK0WW@l .kMMMMi OWWM= iMWM: *@WW. k@M0 O@M0 K@@@' K@@@= O@@@d k@@@@' c@@@@x ~@@@@@; 'W@@@@M' K@@@@@M b@@@@@@0. d@@@@@@@M; bM@@@@@@@@c lMM@@@@MMM@0! !W@@@@@M@MM@@Wc` ;0@@MMMMMMM0KKWWx: b@@@MM@W0W0XXObXKdi: -@@@MM@M@W00KXXOOOKXbc: 'MM@@MM@@W0XKXbOdkdOX0Xk~ bMM@M@@MWWK0KOOkkxbdXOOKO+ +MM@@@@@MWW0KKKOKdbObKXXX0O+ cMWMMWM@@MWMWKXW0OKbOKXXOKXx' '0MMMW0M@@@MM0KWWKW0bOKKWKObO- +0MM@00MMW@@MWWMWWWKdOOXK0KXX! ,K0MWM00W@@M@MWMWMWKbkbdOkkdO* ,okOMWKOM@KM@MM0W@WWbbokbccXX* -*xOWWKXXMM0W0KMM0OXOxkOixKbl ,:=!d0KxXMXWWKXXbKWXkkbXlkKdd .--+!ocXdWWKOObW0KOdXK0ikKk* ,+cococ!oOXXKW0OW0OXXOblkXkk` !XOOdb*++!oX0WXXXXbKXbbdOXkO. b00XKkd*`';*XOd0XOWXOXXOXdX; oWMM00c `*oXbdkO0W0Kb0K+ ;cXXWK 'xdkkMK0W0O0W+ :lxW@x ;likxXXK0O0@: `- ~X@+ ;.;bKXOMW. '; !b obb0d ,~ =d, !KOi :` -k` '**` ; :l' := -i, .** .+*: :++, =* .+= :*+. ;+, 'ci=l= =; `!=i*+ -!: '!!o. +il .i* '- +:~. `k' +i: -i ic~ o~.. +` -:!i'` ;~ `c:=~ ~+ ,-:=~ ;'=: O0Xx= ;KW0W@K+ oW@@@MMMMMb .~xM@@@@MM0WW0Md '=+;`:*xK@@@@MWKKKXO0WW0@i -+io!+*lKMWWWWWM@0OdbOK0MM0Mb =~;, .`;-=ld0WMMMMMWWK' :OWW@MMM0X. ~K0M@MMWk i00WMWWo .KW0WWW! bMWMWM= dMWWWW, 0W0WM0 :@MMMM0 +@MMMMW *@MMMMW. l@M@@@@, l@@@@@@= l@M@@@@k *MM@@@@M. =@M@@@@@= :@M@@@@@O `W@@@@@@@; K@@@@@@@X k@@@@@@@@* i@@@@@@@@M' ;W@@@@@@@@K .0@@@@@@@@@0. X@@@@@@@@@@X d@M@@@@@@@@@d c@W@@@@@@@@@@O l@MM@@@@@@@@@@K` k@@@@@@@@@@@@@@@* dW0M@@@@@@@@@@@M@d. !0W@M@@@@@@@@@MMM@@i ~0XM@@@@@@@@WM@@WM@@Mo` -OWM@@@@@@@MM@@@@MMM@@@k: -x0M@@@@@@@MWMMMM@MWWWWM@b+ x0M@@@WWM@M@MM@MMW00KO0KWMX!' *X@@@@@@WM@@MW0W0WKOOXXXObKKXo~. 'OWM@@@WM@@MMW0WW0KKXXOObbbOXXXXd=' ~M@@MM@@W@@MM@MWWW0KKKXOXOOOOOOXbXd*' 0@M@@@W@@@@@@MW0K00KXX0XXXbddXOObb00c; 00M@@@@@WW@@@M000XOXKOdObdddkdOKKKOOOOd= cW@KM@@@WM@@@MWW0XKX0XddXbxkoxbkkKKbbbbXO!` ;0WW@@MM@@@MMMWMW0000KKXXkkOkobbkdXXObOOKXd!. 'OWW@@@@@@@@@@MWWWK0KKX0KOOXXxkOXObKKXXXXXKKb* ~XW@MM@M@@M@@WW@WWW0WXWXOK00XkbObdOKKX0XbOK00O- !0WMWMMM@WW@@@@WWWM@MWXXKK0WOXKXbdOKXO0XbOKbbKl kWMWMMMKW0M@@@@@MMMMM0000WWOXW0KObKKXXW0KKOdkbb' *KMM@M@MW00W@@@@@@M@000K0WWWXWWKKddK0OK0W0XXbdb0- `cWM@WM@@0WKWM@W0@@@WWW0WWWMKWM00XxbXXXXX000KbOKK!: !X0WM@MWKMM0M0W@@@@@MMM0W@00MWKWbbdxbOOOKK0WObkxd -00XWMWK@WK00MM@@MM@@@W0MW0MMWMKOOxdOdkXblxXXdkdi +ObOK0WMWKWXKM@@WX@@@MWMMWWMMM000bdOdckbdl~cXXXO* ;lcxkOMMKWXdK@@WOMW@MMMMWK0@@W0WKbObcodXOO=oObOXi ,==+cOW00MXXbWWXW@@MWWWKWXM@MWM0bdKdxooOXk-OWOdXl. ;=~+ikOMM@0kkd0WMK00WW0XK0W0KbXOWOXkxkxdx-OMdkXx, ;;-~~+lOXMWbld0MWOWMWWKKbXObbWW0KkokkOOXx-b@doOK; `-~-=+obbbckM0dKWWWXKOKOkKM0WXdObdOXXKb~X@blK! .~-~*=-*ooib0lKMKWOKOd0kMMK0KKXddXKKK0c-b@Xido :;~!*+~+ooid*oK00KbKbWKW0bKWWKdXXK0KObx~k@KidX` -=cKM0Oxlc!=+!ldbOK0WWW0XX0MKKKOOXXdbdbio0M*kM! oKldXOoXMo+l+=!*!kXK0M0KbKKXXObO0XbOkdKkk0W*Xd= 0WdbXXxOxioi-=~-=lod00OOkdO0bb0M0KOddOXXb0dcWb -WMW0@OWMoXXc~...`:~xKbbkW@XbXKMKdO00OKXdO0cXk `bMKM0M@KbKb, 'icckXKbXdbxkOWWW00KOOK0bO .oX0WOM0b@K' '~*ddbdxxdM0XW0WW0Ob0MOK= '=!bKdWO@@i lxdoddbWMO00WWKOOKMKb- -bdbO@@W, :OkdxokbK0X0W00Kb0W@k :--+ckO@@MW' ;ii*xxclWbXK00XbWW@O ,~::,.,K@K@O =l+,iKOXK0OOW0@i ;, 'lX0M= *kXOXdKWM@- `;- 'iXk kKXkMO@b: ,;- +Ox. .:oOdkWi` :-= =Ok- !KOkO! ;;~ -dk' ;Obxd= .-' ;oo, '. `;; ;c!, ;:` :i!' i= *ii- *ic' ~!~=* -*==. ~+~*: ++*~+- ~*=+ .~~+~ -+l, .++=- .';~+c=` ,+=-~ :il*!-io~ ++=' ,o*i!*-o+ =*` +ocl*l+~l *! . `oi=*+; '+**i. '+o=cd, !!=o* *~=k! :!+x! cd, ,`!i ++~;l` :di dd!+ ;*+ ~ =ib: xl` i*= lO*x~ ic~`,` -!*: ' :l !kk;~* =; -i!lll ' `*; *! .c' '+!; -!*o*oO~ '=+~ ;+`;';i, .++ .` -
04
Archon
A Go terminal client and a small node agent on each server for hosting Docker sites across several machines, with the reverse proxy, SSL certificates and DNS records set up for you.
go / rust / bubbletea / floem / docker / nginx / certbot
,!!!!!!!!!!!!i, =++++++++; lXKdddddddddddb~ 'dxkkkkkkkl` ..........''''''''````',OXbxxxxxxxxxxxk- ,doxxxooxxl-::::,:::::,:;:::,,:::::,:bXOdkkkkkkkkkkb- .'``,,`,!iii!lc!i*' ddoikolllllllll: '~~~~~~~~~~:'. .'``,,,``'. '''''k:.' *l+l=;;;~;;;:' +Oddddddddb+~=:,,,`'. :k -i*~+!` '' +koxxxxxxxx=;-. l! -c!;=- : +dxkkkkkkkk=+i, b, '=l+':l-.`` `` ';;--------;=+=*+~,. :b `+!;lokollccc` , ...':=**=;-' li :**, kdclcccll` `' '. .`*c++-`. O: ;!+' :i*;----=i*. , .`' .,~***=:' ,b`;;, ;*=' ,:ic` ,-, `. ic*loccc+: .,~+*=;` `cM@@@MXl:=o*~xi+-cl`. :-: ., .ccccccokl!;,`..',-++=:~M@@0MWWMMWMWKMMW00M0W0Oi ,-: `. iiiiciil*=:;-~=====+!c@@MM0dkkkkkkkkkkkkkkkkkdc. cXbxockxxxc*. . '= .. .`'=WKKXKdkkkkkkkkkkkkkkkkkki;-;;;;;:::-oxdxxxxxxxxx' ;; .xdkkObxkkkkkkkkkkkkkkkkki'..''''''',oxdxxxxxxxxo' +. !ci!dbxkkkkkkkkkkkkkkkkki. ~ol!!!!!!!!*. `= .~i-';:kOkkkkkkkkkkkkkkkkkdl. .:;` ~: '+i- .-xkcoooccoooooooooooo!. .;-` * `*!; .;++;.''''.+c;'''''''''''. '--` := ,!!, ;++;' .,: `--' +` :!+` ,=+;' ';. `-;. .! ;*=,`~+-' , ,~:. -- ;!*--=-` ,--';:::::-: .''''.i,.''-li+~;` ;@@KcM@MMMM~ 'iX0WWWM@MMMMOc;' . -Xkddkkkkkdl :+!!ilccooxkoi-~. ....'''`````,,,,,,,,,`-ciiiiiii!i~ ...'''````'.'........... ::,,,,,,,,`.................... =dOdddddddddddddddddddd; :::::::::::::::, *bKKbkkkkkkkkkkkkkkkkkkkk- =Okkkkkkddddddkdl` ;0XbOdxkkkkkkkkkkkkkkkkkkk; *dcoooooooooooox*- -KOOXdkkkkkkkkkkkkkkkkkkkk- +doooooooooooooxl!-------;-======~~~~~+**+=======+!******++=iXOOXdxkkkkkkkkkkkkkkkkkkk; !boxxxxxxxxxxxxx!=``````,''''''''''''''''......... .. -KOOXbkkkxkkkkkkkkkkkkkkkk- .'`:;--:!xllllllllcllllc+~ -KXObkockbooooooooooooooxx; .'`:;-;;:,`'. ,=======~kd-===+- ;Ol!!=-ibi=+++==++++++==-:. '-----------------,. '`,;;;;;:`'. ........`M* '.. :cb*~Oc;-~~~~=+~~~~~-,' oObbbbbbOOOOOOOOOb*~=~, '`,;---;:,'. =@' .+kl`~k~ ; xxooooooxxxxxxxxxo-;~~=-;:,'. dO *Xdkl' co' :, xkxxxxxxxxxxxxxxkx--~~- .@* ;Xdo~ -d+ .; oxxxxxxxxxxxxxxxxx----- =@` -ok;`.'ox' :` xkxkkkkkkkkkkkkkkx--l*~ dX =xo~ ~k* '; !iiillllllllllllli-~lxkc*-' .@i .*kc+llicbklilllllc~ ;` ''`,`,,,,,,,,,,`,-;,':+cxoi=, ~@, '!kl, ~bokbc!lllllllc= '; .`` `~ioxc*:. kK ,ld!' -dOxillllliilll~ ;' .`,' ';!ckocbi. @l ;ok+. lKollllccccolic= `: `,' ;bc+xc+: =@: ~xx~ `ok~~--~~~~~~+cl~` ;. '``. ..`-ioxo!-' d0 .+ko; `;~xK* -*; ,: ,, ... `;*oxxi~, Wc,=**=-` `!dl` ':=!=+bk, -!~. ;. ;ox*=loxxxxxxki+; ,=lxkc*:. .*K@@@@@@MKk*' '!o+ cd+=-, -x= ;!=' ,, !xlcl*lccccclc~;~ `~ixkxi~` *W@@@@M@@MMWWM0cxWXc!iOWXdl!!x@k!ii+;` :!+` .; *ollcccllccxkkli!:`'. ,=ckxc+: k@@@@@X@@MM@@@M@@@@@@@@@M@@@@@@M@@@@@@WO- ,+=' `` *xccccccoccccoiic!lccccli!*=-,. .,-!cK@@@@@@0Kbdddddddddddddddddddddddddddddbk* :iOo===+;~======-:`. =l!iii!cc!iiii~-: .`,;~+!lcoxxocic@@MMMMWKOkxkkkkkkkkkkkkkkkkkkkkkkkkkkxxkc~ .bOXW0KKKxXKKKKKKXObx` ..... i: ..... .',:cM0000KKKOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkc=:::,```````'''''.`xkkdxcccxcccccccccoo, 'l -0OXOOObKOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkc=====~=+++++===+**+llldkooooooooooooooo, += 'bdkkkkkXOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkc= .xxxdxooooooooooooooc, c' ;xcccclOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkc= .okxbdxxxxxxxxxxxxxxx, :l =di!**+OXkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkc= :ci+===============. i~ +do:`~=~-bXkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkc= '=*; .x. .!dc, `::bXkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkko= `+!; ~i 'idi` '+OOxxxxxxxxooooxxxxxxxxxxxxxxxxxxxl~ ,**: o; ,cd!' '=co*:---------==*=-------------------:` :!+` `x :od*. .~lo!: lOo~ ;!+' !! -xk+. .~lo!; ,:;. ~!=. k, ~kk~ .-ioi;. ,;' .=i~ ;x =dx- ;!oi;. ,-' '+!- c= .*do: ;!oi-. `-' `*!: .d' 'ibc` :!ci~. ,-` :**, =c `lb!. `*cl~' .:` ;!+` x- ,cd+''=cl~' =kxxx:=kxxxxxxxxo+. `k :cx+,~ll=` O@@@@O=K@@@@@@@@@k. +dbdddddbdK0ddddddddkl!l=` kWOOOKXOOOOOOOOOO0! .+b00WWMMMM@@@@@@@@@@@boc; kXoooooxooooooooox~ .-loxxkkddbbOOOXXXKKKbxl=-+' ..''`,`:,:;;-;-----~;cxooooooooooooooco~ `-;;-~~~==+++***!!!!!**;:--' ...''``,,,,:::;:;;:;:;:::,:,,```''.. *c****************; ....''''`````,,,,,::::''`````````'''''''.... `=;;;;;;;;;;;;;;;;` ..... . ................. -
05
BluePortal
A Go and Next.js commerce platform for selling digital products - Stripe checkout, licence keys, signed downloads, an event-driven worker backend and sandboxed product builds.
go / next.js / mysql / stripe / valkey
. '. .`'.. .'. '`,:`''`. ``'`..``..'`' .. .'' '.. ':'..```. .':. .. . . ''.`' '`''`, ''''`` ,,`'. .. ,':;`'.``=:'`.`;~,..' .. '...... ` `-;-:`,,;`:~:`':!=.'' .'''..'.','. =-~--~-;;''~*,~,~``,' .,-~;,--,' .' ,+!++=+~=~:,:-=-=;,.:;. '`:::;+*~'. .. :+*!ii++=+;,:--iil*:=-,.''''':+!:,~'. ... !+~lcli!!+;-;;;+xxb+*-`,'''':-=;,':, '`:;,`.. -i=*cocccc--;=~+!bOXcxk+,`,;-~-=~++!;``::```'' '*i*iokxci=:;=+!!ikxbbdx+;*i=;-==-ibk=~;:,' ;ll!ckkx*--:-;~!!xbxoXKk!+li=~;~~*oXWo;,`. .,*ccixbxi~=~+~-*iibdWXXOdxc!+=-~**i!cl~-~; '`~!ocobOo*=+!++*-*cXdK0W00bxool!l!~;-:`,;~+''` . `,-lcobOboi!c**l!--xK0M0WKXbdddKb!~`:;'. .`-:' ',-lxdObxo!iilclcl+idM@@0KKXdk0Xl-:,:'. :+;` . ,:-obOkbklilcooccoxkxXM@0W@WObObx!+=::,`x+..'`` '. ,:=kXkxbklclcocclkOxxX@@WOX@Mkxdxl!*ol;`:',-;' ''`.';*oWOxOkclclllxkdOdbObxllcW@XXdkc!cc~,,',`;' ':,`.,ld@XbkddcclcxkbXWXbbkolckdXWKddxoi***::' ';,,::l0@XKxkkkkoxkbOXOdxxdbxdoooodxok*=-,:` --;-+*WM@0kddddkddkddkdXOXWKOObbKkcko~:,'.' .. .' 'i+~; ,~+locK@@OdXXbOXObdxkdK@@W@@@@@0Xxc*~:,`'.'` . ',;=*+~-,,~==*i:`' .:-ioxxK@0bOKK0XKObbdddOKW@@@@M@MXx+--:,,,:~-.. ` .,;:`'':~-+cokx**===!!ckkkXMKXOXOXMW0KMM0KXOX@@@@KM0dc*=~;::::,' . .:. .'`;-=*i!=+!!lcxxkkbO@WKM0KW@@@@@@@MKXXW@@@@0boli*=-:`.. .' .. ,:=` .':;=**!ilccoxkddbdobW@@W@@M@@MWM@MMW0XOK@@@Kkol+~-;,.... .' '. ',:;+iii~`,``~=!ldbddbO0M@@W0MMkobW@@@@@@@WWWMW@MW0WWWWdoci*-:,`..... ''' .;`,;+--+**~-::;-~*lcoxkXMMMWM@@WWOckXO0@@@@MM@@@@@KKKOdxoli+~;```'. ....'..''..:-,,,'``:,::;::;~+ilooxkOKKKW@@WMM0XKXxooxK@@@@0OXXkkxookkl!*+*!*-:' .'`. `,,`''' ..'```;=*iiicooxkdOMWMM@MMM@@@@@d!*lbX0MMWKOdxcoddo*+==!i!~~:' .``:' ,-:,`'' '``,-*cclloookxdbX00WW@@MW@@MWKKObbxl*ikbXKXKKXXbkc!+~--;-*i; .`,,`' `:`::`. ',;-*idkcckbxxobK0K0MMM@WWW0KXKK0Odxo*-,.',--=!llxo*~-~~-=il=, ';-: `:` ..':*xkdKkxldXxkokX0W@@@M@MKKK0WWWMbxoli+, '--;,.. ';;`. . ,;=++d0M@xckXxoocxkbOM@@@MXXX0KK00@Xll!+=;. . . `~!=:`-. `;!odcccdKM0Kbxllcoxxxdb0M@W000KKXXXWWi=---,' ';**~-```:,~*oco0KOWbdb@KlcokkocokdkOW00MM0XXKbOKWk;:,``' ':=~;,`,:`=lkllkkbWbdW0iixkdboxddbKWKXKKObbkbOXKXX*`.'`. . ... `=l!*oo**cd00xboxdkxOObdX0XKKbdkxkkxddkkOi~ .. ,i==-=ld*,=ldM0XMWKKK0@MMWW0ObdxxocloxxxloXc~ ,id*;=*i*=,!oOW@WW@@M@MKbbXKdooilli!*!ckiilkk~ `!cc*~+*!*;=okKM00W@MM@Kclcxiilii!!~~+*io+**lc~. :!` `;*!l+:~++==*cbdKX0MKXWKXdcccl*++oolll*+lkl!+oi;; `;' `~**+;-~==~-*okbXW@@OObkdXd!!*--*i!ll*=ixk*+io*;; -ll++~~=-:;~iokO0XMWoii!!xl**~;=i***+=+cbx==!i=-~ .:=*==~;-;=+*icoX0OWb*===+=~++;=***++**lbo+:-=*-:= ';;;+!ili!ixX0Obk+~;-;:~==~+==-;=!idO=-,:-+;,~' '',~+==*ckXKWbkl--;`,,-!l+=~---+llXc~;:;--;';, .: .',;=x0MW0Kxk+;:,`:;-+i-;-,--+iok*,`-~:-:.;` `: ';lbKM@MXcx*;,,,,::~-`;-:;~+!xl=',~-:;``-` `~!codXkcoki+``:,,,;`',',-**!l*-':+;,`'`~' ':=l!lxc**ii~,. .',,,`'..:!*+i++~'-~:...`~ .,=i!=oc+*ll-:,`'`:`.`;' .:=~!i=+:`=,,'..'- `~!=~cl+=+oi=~*=::`'.''. ':-i*==;;,-`:. ,`, `;+=~oo==~=i~=+il;'.. .';*!-*::-,'`' ''' . .:=~-lbk!~-~:;=;-=, .:~++!~,:;:.'` . . ''.,++;!xcbc--,`:-,;,. .'`--:!*::`:~.','. .':-;,=xo!ii=,`,;`.' . `-=+=-:*~::.` '..`' ',:::-ikoiili,.,:..` . ':;!~::;-''. . .' . ',;-;-~!ll!=:`''.... `,`;=:,;,.,' ' '+ ',,;:;--+~=,. ... ..'`, ;:,;'.`' .'```:,:::-~;' .`' ,`'''. ,' `` .. .'``'.''.,-~~='., . ' .. ,,. ..''... .,`''.. .. .... .'.. ... ''.` ' .` . .:. ' ' .. ``'' .. '`.. .``,:`'``'',` .' .',`,::,'' '` .. `,```,,....``''. ..'` .. ...,,'.`. ..,,``..`,`,`,. ...,. '. .`.'. ''.`. .'::''. '`,''`` . .`;` .... .' . '. ``:` '`. ..;, .'''.'``,' ..,;;,' .. . `. ',`..'`. ',`'`,.';. ''.'`',```` ,;``,'.. .'. :.'::;'`` . .'`=;`,.`: '`'=-:' .`, '' .'`' . '. , .= ,;:~,``..=:'-+-,'``''`;~!-,.,.'. ' . . '.. ','. . + =~,--:-',:``;-`,:;-``,`.`+!i:`'``'' ''.''. .'..'``,''. `i,-~-;,`;;:::;''`:!o,,;;,,~!,' .''' .`:::::`',,```'.'''''.. '' ++:=~-;-++=---~'.`:;l~`+='~~``':,`' '`;~~=;,;:+=::`'...'. .,,-l~*+=-!*==-*;,;:.,;:=-;=+,~;`.'!;'. .`,,--;~;;-;**-,. .'. ,;~ll-ii*~+~+-=!~:,::---!=~+=;;'',`',' .,`'`,``::=ll=;` ...''. .~*=ii=il!++++-!-;,`,:--;lo!i!*;:~!=;-' '`'.'''',:~io-::;l:.'. ...... :l!:=i!cci**l=*+~`;;:;;;;~ooldOl-~+=:``''`.'`''';+*=:```'~`'. .```,'''.. `+c=~*locll!li=c*--=-;-;-~;cxikOo++*~`,:,.'``''':-:~+;-,'.`:,. '`,,;-=,`''.. -l!~++loclcoc*xo~;~;,~-~~*~kbdOOkllko*;;,''',,:+=-;+=;+~;=*~,. .:-``,:,`,,`. ,!i!~!+lxxcoocox+-;-:;+++=*!cKbOWbocbOdi,`:;:;=;=:;=*~-+!!oo+:,;--:`,`'...... .~*c!*iiokdooicl!--;:~*++*l!**dkxKXddoxl=;;+*ii;::~~++--+lkkk*;=~;,,:``. ,=io*!iloxddoo*-~;:`;+--*li!iOkocckb0Ool+-~ioc!-~~-~=~-=!lXKKx*~,`,:`'. .~+cc*icckdkxo!-~~-;;~;;-!!+ioOddxldKK0Xoi*+lc!~==;:~~==!cxd0MOl=:::'. .:!ixlllixOkxll=;*~;~+;-;=*!libxbWWbOObdxocici**+~~;;=+*!lccxXdc=:-;`' '.:=*icllicOdbxii~=*:+!==~=+oliiWbxKWX0KXXObdoc****===*!!+!*+=*+~-;-+=+=. . .``=~*cooiobbbXo**~=~+l*+=**-~i=!OXkOK0MMMKKKOkcxcco!+il!*=~;;;;,`,:-~~!+'..,,. `,`-~lxoocbbOXboi!++il*=*i!+:,~xbXKdW0KKWKWWOddkbdkbxoci!+-,`--``''',,,--,,,` . .`,`-+ccloxOOObkoc!!loi=+il!!=:-ckK@X@@M0MW0KOObkbbxbMXk!=-,';-,'.... .';~:,. . `:,:*lcoxkXdOkckl!iiil!llllll*-=*oW@@@@M0XdOKObdxkXKXki-::``:`'... ;;--:' . ',`:!!ddbOOdOxoc!i!iilcxclccci*lxob0@@@@KWWW0XddkKWKbl+~;;;;,''.. .!x=:, ,' . ,,::*cOkKbddOkociilccoxoocccocckkodKK@@WKW@@MMOOdKKObxl!+=~-;``''`iO+;''.. `;, .' -;;-*xOdboxkbkxl!lclocooocllxkOdccdXX@@@WXO@@@MXdcxkObdli!!+;==~;`=x;' .,;::' '' :,:~!kXXbokdbdcicclilxxlcccloOOkxxOKM@@@@KOOX@@Mdkkddxlli**ioK+;;'.,' :~:-:. .'..'.. ,:;~ixXMbxobXkolccoccllilokxxOdkkkdOXXOkoxoodM@0dkdOdocc!*!odo;`:,'..--:*: .``,`'..:-!lob@XkxbXxkol!ccllllcxdkdO0KdbXbdkcl!illx0@WK0Xdkbkllicc+-;;:,``;` .;' ',::,`'. -ioxK@0bbbxkXkoccclcoxxkdbOOWWbOXbdxxociiobbOM@@MOkbOkkxc!!i**~::-` ' .,;,,,,,':lob@@0k0dodOxdxoklcxxdddO0W00bkkkdddxloXbxxkdbbdkkxoli!==++=i~:`' .,;,,,,:;;!x0@WKOMxokokxkdocxxkddbOObbdkdoxkkOdkbdcooxocodbxcobo+++-,'''' ,-;;:,:~~+x@MWMMWdddddddkxxkbkkbbObbddddddkbXOOxkkxkkkkWbooxOO!;;;,''.,' '.'. `---;--+*+lM@M@@0kbdbbddbbddbddkxkkkkdOKWXXM@W0W0W0OXX00ccoxo*=-::,`'''' ..'. . :ko-~=;. .:~==!ioooc0@M@MOdbbXXbbOOOObbdkkxxkdO0W@W0W@@@@@@@MW0Xdooc!*+-:,,``.. .. .... .' ..`;-~~,'.. `:=+~=+~;. ';~+lcoxkx0@@@0OdOX0KObOXXXbbbdddddbXW@@@MMMW@@M@@@@0OXdci+~-:,,``'```,=:`' . ..`':-~ili*=~-:`,;=~~+=~cl-,``'.. ';:~!cooxkx0@@MXbbXK0X00KX0KOObdkdddbbbXKW@@@@@@M@MM@0XOo!+~--::,`,``,-=*:. .` .,;-~~;```'';~~;;=!li!ldx+=~+;;:;~**=ixxxxkkK@WWObXOKKXXWW0W0XOXKK0XbbbbbbO0@@@@@W0KM@0Kdl!~---;;::;;;:::,' , '':' . .',`''''''`;~=~=icxxxbxi!!*+!*+*!lllxkkkkdd@0K0KOXOOObOM@WMW0W@@@@MM0KKXKW@@@@@@KW@WXdxol*+=~-;::,,,:,`'. . . .,; . ...''',;-~*llcci===***iiiooxxxkkkdbdW@0X00MKXX0W@@@@@@@@@@@@M0KXKKW@@@@@@@MWKOxxcii!+=~--:`'.. .'. . ' ;;` .```:;=-::;=+****!liicooxxkkkxkOKKM@@MKW@@00MM@@@MM@@@@@@@0KKXOXXK@@@@@@0OOkcl!+*=~~-:,`'... .'' . . `:,:!'.. .'.,::-++=+iillllcccokoxkkdbbbdkxdXW@@@@00@@@WW@@@MW0WM@MMMWWMKKObXW@@@@@Wbkxoc!=-~-;:,'' ...... .,. . .,;:;:;!!*o*, .`````;~~*i!lxdObdddbOdbbKKKWW0KXKWKdloO0M@@@@@@@@@@@@MWWWWWM0XM@0M000KMK@@@@Xdkocil*=-;;:,''. ..... ``'. .`,,,,:;*lili++c-::,`'`:~~=*loddkxkkdbdKWM@@@@MWWWM@@WkcxkbM@@@@@@@@@@@@M0MWWMMM@@M@KKWMWWWKKblocli!*=;,,,``' .. .. . ... .:;`',:,=*,;==!c!=~~;;;:--;--=!icccooxkbXW@MMMMMW@@@@WK0Oxlkb0WK00W@@@@@@MMWMM@@@@@@MX0WKOXOddxol!l!=~=:,,,``'.'..... . '''`'. :-;'`;-~!,;:;!-;-~-~;::,;:;=++!lcoooxkkOKWM0000W@@@@M0MW0OokkdxobWMM@@@@@M@@@@@MMM@@KXXXOOdkooxxli!*+~~-:,,```,' .. ..'''' ..'``'''`--;,;,:,.':'',::;:,:::;:;--~+!illooookkbX0KKX00M@@@WM@@WKKKKKWdxlcookKM@@@@@@M0OdOKXdkkkkxooxddkcii!!++**!!+-;` .' '`'. ````'''''': `' .. .,:.. .`''``,:::;-~-~++!ilcoxocxxkdbOK0W0WW@@@WWMWMMMWMMMWMbl!===cKM@@MWKKKXbbkkxccllxkbbbxi++==+*icoc!--~;:`'.`''`,;;:' `,;:,,```'.. ...'`,`.`:~*!!lllilcccooxxkddbW@M0MWWM@@WMM@@@@MM@@@KOc!lccokdXWM@MMM0XObdkkxkddbdkci+++=~=+**=-~+~:,'. .'```,:. `:;;:,,`''., .'`'``,~+i!llcclcllcckdxkddbOKMK0WMWM@@@MMWM@@@@@MWKKdbkbbkol*!cdKWM@@@W00XOdkxkxcli!!*=~~~~=~-~~+=-' ''`,'. .. '-~;:,`````.. .'`,,:;=+*ckklci!kddkoxdoxbOKK0XK00MW@@@@WW0MMMM0KXbKOW0bbdkoo!~--=*~*llcxkOK0WMWKObxci*=---;-;:-+lbc+-..' ',,-+=;` ';:,,,;`,'. '`,,;;~*!ibboccccdbxkkxokbOXXKK0WMWMM@@M0WWMM0XXKKKWbK0bbdkxoi*~-,'..',;-:;-~+!lodOdci*===~~~--=!ic+~~'. .,;-;:, ...'''=,,`. '`,=ii*xxxXbdooocd0dxkxookXK0W0WM@@@WM@@M0K0KKK000WM0W0ddkxocii+-,'.. ' '`'. ,:``'``,;-~++==-;:``. .```. .`:,' ` .''`:-=lkdkkXWboxolcOXbxdbckxdXK0WM@@@@@@MMM0KKK000WWWWW@@kkxocli!*~,. .`~:`:`'. .. . ',;:,`.. , .`,,~~~=iOMMKM@klkocb0dxooolooxbbbXW@@@@@@@MXOKXKK000000WM@bcocli*++~:` .,'' ';~-~:,`'. `=~=li!**cdX@@@XkcxO0dclccocoxkxdbdO0M@W@MW0XXXX0KKXKKK00M@Wli!!*===~:` '. .,-+i*~;``,!' .,;=ioxxlixcodbX0@@0XWdkolclcooxxxxxxbkOKMM@@W0K000KKKKKXXKX0M@x**=--~~;,`. . ':-=i*=~-;=''... ..':-=icoxX@MxdkkbdbdXK@@Xcooclcoooocoookdxdb0MMWM@@MWW0KX0KOObXKKW0==-:-::,``. ..`-*!*~;:````:-;;-!!!xo!ccOMXXWMWobbd0@XccllodkOkcccoxoXbxdbOWKXXKWWWXXOOXXXbdOWX0Mo;-;:````'. .,:~+*=~-::,``--::illbkllodbdbK@@dxXX@WxlicxxddKOoxxdbdkdb0WWKKK00KKXOObdkd0bbKMXKWki;'..''`'. ,` .',;:,,,`''``'.,*iioo*iococxdXddb0MWdi!loxkkxbkxxxdkddO000KXXXXKXbbdddkkkbOOKKddWk!!, .'`'' . .'' `;=!oi*=coko***cdbb@WclbxlxkddkxxddOdkdkX0XXXK0KbkkkdxxxkxxkddkxkxbOc=* .... ..:~-~*c~-+lkb*,;~+cxdW@Od0@0bdkdbXkbM@WK@KO000XKKXKbbbxkoooxkkxxdooxcdXo++' .. .':kc-=~::+lokd+`:=*loO0MWKOK@@@0MW0WMM@KW@MKWWKObbkdcooocoiiickocdcclob0x~=, .';lxc!;:;=!lci**::=ilxb0MMW0K0W@@WM@MW@WKOXM0@0bkxocilxiiclli!!lxbc!c!xcbX!*' ,-*xdx!;~!*+!!==+`:*okOKW@@@M@@M@@M@@@0dxxoxbodkccccciiii!*+=*!iixkl*+liixb!=` ~!ccxi=+==*=iii~`,idoxO0MW00KKW@@@MWMMdxlcccko*llilli!*i!+~~-=!*icki~+i!*ok+=; . ' .`-*c=!l*-;~*!i+=i=+iccbdb0KOKK0MWW0WWMKObllolxd*i*i!+icil*==*!*++!lol!!!+*oo~~-' =di' `:-~+*lcc=`;+=~===--=*!xOdbKWXXM@WOObWWXKbOxlbl*xi*++=+!kxoxxxol++*lcOcll=*ixo;;-: `-i+' .''`:=ii!!+-;;:-~*+~~~=!ckdkbbOW@@@0OXKOXdbKXXxi!!l!~~-~*cl*!lcci+=!lckd***+ioxl--:; .. . ;=*++==;;-~===~--~-=!coxkK00W@@@WbObokk!xbXbc**i*--~~!i**!i*!+-~!iobo!=*+ll!!--;- ' . .*i!l+-=+=~++~~;;;;-*ioxdbO00XW@@Xcci!ll=oxkl!!*+~;-~+i*+****+=++!cbbd!~==!ii*---= .. ;,=!iklii*~-;-;;:,;~*!lookdXWKOO@0oi*=*!==!!==+*+~-;;=ii+!!+*!+=*!ldXxi=;-+*!i+-:~+ '',~++~-;--;-~-;~!!*!!!llokWK0XX@Xo!==~~==++;~++*~;~!*++**==++*+iidKo*=;`;~~+*;;,~= ..' .,~=;:;~*+!iiii!!ilcdK0KOKObl*+-;-~~--:=+=*~~=!~=++-;;=*iilc0d*~~;`:--~*~`:;*, ':::;-~*!!*illillldOK00Okkdl+-~;;;:`,;-==*===+==~-;;-+*iliO0k+=~,,:;--+~`:,-~ .'',:-++++++*!lxdXKK0Wdxbx+-;=-:,,:,,;*il!*++=~~-;--=ll!xKbi+-~:::;~;~-,`,;+ . '.'`;;---~!xbXXW00WKdkdi-;;;-`'`,:--+ioi-;=~::-=-;*cickOo+~,,;:---:~~`'`;= ,=' '.`,:;-idWM@MMX0Wdood!~;::,,,:::-~~=i*-:--,`:---**ioxxl+:``:~~-;:=:..,-: .~!: ..`,-ixbK0M@@WWMklok*~;,,,'`,:,,:;~~;:::=-:;;-~*+ickol~`',;~~-`--',',-; , '`=!lkOOXW@WM0xcok*=;,,,;,,,:-,;=~``,-;`,:;-+**ikx**-.',;+~,:=,'``:-- . . '-=+lccxdXKObooxxdic!:''-::::,`;:,.'::'`:;-++=!ic!*+:.,,-*-,,,`'``;~~ . `:-~+ciicodkl*!!ixo*=:,. .'',`':,:,.',''`:;+li*+i!=*+;``:*~~,`''''`-=' ` `,:~=oi!llxkc!*!!ic+=;`'.....',:::,```'. ':*c++++l!-+*;'`~+::: ....`-~ .`,-+lx*=!xki*!!*ii+::-,`..'',:,,'.,~,'. .',++~=+ll*=*!``,~~`,` ..'.`;~ '`;*ii+~~lkl+++*cxc=;;,;::'`,;:''.',:`.. .`:--;*l!+~=~~.`,*-',;...'.',~ . . .`;*!+=-=oxi*===+ok!i~;++==,:;``'.'''`.. .,;-~*c+~=*-`=:,:+,':; '':.`: ':;+**+-=cki+=====io-=*=!lc+:::''`'. . .',,;+l*~=*+;:=--,:,:': '':`., .,;-~+=;=ckx+===~==li;~**=*ci-,'. .'`~+*l=-=!:,;,-:.`.:''. ...` : . .,;~+=;~cxbo*++~--=~;-=~:;=++-` `'`~+li==!~`,,,=''' '. .'''.. .'. .,;=+~-~iokOdo*~;;=:`,:;+;:~;;: .';==;=++l+,::::;,: .';' . . '''.'',+i!;;!cxckObi~;~;```:-~;:~;,' . ..'.;~-::~x+;:::'':o:' `,`.. . ',.``,~+-:;=ockl*xx*=-;,,::;;''','.` .``',-----;-il-;:-`.,:.., ,`,,'. . ...``:~~:,,-ikxoi!ii*=:'',,:;;...' ' .:-+!**+~~:-++=`--..'`..' `' `,. . '`,;;,,:;+odkc*!lccci:''`,:`.. -' .,,,-~!+~,'`=-:~; ''. .` ` .``,;::;;~=*xooxli!!il='''';-.. .` .: . .:::!*~:~:`:~-' :' ..'' ``. .',,;;:;--~~*lcloi!+;,:'`:'.. .. `. . .-:``:~+~;:`,~' .,, . .`` .xc .`',;:~!:;;-=+*!*++*-,'. .'. ... .' .','`:``+:''-=,''',:.. .`,,,::;:;~-;~+~=+-,`' .' .. . .'''.'`:, ~~:'`:,'''``.. . '''````,;;,:-~;;~;;,` ..'` ','.'``'' `,:=:...', . .. .'`````,:',:,`,:;=!=;,' .'':' -:..',. . ` '':, .. . .'``'``'.'''..':;--~+*+' .,` :, '.. ,;,. . .'`''`'..'.. ..,;--::;;' ''.. `. . ',`.. ...''''.... '`,`''' .' . .. .' ...'... . ..'. .` .. ....... .. .`. ` ...... ',. .... . . . .. .' . . . .
Other work
university / a-level / side projects
-
StudyTool
typescript / react / express / sqlite / docker 2026
Fill-in-the-blank study app that turns a JSON question bank into practice and timed sessions, with difficulty levels, a word bank, fuzzy answer checking and weak questions first.
-
AI ChatBot
typescript / react / express / gemini / transformers.js / docker 2025
Group coursework chatbot that talks as William Shakespeare, with a React frontend, an Express backend, and an AI provider that falls back from Gemini to a small local model.
-
CiB Group 11
vue / typescript / express / sequelize / mysql 2025
Employee referral system prototype built in one week for a BAE Systems brief, with a cross-course team. Vue 3 and Vuetify on the front, Express, Sequelize and MySQL behind.
-
BAnim
c# / winforms / .net framework 2023
Frame-by-frame sprite animation library for C# WinForms, built during my A-level project as a stand-in for a Unity animation engine I wasn't allowed to use.
-
Savers
c# / sql / mysql / sqlite / xunit 2024
Model-first SQL builder for C#. Attributes on model classes generate the CREATE TABLE statements, and a fluent, LINQ-style API builds parameterised queries, with MySQL and SQLite backends behind shared interfaces.
Monthly log
get in touch
Placements, graduate roles, or just a chat.