,::,:.::,,.,.,.#########:,,.##+++;+++++++++####+######+#@#@@#####@@@@# ,,,,,.::,,.,.,.###@##@##:,,:'+++++++++++++++++###+#########@#####@@@@+ ,,,,,.::,,.,.,.##@####@#':'++#++#++++#+++++++++##+#+##+++++@#+##@@@@@# ,,,,,.::...,.,.++#######''+++++##+######+#+#####+######+###+@+###@@@@# ,,,,,.:,...,...####++''+++++++###################+##########+####@@@## ,,,,,,:,..,,...++#++'+++########@@#@######@##########+'+#+####+++#@@## ,,,,,.:,,.,,...'+++++'++###########@@@@@@#@@#########+++++@@##++++@@## ,,,,,,:,,.,,'+'+++##+++#####@@@@###@@@@@@@@######@###++++##'#@'+++@@@# ,:++.,:,,.,,+++#++#++########@@#@@@@@@@@@@@@#########++'+++++#+++++@## ,''';,;.:.,,+######+###########@#@@@@@@@@@@@@@###@@##++++''''+'++++#+@ ,'''',;,:.,;+#######@@###@@@#######@@@@#@@@@@#@@@#@###+++''+###++++##@ .'''',;.:.,'+##+####@+##@@@######@#@@@#@##@@@@@@@@@#+#++++##@++++++### ;''''';.:.,++#####@@#########@@######@##+#+#@@@@@@@####++++@#+++++++## +''''':.,.;+######@#######@@@@@@@@@@####'#++#@@@@@@#@##++++'#+++++++## ''+''+:.,.'+###@####@#@#@@@@@@@#@@@###+++##''#@@@@#@@@###++##+++++++## +'+'++'...++######@@#######@@@@@@#@++''###'''+##@@@@@######+++++++++#+ +++'++'..,++#####@##@#@####@#@@@##+'+';'+''';;+#@@@@@@#####+++++++#### +'++++';.'+##########@#+#@@@@@###'';;;''''';;;;+@@@@@@#####++++++#+##+ ''++++'+.'#@#########@#++++#+++'';;;;;;;';;;;;;'#@@@@##@###++++++++#++ +++++++'.++@@######@#+''''+++'';;;;;;;;;;;;;;;;;+#@@@@#@@@##+++++++##+ +++++#++:+#@@@@@@@#++'';;;''';;;:;:::;:;;;;;;;;;'#@@@@#@@@##++++++###; ++++++++;+#@@@@@@#++'';;;;;;:::::::::::::;::;;;;'+@@@@@@@@##+++++++++. +++'++++#+#@@@@@@#+'';;::::::::::::::::::;;;;;;;;'#@@@@@@@##++++++#### #+++#'++++###@@@@#'';;:::::::::::;:::;';'''''';;;'+@#@@@@@##+++++#@##` ++++++++++###@@@@+';;:::;'';;;;::::;;'++######+;;;+###@@@@@#++++#@###+ '++++++++#####@#@+';;;'+++#+++';;;;;+++#########;;'##@@@@@@#++####@##+ ++++'+++###@@@@#@+''##########+';;;'++++++'';''++;'#@@@@@@@##+###@###+ +++''+++###@@@@##+'##+++++++#++';;;'+++++'';;'''+''#@@@@@@@#######@#@' +#'+##++@@@@@@@##+++'';''''++++';;;''++++'''''';'';+@@@@@@@####++##### ######++#@@@@@@@@++''''+'''++++';:;'++#++'++'''';';'@@@@@@@@########## #@#@@##+#@@@@@@@@+'''+''+++++#+';:;'+++#+#@#+#+'';;;#@@@@@@#@######### +########@@@@@@@@';''+#+###'#++':::'''#+'###++'';;;;'@@@@@@@########## ###@@####@@@@@@@#';'++++###'+#'':::;'''+++''''';;;;;'@@@@@@@@######### ######+##@@@@@#@';;;;;''''''+'';:::;;''+++++'';;;;;;;#@@@@@@@@#######+ ####+###@@@@@@@#;;:::;'''++''';;:,:;;;''''';;;;;:;;;;##@@@@@@####+###+ #####+##@@@@@@@+;;::::;;;;;;;;;;:::;;;;;;;;;;:::::;;;##@#@@@@@######## +#####+#@@###@@+;::::::::;;;;;;;:,:;;;;::;::::::::;;;###@#@@@@@@@@@@@# #####+##@@#@@@@';:::::::::::;;;:,:::;;;;::::::::;;;;;#@####@@@@@@@@#@# @###@###@@#@##@';::::::::::::;;:::::;;;::::::::::;;;;#############@@#' @#@@####@@####@';;:::::::::;;::::::;;;;;;::::::::;;;'+#''########@###' #@#@####@@####@';;:::;:::;;';:'';;;;';';;;;:::::;;;''##+'++@#####@@##+ #####+##@@#+###';;;;;;;;;;'';'++';;++;';;;;;;;;;;;;'''++''#@#####@@##+ #+###++#@@#+###';;;;;;;;;''''+#@'''##+';;;;;;;;;;;'''''++;#@#########+ ++##+++##@@'+++';'';;;;''''''+++''+'+';;;;';;;;;;;''';'';;@##########+ +++#++++#@#''+++;''''''''';;''++++++'';;;;;;;'''''''+;';;;@##########+ +++#++++##@'';'+;''''''''';;'''+++++''';;';';;'''';;+';;;'@@@######### ++++++++#+#;;''+;'''''''''';;;''++'''';;''''';;;;'';+;';;############# ++++++++#;##;''+;;''''''+'';;;;;;;;;;;;;;'+'''';;;;'#;;;;##########+## ++++++++#:##';;';'''''''++++++++++++++++##'';'';';;'#';;############## ++++#+++#:+##''''''''';''+#+';''++'';''''''''';';;;'@#+#####+++####### +++++++++,+##@#@+''''''''''''';';;'''';;;;''''';;';#@@@#####+++####### +++++++++,+##@@@#';''''''''';'''''';;;;;;;''''';';'@@@@####;#++####### +++++++++,+#@@@@@'''''''''''''++++'''';;;;''''''''+@@@@####'++#+###### +++++'+++,++@@@@@+''+'''''''''+++++'''';''''''''''#@@@@####@+++####### '+'+#++++,++#@@@@@+''''''''''''++++'''''''''''++'+#@@@#####@++######## ++++#++++,+++@@@@@#++'''+'''''''''';''''''''+++++#@@#########+######## '''++++++,++++@@@@@+++++++''''';';;;;''''''''+++++@#######@#++######## '''++++++,+++#+#@@##++++++''''''';';;;';''++++++#'@#########++######## +++++++++,+++##++##+###+#+''''''';'''''''+++#++#+'###########+#+###### +++++++++,+++##+++#'######+++++'''''+'++++#+++##'++##########+######## +++++++++,+++##++++'+########+++++++++##+###+##''++#########++######## +++++++++,+++++++++;'+############+++#########+';++######@##++######## +++++++++,+++##++++;'+######################+''';++#######@#++######## +'+++++++,++###++++;'+++#############@#####+''';;+##########++######## +'+++++++,++@@+++++;''+++#################+++'';;++#########++#######+ +++++++++,++##++++#;'''+++##############++'+';;;;++##########+#######+ +++++++++,+++###++#;''''+++++##++++++++'''''';;;;++#########+++####### +++++++++,++++#+#+#;'''''++++++++++++''''''';;;;'++##########+######## ++++#++++,+++###+';';'''''++++++++'''''''''';;;;'++########++++####### ++++#++++:+++##+;:;;;''''''+'++++'''''''''';;;;;'+######+###++######## ++++#+++#:+++++;::;'''''''''''++'+'''''''';;;;;;;'+#+######;+++#######
The projects in this page are a reflection of my Github repositories. I pull Github repository data server-side using their graphql API, and filter them so that only repositories with a PORTFOLIO.md in the master branch are shown.
While more work upfront, making this a reflection of my github repositories allows me to forget about it and it will stay up to date with my latest projects as I work on Github, all I have to do is create a markdown file and it will show up on this site.
Front end is a server-rendered React application that is completely usable on the initial html render. Works fine with scripts disabled.
A little game where you try to guess the accepted answer for a random stack overflow question.
Uses Stack Overflow's public API to fetch questions and answers.
I started working on this to learn how to release an npm package.
I'm no longer developing this, as I realized this adds unnecessary complexity to small projects, and is not flexible enough for bigger ones.
all modules come with a default value scale, rem is the preferred unit
if you pass in a number it will compute from the scale, if you pass in a string it will use it as-is:padding(2) => padding: .5rem
padding('123px') => padding: 123px
padding(1)
padding: .25rem;
padding.horizontal(1)
padding-left: .25rem;
padding-right: .25rem;
borderRadius(1)
border-radius: .125rem;
borderRadius(1).topLeft(0)
border-radius: .125rem;
border-radius-top-left: 0;
React Native sudoku app. Uses Redux to manage state.
2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2
7 8 9 1 3 4 5 6
2 3 6 7 8 9 1
5 6 7 8 9 1 2 3 4
8 9 1 2 3 4 5 7
3 4 5 6 7 1 2
6 8 9 1 2 3 4 5
9 1 2 3 4 5 6 7 8
A simple AWS Serverless REST api for an automated garden. Has endpoints to collect IoT sensor data for stuff like soil humidity. Uses Rollup for bundling.
A script and tools to scrape a whole country's population data from a web service and put them in a database.
Threaded to make the ~19 million records faster to download.
Separate script to verify downloaded records and a small Flask app to view the data.
Sometimes we have large pieces of static content in our application state, such as articles, user comments, or most content coming from a CMS.
Traditionally when server-side rendering, the initial HTML has two copies of this content, one in the markup and one in a script tag for rehydration.
This is a proof of concept for a way to rehydrate static content in the client without having the state needed to render it.
A little React word game app I coded for a live demo at work.
Web Hearthstone UI that allows hundreds of players to control a single hearthstone game.
Uses Pusher to deliver board states to clients.
The biggest challenge was making the voting system scale to hundreds of simultaneous users. My solution was sharded counters on the Google Datastore.