[{"project_id":"8b5ab8df-667e-4046-8ef9-1c8fc2e61a5c","name":"Clords","slug":"clords","date":"2011-08-01","rating":5,"project_type":"game","controls":"Mouse to click on word parts.","short_description":"Vocabulary-based word game.","description":"This word game is a clone of the app \"7 Little Words\". Select from a bank of word-parts to construct answers to crossword-like clues. Complete all of the levels to win the game. Clords was the first \"large\" project I ever made on my own and since I hadn't discovered raster graphics yet the stylistic borders are just made with disabled Java Swing buttons. It's certainly not the prettiest game, but it gave me a taste of the obsessive rush you get from turning imagination into reality.","remarks":"Clords was the first major graphical program I made on my own. The creative control Java Swing provided in 2011 inspired me to start creating the games I always wanted to play as kid.","tags":["words","puzzle"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/clords","web_link":null,"original_link":"https://apps.apple.com/us/app/7-little-words-daily-puzzles/id431434152","image_links":["https://storage.googleapis.com/cgme/projects/images/clords--home-screen.jpg","https://storage.googleapis.com/cgme/projects/images/clords--level-1.jpg"],"primary_language":"Java","archived":false},{"project_id":"a2697eb6-7983-491d-8d16-eeba8ecfdfe7","name":"Evolution","slug":"evolution","date":"2012-05-01","rating":5,"project_type":"game","controls":"Mouse to draw elements, left/right arrow keys to change elements, up/down arrow keys to change drawing size.","short_description":"Element interaction sandbox game.","description":"This little game was inspired by the popular genre of online element simulations like Powder Game and Powder Toy. Place water, oil, fire, lava, plant, and more to explore interactions between the elements.","remarks":"My first time playing one of these element simulation games was on a friend's jail-broken iPod Touch in middle school. There was something so exciting about touching a screen with your finger and seeing particle effects come to life. While that game had only a few elements, I later found the Dan-Ball Powder Game on which I wasted countless hours growing trees and watching ants build complex nests.","tags":["art","sandbox","boredom"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/evolution.jar","web_link":null,"original_link":"https://dan-ball.jp/en/javagame/dust","image_links":["https://storage.googleapis.com/cgme/projects/images/evolution--01.jpg","https://storage.googleapis.com/cgme/projects/images/evolution--02.jpg","https://storage.googleapis.com/cgme/projects/images/evolution--03.jpg"],"primary_language":"Java","archived":false},{"project_id":"50723c4a-84f1-4be3-a3d3-93f35692e8dd","name":"Vector","slug":"vector","date":"2012-05-01","rating":5,"project_type":"game","controls":"Mouse to select marble trajectories, keyboard to type.","short_description":"Multiplayer marble game.","description":"Inspired by the Android app Cestos, Vector is basically a glorified game of marbles. You play online against other people and the goal is to knock the other players' marbles off the stage. The lobby of the game includes a chat room where you can talk to other players and challenge them to games. Vector was built for my high school data structures class with my friend Jason Zhao. The vector math for elastic collisions nearly ruined us, but in the end we prevailed.","remarks":null,"tags":["multiplayer","marbles","online"],"tools":["Java","Swing"],"source_link":null,"download_link":null,"web_link":null,"original_link":"https://cestos-full.en.aptoide.com/app","image_links":["https://storage.googleapis.com/cgme/projects/images/vector--01-login.jpg","https://storage.googleapis.com/cgme/projects/images/vector--02-connecting.jpg","https://storage.googleapis.com/cgme/projects/images/vector--03-chat.jpg","https://storage.googleapis.com/cgme/projects/images/vector--04-players.jpg","https://storage.googleapis.com/cgme/projects/images/vector--05-game.jpg"],"primary_language":"Java","archived":false},{"project_id":"0af4065d-a1a8-46b3-8441-af1ccd61926c","name":"Three Farmer","slug":"three-farmer","date":"2012-07-12","rating":1,"project_type":"game","controls":"Click to place an item.","short_description":"Grid-based puzzle game.","description":"Three Farmer is a knock-off of the Android and iPhone app Triple Town. The goal is to place items on a grid so that similar items combine and your town grows without overcrowding.","remarks":null,"tags":[],"tools":["Java","Swing"],"source_link":null,"download_link":null,"web_link":null,"original_link":"https://apps.apple.com/us/app/triple-town-fun-addictive-puzzle-matching-game/id490532168","image_links":["https://storage.googleapis.com/cgme/projects/images/three-farmer--01.jpg"],"primary_language":"Java","archived":true},{"project_id":"6f300287-0073-4b97-9d8d-84ec53f4ed0a","name":"Color Match","slug":"color-match","date":"2012-10-01","rating":1,"project_type":"game","controls":"Click to select a tile, click on an empty space to place a selected tile.","short_description":"Color matching jigsaw puzzle game.","description":"This is a puzzle game where the goal is to move tiles from one side of the board to the other so that the colors of each tile match those of the adjacent tiles, doing so as quickly as possible. This is a clone of an old Android app I have not been able to find.","remarks":"This game was based off of an old Android app, but I can't find it on the Google Play store anymore.","tags":["puzzle","matching"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/color-match.jar","web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/color-match--01.jpg","https://storage.googleapis.com/cgme/projects/images/color-match--02.jpg","https://storage.googleapis.com/cgme/projects/images/color-match--03.jpg","https://storage.googleapis.com/cgme/projects/images/color-match--04.jpg"],"primary_language":"Java","archived":false},{"project_id":"91822823-2364-469b-abed-f88d8ece8dc4","name":"Sketcher","slug":"sketcher","date":"2012-11-01","rating":7,"project_type":"game","controls":"F = up, D = down, J = left, K = right, delete = shake/erase, shift = undo, click on menu to save and open past sketches.","short_description":"Etch A Sketch game.","description":"An Etch A Sketch clone. The F, D, J, and K keys act like knobs on an Etch A Sketch. The delete key shakes the Etch A Sketch (slowly erases what you've drawn). You can also use the menu bar to save your creations to come back to them later.","remarks":null,"tags":["sketch","art"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/sketcher.jar","web_link":null,"original_link":"https://en.wikipedia.org/wiki/Etch_A_Sketch","image_links":["https://storage.googleapis.com/cgme/projects/images/sketcher--01.jpg","https://storage.googleapis.com/cgme/projects/images/sketcher--02.jpg","https://storage.googleapis.com/cgme/projects/images/sketcher--instructions.jpg"],"primary_language":"Java","archived":false},{"project_id":"44555c26-dde7-4436-8bac-4e41718735bc","name":"Dot Drawings","slug":"dot-drawings","date":"2012-12-01","rating":5,"project_type":"game","controls":"Move mouse to uncover the pictures, space bar to start a new picture.","short_description":"Casual idle clicker game.","description":"A fun toy program where you drag your mouse over the screen to uncover a picture. It was done in collaboration with Robert Gerdisch who helped with the color averaging algorithm. This is a clone of an online widget I have not been able to dig up.","remarks":"This is actually based on some online widget that I have not been able to dig up.","tags":["art","boredom"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/dot-drawings.jar","web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/dot-drawings--01.jpg","https://storage.googleapis.com/cgme/projects/images/dot-drawings--02.jpg","https://storage.googleapis.com/cgme/projects/images/dot-drawings--03.jpg","https://storage.googleapis.com/cgme/projects/images/dot-drawings--04.jpg"],"primary_language":"Java","archived":false},{"project_id":"1cf70fc4-de53-4a05-9754-516ef8b48059","name":"Check My Code","slug":"check-my-code","date":"2012-12-01","rating":1,"project_type":"tool","controls":null,"short_description":"Website for programming homework collaboration.","description":"Check My Code was a website I built when first learning web-development. I imagined an environment where students could collaborate on programming homework, teachers could efficiently grade assignments, and learning resources would be available to students that wanted to go above and beyond. I built my own authentication and maintained a database of questions and comments so students could collaborate on homework.","remarks":null,"tags":["web-app","programming","school"],"tools":["PHP"],"source_link":null,"download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/check-my-code--log-in.jpg","https://storage.googleapis.com/cgme/projects/images/check-my-code--sign-up.jpg"],"primary_language":"PHP","archived":false},{"project_id":"a0393218-f87b-46f0-9b49-9756f512e1c3","name":"Oracle","slug":"oracle","date":"2012-12-01","rating":1,"project_type":"game","controls":null,"short_description":"Prank fortune teller game.","description":"This was a prank project I made to trick some friends at school. I'd tell a friend to ask the oracle a question. Then I'd type a \"declaration\" which would always be \"Oracle please answer my question\". Except I wasn't actually typing the declaration. I was typing an answer to their question and my program would display the declaration as I typed the answer. Then after typing their question, like magic, a reasonable answer would appear on the screen.","remarks":null,"tags":[],"tools":["Java","Swing"],"source_link":null,"download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/oracle--01.jpg"],"primary_language":"Java","archived":true},{"project_id":"18197593-c864-4650-8a23-da1b265e2ef5","name":"Armada","slug":"armada","date":"2013-01-01","rating":5,"project_type":"game","controls":"Arrow keys for player 1, W/A/S/D keys for player 2.","short_description":"Fast-paced multiplayer boat game.","description":"This is a clone of the Dubloon Disaster game on Neopets. It's a two player skill game where you use the keyboard to steer your boat toward gold coins. The player who collects the most gold coins wins.","remarks":"When starting to create Armada I realized I had some good experience creating games on my own, but I needed to work on being more collaborative. I asked my friend Mattie Shepard, a very talented designer, to help me create a better visual experience for my game. She came up with some graphical assets that I could import into the game. The final product had a different feel from anything I had worked on before and it got me excited about the novel results that can come from putting two heads together.","tags":["fast-paced","multiplayer"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/armada.jar","web_link":null,"original_link":"https://www.neopets.com/games/game.phtml?game_id=772","image_links":["https://storage.googleapis.com/cgme/projects/images/armada--01.jpg","https://storage.googleapis.com/cgme/projects/images/armada--02.jpg","https://storage.googleapis.com/cgme/projects/images/armada--ship.jpg"],"primary_language":"Java","archived":false},{"project_id":"836fa8d8-da8b-48a5-872f-6f3091f71c82","name":"Base","slug":"base","date":"2013-01-01","rating":6,"project_type":"tool","controls":null,"short_description":"Number system conversion website.","description":"I found that most online converters only converted between common bases like 2, 10, and 16. This simple web project allows you to convert between many different bases, all the way up to base 36. This was also an opportunity to cement my understanding of numeric bases by explaining it thoroughly in writing.","remarks":null,"tags":["binary","calculator","numbers"],"tools":["JavaScript"],"source_link":null,"download_link":null,"web_link":"https://static.chrisgregory.me/sub/base","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/base--blank.jpg","https://storage.googleapis.com/cgme/projects/images/base--binary.jpg","https://storage.googleapis.com/cgme/projects/images/base--hello.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"0edaf5b4-d7f4-49b3-b543-3e766a8c90b9","name":"Park Tudor Chemical Database","slug":"ptcd","date":"2013-05-01","rating":5,"project_type":"tool","controls":null,"short_description":"Online database for chemical storage.","description":"The Park Tudor Chemical Database (PTCD) was a project I worked on with my high school classmates Jason Zhao and Michael Xu. We worked with the science department to design a system to track chemicals used in science classes. We built a site for inventory management, a QR code label generator, a web app for teachers to check out chemicals, and email notifications for chemical safety information and low inventory alerts.","remarks":null,"tags":["inventory","database","chemicals","school"],"tools":["C#","ASP.NET","SQL"],"source_link":null,"download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/ptcd--01-login.jpg","https://storage.googleapis.com/cgme/projects/images/ptcd--02-home.jpg","https://storage.googleapis.com/cgme/projects/images/ptcd--03-database.jpg","https://storage.googleapis.com/cgme/projects/images/ptcd--04-bottle.jpg","https://storage.googleapis.com/cgme/projects/images/ptcd--05-confirm.jpg","https://storage.googleapis.com/cgme/projects/images/ptcd--06-email.jpg"],"primary_language":"C#","archived":false},{"project_id":"82df3dac-7509-4522-91ca-d61a0ad0edf1","name":"Dragon Curve","slug":"dragon-curve","date":"2013-06-01","rating":1,"project_type":"simulation","controls":null,"short_description":"Visualization of the Dragon Curve fractal.","description":"The Dragon Curve, discovered by NASA scientists in the 1960's, is a fractal generated by folding a strip of paper in half repeatedly and then unwrapping all folds to 90 degree angles. It was popularized by Michael Crichton's \"Jurassic Park\". This program allows you to step through iterations of the Dragon Curve fractal and zoom in and out.","remarks":null,"tags":["fractal","art"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/dragon-curve.jar","web_link":null,"original_link":"https://en.wikipedia.org/wiki/Dragon_curve","image_links":["https://storage.googleapis.com/cgme/projects/images/dragon-curve--01.jpg","https://storage.googleapis.com/cgme/projects/images/dragon-curve--02.jpg","https://storage.googleapis.com/cgme/projects/images/dragon-curve--03.jpg","https://storage.googleapis.com/cgme/projects/images/dragon-curve--04.jpg","https://storage.googleapis.com/cgme/projects/images/dragon-curve--05.jpg","https://storage.googleapis.com/cgme/projects/images/dragon-curve--06.jpg","https://storage.googleapis.com/cgme/projects/images/dragon-curve--07.jpg","https://storage.googleapis.com/cgme/projects/images/dragon-curve--08.jpg","https://storage.googleapis.com/cgme/projects/images/dragon-curve--09.jpg"],"primary_language":"Java","archived":false},{"project_id":"8f472c69-8705-49e0-bed4-999e16ddad0c","name":"Tower of Hanoi","slug":"tower-of-hanoi","date":"2013-07-01","rating":5,"project_type":"game","controls":"Left/right arrow keys to move pointer, space to pick up/put down discs, R key to reset, number keys to change the number of discs, equals key to check high scores.","short_description":"Tower of Hanoi puzzle game.","description":"An implementation of the classic mathematical puzzle game. By moving one disc at a time, the goal is to move all discs from the left stack to the right stack without placing a larger disc on top of a smaller one. This implementation of the game adds a timer, making the goal a short solving time rather than simply a small number of moves.","remarks":"My high school data structures class assigned homework to write a Tower of Hanoi solver. However, turning a graphical game into a command-line solver didn't feel right. I created this game at a time when I started to feel confident in my ability to create a visually appealing game given enough time.","tags":["puzzle"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/tower-of-hanoi.jar","web_link":null,"original_link":"https://en.wikipedia.org/wiki/Tower_of_Hanoi","image_links":["https://storage.googleapis.com/cgme/projects/images/tower-of-hanoi--01.jpg","https://storage.googleapis.com/cgme/projects/images/tower-of-hanoi--02.jpg"],"primary_language":"Java","archived":false},{"project_id":"3c5e7ac6-ad5a-4106-b61a-e1ec01fb3401","name":"Can You Count","slug":"can-you-count","date":"2013-08-01","rating":1,"project_type":"game","controls":"Space bar for everything.","short_description":"Simple single-player counting game.","description":"This is a simple and silly game I created for the Ludum Dare game jam. The player's goal is to count to ten seconds as precisely as possible. The closer you get, the higher your score. My goal in making this was to go to sleep at a reasonable hour and not stay up all night working on a game.","remarks":"I have never been very good at just sitting down and hacking on a project on-demand, but an incredible game developer friend of mine asked me to join him for Ludum Dare, so I created this little toy in a few hours. My goal was to create something that looked good but was definitely achievable in a short amount of time. The concept is ridiculously simple, but I'm still proud of how it turned out in such a short amount of time.","tags":["precision","counting"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/can-you-count.jar","web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/can-you-count--home.jpg","https://storage.googleapis.com/cgme/projects/images/can-you-count--ready.jpg","https://storage.googleapis.com/cgme/projects/images/can-you-count--score.jpg"],"primary_language":"Java","archived":false},{"project_id":"aac33770-877c-45e1-9f7a-e097d584f469","name":"Scheduler HD","slug":"scheduler-hd","date":"2013-08-01","rating":5,"project_type":"tool","controls":null,"short_description":"Website for school schedule sharing.","description":"My friend Jason Zhao and I noticed our high school peers posting their class schedules on Facebook and saw an opportunity to build something really useful. We developed a site to give our friends better search over schedules and also more privacy options than Facebook. Days after launching, school administrators brought the effort to a halt with concerns that students with perfect knowledge of their classmates' schedules would become a huge headache for the school scheduling team.","remarks":null,"tags":["web-app","school","schedule","coordination"],"tools":["C#","ASP.NET","SQL"],"source_link":"https://github.com/gregorybchris/scheduler-hd","download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/schedulerhd--01-home.jpg","https://storage.googleapis.com/cgme/projects/images/schedulerhd--02-search.jpg","https://storage.googleapis.com/cgme/projects/images/schedulerhd--06-edit.jpg","https://storage.googleapis.com/cgme/projects/images/schedulerhd--07-classes.jpg","https://storage.googleapis.com/cgme/projects/images/schedulerhd--08-teachers.jpg"],"primary_language":"C#","archived":false},{"project_id":"4f6740ec-3fa7-4550-a9d5-e28ab137dcee","name":"Tiles","slug":"tiles","date":"2013-12-01","rating":8,"project_type":"game","controls":"Arrow keys to move around, space bar to reset the level.","short_description":"Grid-based puzzle game with multiple levels.","description":"The game is roughly based on the Miniclip game Bloxors where a block will fall through the floor if it rolls over the same area twice. Tiles is slightly different. The aim is to move your tile around the board and visit every space exactly once. There are ten levels that get progressively harder. This game was an exciting breakthrough for me because it was the first game I made my friends actually had a lot of fun playing.","remarks":null,"tags":["puzzle","levels"],"tools":["Java","Swing"],"source_link":"https://github.com/gregorybchris/tiles","download_link":"https://storage.googleapis.com/cgme/projects/jars/tiles.jar","web_link":null,"original_link":"https://minicliponline.com/games/bloxorz","image_links":["https://storage.googleapis.com/cgme/projects/images/tiles--01.jpg","https://storage.googleapis.com/cgme/projects/images/tiles--02.jpg","https://storage.googleapis.com/cgme/projects/images/tiles--03.jpg"],"primary_language":"Java","archived":false},{"project_id":"051a47b8-5a06-4449-bd97-e262789cc959","name":"Blocks","slug":"blocks","date":"2013-12-01","rating":1,"project_type":"game","controls":"Arrow keys to move blocks, space to drop a block.","short_description":"A simple Tetris clone.","description":"This is a clone of Tetris. At this point in high school I had gotten really into playing Tetris on neave.com. But I was frustrated that it seemed to stop getting harder after a while. I could play for hours before getting distracted and losing. So I decided to make my own version for fun. The controls are a bit glitchy and it never replaced online Tetris for me, but it was a fun project.","remarks":null,"tags":["patterns","fast-paced"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/blocks.jar","web_link":null,"original_link":"https://en.wikipedia.org/wiki/Tetris","image_links":["https://storage.googleapis.com/cgme/projects/images/blocks--01.jpg","https://storage.googleapis.com/cgme/projects/images/blocks--02.jpg","https://storage.googleapis.com/cgme/projects/images/blocks--03.jpg"],"primary_language":"Java","archived":false},{"project_id":"4623e792-4bb9-4823-b79c-09530d677485","name":"Flock","slug":"flock","date":"2014-01-01","rating":1,"project_type":"simulation","controls":null,"short_description":"Boids algorithm simulation.","description":"Inspired by Albert-László Barabási's book \"Linked\", this was probably my first attempt at simulations of emergent complex systems. The program simulates the flight of flocking birds using the popular Boids algorithm. I used it in my high school thesis project on the history of network science.","remarks":null,"tags":["simulation","birds","boids","flocking"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/flock.jar","web_link":null,"original_link":"https://en.wikipedia.org/wiki/Boids","image_links":["https://storage.googleapis.com/cgme/projects/images/flock--01.jpg","https://storage.googleapis.com/cgme/projects/images/flock--02.jpg"],"primary_language":"Java","archived":false},{"project_id":"1eb75c42-0a6f-489f-9606-301f7c22f88e","name":"Unscrambler","slug":"unscrambler","date":"2014-04-01","rating":1,"project_type":"tool","controls":null,"short_description":"Word-game word unscrambler tool.","description":null,"remarks":null,"tags":["puzzle","solver"],"tools":["Java","JOptionPane"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/unscrambler.jar","web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/unscrambler--01.jpg","https://storage.googleapis.com/cgme/projects/images/unscrambler--02.jpg","https://storage.googleapis.com/cgme/projects/images/unscrambler--03.jpg"],"primary_language":"Java","archived":true},{"project_id":"d84e30d1-ee9f-49ce-97d9-3afefdfac1a9","name":"Unhinged","slug":"unhinged","date":"2014-06-01","rating":5,"project_type":"game","controls":"Click on a door to enter it. Find the room indicated on the home screen to win the game.","short_description":"Memory game in a haunted house.","description":"Unhinged is a memory game. The goal is to find your way out of a haunted house. Keep track of which rooms you've visited and try not to get lost.","remarks":null,"tags":["memory"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/unhinged.jar","web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/unhinged--01.jpg","https://storage.googleapis.com/cgme/projects/images/unhinged--02.jpg"],"primary_language":"Java","archived":false},{"project_id":"7e0e20c9-f83c-438f-9078-7e8f026ac043","name":"2048","slug":"2048","date":"2014-06-01","rating":5,"project_type":"game","controls":"Arrow keys.","short_description":"A simple clone of the popular puzzle game.","description":"A clone of Gabriele Cirulli's hit puzzle game, 2048. Admittedly the lack of animations makes playing this knock-off much less fun than the original.","remarks":"One major downside of my implementation is the lack of animations which makes playing this knock-off much less fun than the original.","tags":["puzzle"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/2048.jar","web_link":null,"original_link":"https://play2048.co","image_links":["https://storage.googleapis.com/cgme/projects/images/2048--01.jpg","https://storage.googleapis.com/cgme/projects/images/2048--02.jpg","https://storage.googleapis.com/cgme/projects/images/2048--03.jpg"],"primary_language":"Java","archived":false},{"project_id":"206edf78-3b60-4e52-822e-77303202aeab","name":"World","slug":"world","date":"2014-07-01","rating":1,"project_type":"visualization","controls":null,"short_description":"3D world simulation.","description":null,"remarks":null,"tags":["3D","simulation"],"tools":["Java","Swing"],"source_link":null,"download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/world--01.jpg"],"primary_language":"Java","archived":true},{"project_id":"27588d45-5b7c-4c76-b027-4a664c8ffd90","name":"Viewer","slug":"viewer","date":"2014-07-05","rating":5,"project_type":"program","controls":"Arrow keys to move around, W/A/S/D keys to rotate the camera, escape key to exit the simulation.","short_description":"3D world simulation.","description":"Viewer is simple implementation of a 3D world with objects rendered to the screen as triangle meshes. The user can \"fly\" around in space and explore. I wrote this program without any research into the right way to do 3D rendering or rotations, so it's not at all performant.","remarks":"Viewer was the first 3D program I created from scratch. At this point I still had very little experience working with any code other than my own and so if I wanted 3D graphics I would have to create it myself. I didn't know that much vector math, let alone the quaternions needed to do 3D rotation correctly. Nevertheless, the project turned out alright.","tags":["simulation","3D","world"],"tools":["Java","Swing"],"source_link":null,"download_link":"https://storage.googleapis.com/cgme/projects/jars/viewer.jar","web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/viewer--01.jpg","https://storage.googleapis.com/cgme/projects/images/viewer--02.jpg","https://storage.googleapis.com/cgme/projects/images/world--01.jpg"],"primary_language":"Java","archived":false},{"project_id":"bf840a7e-5462-4ae6-964d-c451662fd7a7","name":"Directed","slug":"directed","date":"2014-12-01","rating":1,"project_type":"tool","controls":null,"short_description":"Force-directed graph editor.","description":"A graphical tool to build networks. Click to create a node, drag between two nodes to connect them, and right click a node to delete it. This program uses my own naïve force directed graph algorithm, which is a bit unstable, but works well for simple planar graphs.","remarks":null,"tags":["interactive","graphs"],"tools":["Java","Swing"],"source_link":"https://github.com/gregorybchris/directed","download_link":"https://storage.googleapis.com/cgme/projects/jars/directed.jar","web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/directed--01.jpg","https://storage.googleapis.com/cgme/projects/images/directed--02.jpg","https://storage.googleapis.com/cgme/projects/images/directed--03.jpg","https://storage.googleapis.com/cgme/projects/images/directed--04.jpg","https://storage.googleapis.com/cgme/projects/images/directed--05.jpg"],"primary_language":"Java","archived":false},{"project_id":"acc1ce43-b729-462e-a33d-ca9fd2c51393","name":"Song Search","slug":"song-search","date":"2014-12-14","rating":1,"project_type":"program","controls":null,"short_description":"Song lyric search engine.","description":"Submitted as the final project in my college data structures course, this program allows the user to efficiently query a music database for all songs that match the given lyrics.","remarks":null,"tags":["song","lyrics","database"],"tools":["C++"],"source_link":"https://github.com/gregorybchris/song-search","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"C++","archived":false},{"project_id":"9bc4c027-141c-4785-9b71-1c2d83826b5c","name":"Sweyp","slug":"sweyp","date":"2015-04-01","rating":8,"project_type":"game","controls":"Mouse dragging to select a word, R key to start a new game.","short_description":"Boggle clone with animations.","description":"Sweyp is a clone of the word game Boggle. You construct words by connecting chains of adjacent letters from a 4x4 grid. Some of my previous game projects like Tetris and 2048 would have been made significantly better if I had know how to include animations. Adding animations to Sweyp marked a breakthrough for me when I independently discovering how to decouple view and controller layers to make my code easier to reason about.","remarks":"I started working on this game when my college roommate was assigned a Boggle solver for his intro to Computer Science course. I thought it could be a good chance for me to improve upon my previous graphical projects and include animations to make the game more exciting. I had previously struggled to decouple controller and view layers in games and this was the first project where I discovered those design patterns for myself.","tags":["words","fast-paced"],"tools":["Java","Swing"],"source_link":"https://github.com/gregorybchris/sweyp","download_link":"https://storage.googleapis.com/cgme/projects/jars/sweyp.jar","web_link":null,"original_link":"https://en.wikipedia.org/wiki/Boggle","image_links":["https://storage.googleapis.com/cgme/projects/images/sweyp--01.jpg","https://storage.googleapis.com/cgme/projects/images/sweyp--02.jpg"],"primary_language":"Java","archived":false},{"project_id":"6348ce9d-a8ca-4a23-ac9d-0064c07b7e85","name":"Seek","slug":"seek","date":"2015-07-01","rating":1,"project_type":"game","controls":null,"short_description":"Simple AI tag game.","description":"A little game with a simple AI that attempts to catch you as you run around the screen. It learns from your patterns of movement to try to catch you faster. At this time I was really intrigued by the idea of AI and how programs can actually learn over time and tailor themselves to the user's needs or even the user's personality. Perhaps something as simple as a game of virtual tag could uncover deep differences in personality between players?","remarks":"I remember explaining to my friend Robert over burgers that games could be used as subtle personality tests. Even watching how a player moves around the screen in a game of virtual tag could tell you a lot about their risk-aversion and maybe deeper personality traits.","tags":["ai","path-finding"],"tools":["Java","Swing"],"source_link":"https://github.com/gregorybchris/seek","download_link":"https://storage.googleapis.com/cgme/projects/jars/seek.jar","web_link":null,"original_link":null,"image_links":[],"primary_language":"Java","archived":false},{"project_id":"7ae769d8-bd57-4d6f-8291-6bfe1addfa24","name":"Interval Tree","slug":"interval-tree","date":"2015-12-25","rating":1,"project_type":"program","controls":null,"short_description":"Interval trees algorithm implementation.","description":"A Swift implementation of interval trees using balanced AVL trees. I had learned about AVL trees in data structures and wanted to see if I could apply them to a real world problem. I made up a problem about gondola ride scheduling and used AVL trees and graph coloring to solve it.","remarks":null,"tags":["algorithm","search"],"tools":["Swift"],"source_link":"https://github.com/gregorybchris/interval-tree","download_link":null,"web_link":null,"original_link":"https://en.wikipedia.org/wiki/Interval_tree","image_links":[],"primary_language":"Swift","archived":false},{"project_id":"7be25ba5-22b2-4b03-8751-7802aa24c8e8","name":"LCS","slug":"lcs","date":"2015-12-26","rating":1,"project_type":"program","controls":null,"short_description":"Longest common subsequence algorithm implementation.","description":"A Swift implementation of longest common subsequence. We were doing dynamic programming in my algorithms class and I used LCS to practice my Swift.","remarks":null,"tags":["programming","algorithms","constraints"],"tools":["Swift"],"source_link":"https://github.com/gregorybchris/lcs","download_link":null,"web_link":null,"original_link":"https://en.wikipedia.org/wiki/Longest_common_subsequence","image_links":[],"primary_language":"Swift","archived":false},{"project_id":"9d61892d-2d0b-4015-9104-d4a727b74351","name":"Jumbo Meal","slug":"jumbo-meal","date":"2016-03-01","rating":6,"project_type":"tool","controls":null,"short_description":"Meal plan calculator for college students.","description":"Jumbo Meal was a website I created at the end of my sophomore year in college. As I prepared to move off campus and leave my dining plan behind, I realized that students often spent more on meal plans than they needed to. Selecting a smaller meal plan and then paying for some meals in cash (JumboCash) could save you hundreds of dollars per semester. This little calculator told you the meal schedule you should follow to save the most money based on your meal preferences.","remarks":null,"tags":["dining","tool"],"tools":["JavaScript","jQuery"],"source_link":"https://github.com/gregorybchris/jumbo-meal","download_link":null,"web_link":"https://static.chrisgregory.me/sub/jumbo-meal","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/jumbo-meal--sliders-01.jpg","https://storage.googleapis.com/cgme/projects/images/jumbo-meal--sliders-02.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"114e1f6e-b1b6-4640-8f9e-a9cb84dcc5af","name":"Convolutional Mammogram Analysis","slug":"convolutional-mammogram-analysis","date":"2016-03-03","rating":8,"project_type":"program","controls":null,"short_description":"TensorFlow CNN for tumor detection and classification.","description":"Henry Zhou, Yuki Zaninovich, and I wrote a paper called \"Convolutional Mammogram Analysis\" for our intro to machine learning course. We used TensorFlow to train a CNN to detect tumors. We had never used TensorFlow before and learned about pooling layers, tensors, stride, padding, and did some model evaluation with ROC curves.","remarks":null,"tags":["research","deep learning","paper","computer vision"],"tools":["Python","TensorFlow"],"source_link":"https://github.com/gregorybchris/convolutional-mammogram-analysis","download_link":"https://storage.googleapis.com/cgme/projects/papers/cnn-mammogram.pdf","web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/convolutional-mammogram-analysis--scan.jpg","https://storage.googleapis.com/cgme/projects/images/convolutional-mammogram-analysis--loss.jpg"],"primary_language":"Python","archived":false},{"project_id":"915e28f3-1937-47fc-a935-bd0dc99bab2e","name":"Cheso","slug":"cheso","date":"2016-10-01","rating":1,"project_type":"program","controls":null,"short_description":"BrainFuck interpreter.","description":"Cheso (pronounced CHAY-so) is an implementation of a BrainFuck interpreter. After I completed my systems programming class in college I (accurately) predicted I was unlikely to ever use C again. This project was a last minute effort to cement any fluency I had gained in C over the semester.","remarks":null,"tags":["programming"],"tools":["C"],"source_link":"https://github.com/gregorybchris/cheso","download_link":null,"web_link":null,"original_link":"https://en.wikipedia.org/wiki/Brainfuck","image_links":[],"primary_language":"C","archived":false},{"project_id":"e6a3a054-2b58-4306-ab53-39853f0a1531","name":"Chans","slug":"chans","date":"2017-01-01","rating":8,"project_type":"visualization","controls":null,"short_description":"Chan's algorithm visualization and walkthrough.","description":"Timothy Chan's algorithm for computing a convex hull determines the set of points that form the outer boundary of a point cloud. For my computational geometry course I made this step by step tutorial that walks you through Chan's algorithm, explaining its implementation and computational complexity.","remarks":null,"tags":["visualization","walkthrough","geometry"],"tools":["JavaScript","D3.js","Velocity.js","Less.js"],"source_link":"https://github.com/gregorybchris/chans","download_link":null,"web_link":"https://static.chrisgregory.me/sub/chans","original_link":"https://en.wikipedia.org/wiki/Chan%27s_algorithm","image_links":["https://storage.googleapis.com/cgme/projects/images/chans--page-1.jpg","https://storage.googleapis.com/cgme/projects/images/chans--page-2.jpg","https://storage.googleapis.com/cgme/projects/images/chans--page-3.jpg","https://storage.googleapis.com/cgme/projects/images/chans--page-4.jpg","https://storage.googleapis.com/cgme/projects/images/chans--page-5.jpg","https://storage.googleapis.com/cgme/projects/images/chans--page-6.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"f29f70a5-7f33-4580-b734-097ca1cf8143","name":"Half-Plane","slug":"half-plane","date":"2018-01-01","rating":8,"project_type":"visualization","controls":null,"short_description":"Fractional cascading visualization and walkthrough.","description":"Half-plane range reporting is the problem of determining which side of a line a point is on. It sounds simple, but gets harder as the number of points and number of queries increases. To speed up queries we use an algorithmic method called fractional cascading as a preprocessing step. For my advanced algorithms course I made this step by step tutorial that walks you through the algorithm, explaining its implementation and computational complexity.","remarks":null,"tags":["visualization","walkthrough","geometry"],"tools":["JavaScript","D3.js","Velocity.js","Less.js","SweetAlert","HotKeys.js"],"source_link":"https://github.com/gregorybchris/half-plane","download_link":null,"web_link":"https://static.chrisgregory.me/sub/half-plane","original_link":"https://en.wikipedia.org/wiki/Fractional_cascading","image_links":["https://storage.googleapis.com/cgme/projects/images/half-plane--page-1.jpg","https://storage.googleapis.com/cgme/projects/images/half-plane--page-2.jpg","https://storage.googleapis.com/cgme/projects/images/half-plane--page-3.jpg","https://storage.googleapis.com/cgme/projects/images/half-plane--page-4.jpg","https://storage.googleapis.com/cgme/projects/images/half-plane--page-5.jpg","https://storage.googleapis.com/cgme/projects/images/half-plane--page-6.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"78f3ed86-17d5-4308-a38c-92b9663bb39b","name":"Combust","slug":"combust","date":"2018-01-23","rating":8,"project_type":"visualization","controls":"Click to ignite the torch.","short_description":"Simple D3 visualization of a torch being lit.","description":"A simple D3 visualization of a torch being lit. This was my first project for a data visualization course I took in college. Note: the demo only works on desktop.","remarks":null,"tags":["visualization","fire"],"tools":["JavaScript","D3.js"],"source_link":null,"download_link":null,"web_link":"https://static.chrisgregory.me/sub/combust","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/combust--01.jpg","https://storage.googleapis.com/cgme/projects/images/combust--02.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"329c095d-0de4-457f-950e-f2f3ff27868c","name":"Split Plot","slug":"split-plot","date":"2018-03-30","rating":1,"project_type":"tool","controls":null,"short_description":"Track workout template generator.","description":"My college track and cross country coaches would often print out blank spreadsheets and manually write in athlete names and workout details before practice. Split Plot automated away some of that painful process by providing a printable template for track workouts. Coaches could select the athletes ahead of time and select from a bank of predefined workout structures to make data entry faster.","remarks":null,"tags":["track","cross country","workout","data"],"tools":["JavaScript","jQuery","Less.js","Font Face Observer","loadCSS","Moment.js","Paper.js"],"source_link":"https://github.com/gregorybchris/split-plot","download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/split-plot--home.jpg","https://storage.googleapis.com/cgme/projects/images/split-plot--page.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"9d19447c-f53c-4811-b6f5-e97124b39769","name":"CompRank","slug":"comp-rank","date":"2018-04-19","rating":1,"project_type":"tool","controls":null,"short_description":"Website for crowd-sourced item ranking.","description":"Prioritization is super hard. There are often many different attributes that contribute to an item's priority or value and when you also have many items the problem of sorting becomes intractable. CompRank is an interface for ranking items within some arbitrary category by comparing them. A user is presented with two items to compare and the result of that comparison is then used to update rankings for the whole category.","remarks":null,"tags":["ranking","web-app"],"tools":["JavaScript","jQuery","Less.js","Vue.js","MongoDB","Python","Flask","requirements.txt","Pipfile","MongoEngine"],"source_link":"https://github.com/gregorybchris/comp-rank","download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/comprank--home.jpg","https://storage.googleapis.com/cgme/projects/images/comprank--compare.jpg","https://storage.googleapis.com/cgme/projects/images/comprank--rankings.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"de4192ec-9d0d-4eb8-8dce-72e77b537b2e","name":"TSA","slug":"tsa","date":"2018-05-01","rating":9,"project_type":"visualization","controls":null,"short_description":"Airport theft data visualization.","description":"For the final project of our college data visualization class, Zach Kirsch and I built a web visualization tool for exploring which airports receive the most reports of theft. Since the advent of stricter American airport security post 2001, theft committed by TSA agents has been the subject of numerous news stories. We built the visualization around the idea that people care most about airports they visit often and are curious about different categories like electronics, clothing, or jewelry.","remarks":null,"tags":["visualization","interactive","airport","security"],"tools":["JavaScript","D3.js","Less.js","TopoJSON","Python","SQLite","fuzzywuzzy","requirements.txt"],"source_link":"https://github.com/gregorybchris/tsa","download_link":null,"web_link":"https://static.chrisgregory.me/sub/tsa","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/tsa--look-for-yourself.jpg","https://storage.googleapis.com/cgme/projects/images/tsa--the-big-picture.jpg","https://storage.googleapis.com/cgme/projects/images/tsa--header.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"114ed850-4619-42f4-8035-9a64f0878420","name":"TUTF Trends","slug":"tutf-trends","date":"2018-09-06","rating":5,"project_type":"tool","controls":null,"short_description":"Track and field data visualization.","description":"Given your best time over 1 mile I might have a fair prediction for your 5k time. And with your 100m time I might estimate of your 200. My question: if I had your 400m, 800m, and mile times, could I accurately predict your half-marathon time? Can track times be extrapolated? TUTF trends is a website that pulls data from the TFRRS college track and field results reporting website. The results are visualized per-athlete and per-event to show trends in athlete performance over time.","remarks":null,"tags":["track","cross country","data","visualization"],"tools":["JavaScript","Less.js","Plotly","Python","matplotlib","Beautiful Soup"],"source_link":"https://github.com/gregorybchris/tutf-trends","download_link":null,"web_link":"https://static.chrisgregory.me/sub/tutf-trends","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/tutf-trends--chris-400m.jpg","https://storage.googleapis.com/cgme/projects/images/tutf-trends--chris-600m.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"efa6779e-c827-4701-ae2a-c3dd64f15432","name":"PCI","slug":"pci","date":"2018-12-01","rating":5,"project_type":"visualization","controls":null,"short_description":"Visualization of brain signal complexity.","description":"Despite containing some of the most exciting breakthroughs the human species has discovered, scientific research papers are often so ugly. Science doesn't need to be dull. This project is a visualization of the data pulled from the research paper \"Stratification of Unresponsive Patients by an Independently Validated Index of Brain Complexity\" (Casarotto et al. 2016). It's a paper I thought was so cool that it deserved to be spruced up a bit.","remarks":null,"tags":["neuroscience","visualization"],"tools":["JavaScript","D3.js","Lodash"],"source_link":"https://github.com/gregorybchris/pci","download_link":null,"web_link":null,"original_link":"https://onlinelibrary.wiley.com/doi/full/10.1002/ana.24779","image_links":["https://storage.googleapis.com/cgme/projects/images/pci-mine.jpg","https://storage.googleapis.com/cgme/projects/images/pci-original.jpg","https://storage.googleapis.com/cgme/projects/images/pci-paper.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"31dc8649-6fe2-4c0e-b279-10cf5c40a5be","name":"MIU","slug":"miu","date":"2019-01-27","rating":1,"project_type":"program","controls":null,"short_description":"Toy theorem prover.","description":"MIU is a toy theorem prover based on a puzzle in the book Gödel, Escher, Bach: An Eternal Golden Braid. The puzzle is to prove that the string \"MI\" can be transformed into the string \"MU\" using a set of string rewrite rules. The code uses a breadth-first search to find the shortest sequence of rewrites that \"proves\" the theorem.","remarks":null,"tags":["douglas hofstadter","theorems","proofs","mathematics"],"tools":["Python","DDT"],"source_link":"https://github.com/gregorybchris/miu","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"Python","archived":false},{"project_id":"a9560656-1ea0-469a-8e4b-876bbc8705d8","name":"SemiGenre","slug":"semi-genre","date":"2019-07-01","rating":1,"project_type":"program","controls":null,"short_description":"Music genre clustering and visualization.","description":"After starting my full time job doing machine learning, I was really excited to apply data science and visualization techniques to music. SemiGenre pulls data from SoundCloud and iTunes libraries to learn the landscape of music. Manual tags are used to cluster songs into \"semi-genres\" that are then visualized in a network visualization","remarks":null,"tags":["music","recommendation","analysis"],"tools":["Python","MySQL","SoundCloud","SQLAlchemy"],"source_link":"https://github.com/gregorybchris/semi-genre","download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/semigenre--01.jpg","https://storage.googleapis.com/cgme/projects/images/semigenre--02.jpg","https://storage.googleapis.com/cgme/projects/images/semigenre--03.jpg","https://storage.googleapis.com/cgme/projects/images/semigenre--04.jpg","https://storage.googleapis.com/cgme/projects/images/semigenre--05.jpg"],"primary_language":"Python","archived":false},{"project_id":"53ae0b07-f315-440f-96b8-5f4a4ce46c35","name":"Flicker","slug":"flicker","date":"2019-08-01","rating":1,"project_type":"tool","controls":null,"short_description":"Light level monitoring with Raspberry Pi.","description":"The light in my kitchen would turn off seemingly at random and I couldn't find any regularity in the time of day it would decide to stop working. I used a Raspberry Pi and photoresistor to continuously monitor the light levels in the room. I developed a dashboard for visualizing light levels over time, reading from a database. I ended up finding out why the light was shutting off.","remarks":"The light fixture in my kitchen would go off unexpectedly so I decided to start tracking the light levels for patterns. It turns out that the lights were mounted to an induction plate that would shut off after being on for a while.","tags":["microcomputer","monitoring"],"tools":["Python","GCloud","Google App Engine","Flask","MongoEngine","MongoDB","JavaScript","Chart.js","Vue.js","Less.js","Raspberry Pi","argparse","Pillow"],"source_link":"https://github.com/gregorybchris/flicker","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"Python","archived":false},{"project_id":"b7361d6e-af28-4c79-a1f4-4cc0a48452a2","name":"Dependy","slug":"dependy","date":"2019-10-08","rating":5,"project_type":"tool","controls":null,"short_description":"Python library dependency visualization.","description":"A utility for visualizing dependencies within a Python library. The tool parses the library and determines which files import from which other files. A frontend talks to the Python server analyzing the library and displays a force directed graph of all dependencies. The goal is to promote modularity and keep few connections between strongly connected components of the module graph.","remarks":null,"tags":["visualization","python","programming"],"tools":["Python","setup.py","Flask","argparse","JavaScript","D3.js","Less.js"],"source_link":"https://github.com/gregorybchris/dependy","download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/dependy--dependy-graph.jpg","https://storage.googleapis.com/cgme/projects/images/dependy--semigenre-graph.jpg"],"primary_language":"Python","archived":false},{"project_id":"50fed5c3-03f8-42ae-82fd-4380bf4eff65","name":"Dirstuff","slug":"dirstuff","date":"2019-12-30","rating":1,"project_type":"tool","controls":null,"short_description":"Filesystem utilities for Python.","description":"Utilities for working with the filesystem in Python. The built-in os, pathlib, and shutil libraries of Python are great. Dirstuff aims to unify them for creating, copying, moving, and renaming files and directories. Dirstuff also includes a utility for listing out large file trees. You can use it to hunt down directories and files taking up lots of space within deep recursive folder structures.","remarks":null,"tags":["tool","filesystem","directory","sizes"],"tools":["GitHub Actions","Python","Poetry","Ruff","Click","pytest","covcheck"],"source_link":"https://github.com/gregorybchris/dirstuff","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"Python","archived":false},{"project_id":"fd4a2ab1-7706-4fc7-81e6-3098842e639e","name":"Kami Solver","slug":"kami-solver","date":"2020-02-01","rating":1,"project_type":"program","controls":null,"short_description":"Solver for the mobile puzzle game Kami.","description":"Kami is a puzzle app for iPhone and Android. It is in a category of flood-fill games where the goal is to update colors of areas on the screen until all areas are of the same color. This program is a solver for Kami levels. ","remarks":"The thing I find so fascinating about the Kami game is that unlike some other puzzle games, it's relatively easy to solve Kami levels, however programming a computer to solve Kami levels has been quite hard, a great example of Moravec's paradox. The difficulty of programming the human intuition is something I find extremely compelling.","tags":["solver","puzzle"],"tools":["Haskell"],"source_link":null,"download_link":null,"web_link":null,"original_link":"https://apps.apple.com/us/app/kami/id710724007","image_links":[],"primary_language":"Haskell","archived":true},{"project_id":"aa587300-5d17-4460-8f1e-a469242cb869","name":"TinyTable","slug":"tinytable","date":"2020-02-05","rating":1,"project_type":"tool","controls":null,"short_description":"Dataset compression tool.","description":"Empirical tool to find the best file format for caching a particular dataset. Run on a CSV file to compress it.","remarks":null,"tags":["tool","benchmark","data format","dataset","python"],"tools":["Python","setup.py","matplotlib","seaborn","pandas","argparse","parquet"],"source_link":"https://github.com/gregorybchris/tinytable","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"Python","archived":true},{"project_id":"f40e4251-8d25-4dd5-be9c-1761a49de4c8","name":"Generals SDK","slug":"generals-sdk","date":"2020-04-03","rating":1,"project_type":"tool","controls":null,"short_description":"Generals.io game data analysis SDK.","description":"generals.io is an online multiplayer game created by Victor Zhou. It's a dead simple real-time strategy game where you move troops around the board to win a war against other generals. This Python SDK supports pulling game data from the generals.io site and analyzing the results. You can rank players with ELO and TrueRank and visualize the rankings over time to see how players improve over time.","remarks":null,"tags":["analysis","game","SDK"],"tools":["JavaScript","Python","slots","subprocess","trueskill","matplotlib","pandas","seaborn","setup.py"],"source_link":"https://github.com/gregorybchris/generals-sdk","download_link":null,"web_link":null,"original_link":"https://generals.io","image_links":[],"primary_language":"Python","archived":false},{"project_id":"c8cd9b7e-2002-4096-aea1-788f80d3a1d2","name":"On Move","slug":"on-move","date":"2020-05-18","rating":1,"project_type":"game","controls":null,"short_description":"Real-time multiplayer web game.","description":"A simple web page with multiplayer support. When the server is running, users can open the site and control a character and see other users' characters move in real-time.","remarks":"This project uses Three.js for 3D graphics and Socket.IO for real-time multiplayer support.","tags":["multiplayer","graphics"],"tools":["JavaScript","Socket.IO","Three.js","webpack","Express"],"source_link":"https://github.com/gregorybchris/on-move","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"JavaScript","archived":true},{"project_id":"e9df8c41-156c-4c63-ad35-2aa198e4b106","name":"Triple Town","slug":"triple-town","date":"2020-10-27","rating":9,"project_type":"game","controls":"Click to place an item.","short_description":"Clone of the mobile app Triple Town.","description":"This is a clone of the mobile app Triple Town. The goal is to place items on a grid so that similar items combine and your town grows without overcrowding. The game is over when the grid is full and no more moves are possible. For me Triple Town is really addicting, but the original app has so many ads and in app purchases that it's nearly unplayable, so I made my own very simple version.","remarks":null,"tags":["puzzle","patterns"],"tools":["JavaScript","D3.js","Less.js"],"source_link":"https://github.com/gregorybchris/triple-town","download_link":null,"web_link":"https://static.chrisgregory.me/sub/triple-town","original_link":"https://apps.apple.com/us/app/triple-town-fun-addictive-puzzle-matching-game/id490532168","image_links":["https://storage.googleapis.com/cgme/projects/images/triple-town--01.jpg","https://storage.googleapis.com/cgme/projects/images/triple-town--02.jpg","https://storage.googleapis.com/cgme/projects/images/triple-town--03.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"8a246519-431f-400f-ab6c-b8c5f4478827","name":"Spike","slug":"spike","date":"2020-12-29","rating":1,"project_type":"program","controls":null,"short_description":"Spiking neural network implementation.","description":"Spike is a simple implementation of a spiking neural network (SNN), designed to more closely model biological neural networks than artificial neural networks (ANNs). It doesn't do anything useful, but it gave me an opportunity to practice my JavaScript and write my own random number generator.","remarks":null,"tags":["neuroscience","network"],"tools":["JavaScript","Jest"],"source_link":"https://github.com/gregorybchris/spike","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"JavaScript","archived":false},{"project_id":"9fa885ec-7ac7-483e-9f16-eeb7ca9a3813","name":"Robby","slug":"robby","date":"2021-01-03","rating":1,"project_type":"program","controls":null,"short_description":"Robby the Robot genetic algorithm.","description":"Robby the Robot is a coding project introduced in Melanie Mitchell's book \"Complexity: A Guided Tour\". It's an introduction to genetic algorithms with a toy problem involving \"Robby\", a robot who learns to pick up empty soda cans from a messy room. This was also my first personal project in Rust.","remarks":null,"tags":["evolution","genetic","robot"],"tools":["Rust"],"source_link":"https://github.com/gregorybchris/robby","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"Rust","archived":false},{"project_id":"9e6e1f38-2d0e-4ee1-a0b7-dfbc9984c752","name":"JsonVL","slug":"jsonvl","date":"2021-02-17","rating":3,"project_type":"tool","controls":null,"short_description":"JSON validator for Python.","description":"JsonVL is a JSON validator for Python. This project is intended to be a replacement for the jsonschema package which implements the JSON Schema standard. JsonVL's goal is to curate a rich set of validation methods for JSON data types while remaining extensible to new constraints. While jsonschema is great for basic JSON Schema validation, sometimes you want something custom and JsonVL provides a Constraint interface for specialized validation.","remarks":null,"tags":["programming","data","constraints"],"tools":["Python","setup.py","GitHub Actions","flake8","pytest","Codecov","argparse","Sphinx"],"source_link":"https://github.com/gregorybchris/jsonvl","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"Python","archived":false},{"project_id":"aceed201-d04e-4199-8044-49df57df720b","name":"Big Life","slug":"big-life","date":"2021-10-06","rating":3,"project_type":"simulation","controls":null,"short_description":"Conway's Game of Life visualization.","description":"A web visualization of Conway's Game of Life. It uses a sparse cell representation to make computing larger patterns more efficient. Even if a glider flies off the screen for a million steps, the size of the world remains the size of the screen plus the number of living cells out of view. This enables accurate computation of the world state without resorting to a toroidal grid.","remarks":null,"tags":["visualization","interactive","cellular","automata"],"tools":["TypeScript","D3.js","Less.js"],"source_link":"https://github.com/gregorybchris/big-life","download_link":null,"web_link":"https://static.chrisgregory.me/sub/big-life","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/big-life--01.jpg"],"primary_language":"TypeScript","archived":false},{"project_id":"ba5994d6-dc3e-4623-8d77-2d70e81c484d","name":"hlucb","slug":"hlucb","date":"2022-01-09","rating":1,"project_type":"tool","controls":null,"short_description":"Hamming-LUCB algorithm implementation.","description":"A Python implementation of the Hamming-LUCB algorithm from the paper \"Approximate ranking from pairwise comparisons\" (Heckel et al, 2018). The algorithm can be used to approximately sort a set of items when you have a limited number of comparisons. The algorithm guarantees that the set of highest rated items are all strictly better than the set of lowest rated items with some probability.","remarks":null,"tags":["programming","comparison","ranking"],"tools":["Python","Poetry","pytest","flake8","pylint","yapf"],"source_link":"https://github.com/gregorybchris/hlucb","download_link":null,"web_link":null,"original_link":"https://arxiv.org/abs/1801.01253","image_links":[],"primary_language":"Python","archived":false},{"project_id":"4e8452f7-cbab-4e91-a29c-1bd45f47e733","name":"Orbit","slug":"orbit","date":"2022-02-12","rating":3,"project_type":"simulation","controls":null,"short_description":"Musical simulation of planets orbiting a star.","description":"Inspired by the Steve Mould YouTube video \"The Planets Are Weirdly In Sync\", Orbit is a musical simulation of planets orbiting a star. I spent countless hours trying to solve Kepler's equations so that plants would orbit with realistic acceleration. I found the math was more difficult than anticipated, so I resorted to the Newton-Raphson method to solve the equations numerically. The project is in a half-completed state and the musical aspect of the project is sadly unimplemented.","remarks":null,"tags":["simulation","orbit","plant","space","music","resonance"],"tools":["JavaScript","D3.js","Less.js","SweetAlert","Tone.js","requestAnimationFrame"],"source_link":"https://github.com/gregorybchris/orbit","download_link":null,"web_link":"https://static.chrisgregory.me/sub/orbit","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/orbit--01.jpg","https://storage.googleapis.com/cgme/projects/images/orbit--02.jpg"],"primary_language":"JavaScript","archived":false},{"project_id":"2d4a74a5-e1d5-4d87-9881-893adeb64532","name":"Contraction","slug":"contraction","date":"2022-04-18","rating":3,"project_type":"program","controls":null,"short_description":"Graph neural networks for efficient tree search.","description":"This deep learning project is a solver for a mobile puzzle game called Kami. First, levels from Kami are converted from images to graphs using some heuristics and computer vision tricks. Then the graph is transformed by a series of graph contractions. The solver is pretty fast, but for hard levels the search space explodes combinatorially. A graph neural network is trained to predict the number of contractions needed to solve a level. The network is used as a search heuristic for the solver.","remarks":null,"tags":["graph","contraction","prediction","network"],"tools":["Python","PyTorch","PyG","Poetry","networkx","click"],"source_link":"https://github.com/gregorybchris/contraction","download_link":null,"web_link":null,"original_link":"https://apps.apple.com/us/app/kami/id710724007","image_links":["https://storage.googleapis.com/cgme/projects/images/contraction--01.jpg","https://storage.googleapis.com/cgme/projects/images/contraction--02.jpg","https://storage.googleapis.com/cgme/projects/images/contraction--03.jpg","https://storage.googleapis.com/cgme/projects/images/contraction--04.jpg"],"primary_language":"Python","archived":false},{"project_id":"0c49142d-d458-4a4a-a2e1-7c7ec73f66cf","name":"Ants","slug":"ants","date":"2022-05-12","rating":5,"project_type":"simulation","controls":null,"short_description":"Ant colony simulation.","description":"Web visualization of ants foraging. Ants drop one type of pheromone when leaving the nest and another when they have found food. By using pheromone density as a navigation heuristic a colony of ants can quickly forage large clusters of food that would have taken far longer without the simple yet powerful pheromone communication system. Once again, emergence in complex systems doesn't disappoint.","remarks":null,"tags":["simulation","ant","colony","pheromones","emergence"],"tools":["JavaScript","Yarn","webpack","Tailwind CSS","Sass","requestAnimationFrame","React"],"source_link":"https://github.com/gregorybchris/ants","download_link":null,"web_link":"https://static.chrisgregory.me/ants/demo","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/ants--01.jpg","https://storage.googleapis.com/cgme/projects/images/ants--02.jpg"],"primary_language":"TypeScript","archived":false},{"project_id":"bebb901b-a937-4b27-aef0-704d0ff162c1","name":"Wavelength","slug":"wavelength","date":"2022-11-25","rating":5,"project_type":"game","controls":"Press enter to generate a new turn.","short_description":"Command line clone of the Wavelength board game.","description":"Command line clone of the Wavelength board game. Generate prompts to play Wavelength from anywhere. My extended family wanted to play this game for Thanksgiving but we didn't have the physical board game. I threw together this simple command line version so we could play together.","remarks":null,"tags":["board","game","guess","spectrum","extreme"],"tools":["Python","pandas"],"source_link":"https://github.com/gregorybchris/wavelength","download_link":null,"web_link":null,"original_link":"https://www.wavelength.zone","image_links":[],"primary_language":"Python","archived":false},{"project_id":"d711b3f1-e998-4f45-aee2-204713efdd2f","name":"Chladni","slug":"chladni","date":"2022-12-25","rating":5,"project_type":"simulation","controls":null,"short_description":"Web simulation of Chladni figures.","description":"Web simulation of Chladni figures. A vibrating surface is simulated as a 2D standing wave. Sand particles are added which bounce around, their magnitude of movement proportional to the surface's wave magnitude. Regions on the surface with no movement correspond to nodes of the wave and sand tends to pool in these regions. There's something that feels very deep and fundamental (pun intended) about these patterns.","remarks":null,"tags":["simulation","chladni","figures","resonance","vibration"],"tools":["TypeScript","Yarn","Tailwind CSS","React","Next.js"],"source_link":"https://github.com/gregorybchris/chladni","download_link":null,"web_link":"https://static.chrisgregory.me/chladni/demo","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/chladni--01.jpg","https://storage.googleapis.com/cgme/projects/images/chladni--02.jpg"],"primary_language":"TypeScript","archived":false},{"project_id":"8ec826b8-8f3b-400a-917d-d162514b7d8b","name":"Decidio","slug":"decidio","date":"2023-02-03","rating":5,"project_type":"tool","controls":null,"short_description":"Website for making hard decisions.","description":"A little web tool to help you make hard decisions. Fill out your options and the criteria you care about and decidio will help you reason about the best choice. I've used this method when making hard decisions in my life. Seeing the numerical outcome can help you come to terms with the right answer for you, but if the outcome seems counter intuitive it could mean you need to re-evaluate your criteria. Iterating on the numerical outcome can help you intuitively accept the best path forward.","remarks":null,"tags":["decision","choice","options","preferences","uncertainty"],"tools":["TypeScript","Yarn","Tailwind CSS","React","Vite","React Table","Luxon","Faker"],"source_link":"https://github.com/gregorybchris/decidio","download_link":null,"web_link":"https://static.chrisgregory.me/decidio/demo","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/decidio--01.jpg","https://storage.googleapis.com/cgme/projects/images/decidio--02.jpg"],"primary_language":"TypeScript","archived":false},{"project_id":"28e421c5-9424-48a2-a1cf-4c12f951c10b","name":"bfprt","slug":"bfprt","date":"2023-02-19","rating":1,"project_type":"tool","controls":null,"short_description":"Python implementation of the BFPRT algorithm.","description":"A Python implementation of Fast median finding with the median of medians selection algorithm, also known as BFPRT - named after the authors of Blum et al. (1973). This algorithm is a deterministic selection algorithm that finds the kth smallest element in an unordered list in O(n) time. While this method is not the fastest in practice due to its large constant overhead, it's foundational to many proofs in algorithms and computational geometry in particular.","remarks":null,"tags":["programming","median","selection","algorithm"],"tools":["Python","Ruff","pytest","Poetry"],"source_link":"https://github.com/gregorybchris/bfprt","download_link":null,"web_link":null,"original_link":"https://en.wikipedia.org/wiki/Median_of_medians","image_links":[],"primary_language":"Python","archived":false},{"project_id":"cc12891f-1bf0-4603-b8ad-f5a03f09c67e","name":"Quad","slug":"quad","date":"2023-03-11","rating":5,"project_type":"simulation","controls":null,"short_description":"Boids simulation with a quadtree visualization.","description":"Given how much I love simulations of complex systems I should have implemented a quadtree long ago. Often the efficiency of a simulation means less to me than its correctness, but this time I wanted to focus on efficiency and prove that I really understood quadtrees. To keep everything else as simple as possible I rewrote Boids, but this time included a real time visualization of the quadtree divisions.","remarks":null,"tags":["simulation","boids","quadtree","space","partitioning"],"tools":["TypeScript","Yarn","Tailwind CSS","React","Vite"],"source_link":"https://github.com/gregorybchris/quad","download_link":null,"web_link":"https://static.chrisgregory.me/quad/demo","original_link":"https://en.wikipedia.org/wiki/Quadtree","image_links":["https://storage.googleapis.com/cgme/projects/images/quad--01.jpg","https://storage.googleapis.com/cgme/projects/images/quad--02.jpg"],"primary_language":"TypeScript","archived":false},{"project_id":"274bf483-ae8d-4c33-b181-39b820b1400b","name":"Cado","slug":"cado","date":"2023-03-23","rating":5,"project_type":"tool","controls":null,"short_description":"Reactive notebook IDE for Python.","description":"Cado is a notebook IDE with a focus on reactivity. By explicitly defining cell dependencies you get benefits that other notebook IDEs like Jupyter can't provide. When a cell runs, all of its dependencies listen for changes to the output and update themselves accordingly. Dependencies only rerun when needed. The directed acyclic graph of cells guarantees that the notebook will always produce the same output regardless of the order of cell execution.","remarks":null,"tags":["coding","development","environment","python","programming"],"tools":["Python","Poetry","click","FastAPI","flake8","covcheck","yapf","GitHub Actions","Vite"],"source_link":"https://github.com/gregorybchris/cado","download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/cado--notebooks.jpg","https://storage.googleapis.com/cgme/projects/images/cado--notebook.jpg","https://storage.googleapis.com/cgme/projects/images/cado--oops-screen.jpg"],"primary_language":"Python","archived":false},{"project_id":"8df1ea6d-6fd0-451e-8928-65b9d12b2a72","name":"EngineRoom","slug":"engineroom","date":"2023-11-11","rating":7,"project_type":"tool","controls":null,"short_description":"Rowing lineup generator and regatta scheduling tool.","description":"This is a web app that generates rowing lineups for my rowing club. There are many criteria that factor into who sits where in a rowing shell and there are many combinations of rowers that may show up to practice on a given day. Turning all those constraints into a lineup requires quite a bit of human intuition and usually some iteration to find a lineup that works well. EngineRoom automates the process of lineup generation with a heuristic search.","remarks":null,"tags":["rowing","boathouse","lineups","generator","seat","race","erg"],"tools":["TypeScript","Next.js","React","Prisma","Tailwind CSS","Zod","Python","FastAPI","GitHub Actions","Fly.io","click","pendulum","rapidfuzz","covcheck","flake8","pytest","yapf","Docker"],"source_link":null,"download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/engineroom--01.jpg","https://storage.googleapis.com/cgme/projects/images/engineroom--02.jpg","https://storage.googleapis.com/cgme/projects/images/engineroom--03.jpg","https://storage.googleapis.com/cgme/projects/images/engineroom--04.jpg","https://storage.googleapis.com/cgme/projects/images/engineroom--optimize.png"],"primary_language":"TypeScript","archived":false},{"project_id":"3aac2a27-c24a-45e2-bfef-ffa36107511f","name":"Scrapscript","slug":"scrapscript","date":"2023-12-06","rating":9,"project_type":"program","controls":null,"short_description":"Functional programming language interpreter.","description":"Scrapscript is a functional programming language that aims to solve the software shareability problem. My friend Max and I found the specification for this language by Taylor Troesh and were excited about its potential. We decided to implement an interpreter in Python and created our own web REPL so you can try the language out for yourself without downloading anything.","remarks":null,"tags":["scrapscript","language","functional","interpreter","compiler","dependency","haskell","api"],"tools":["Python","Poetry","Fly.io","Ruff","pytest","GitHub Actions"],"source_link":"https://github.com/tekknolagi/scrapscript","download_link":null,"web_link":"https://scrapscript.fly.dev/repl","original_link":"https://scrapscript.org","image_links":["https://storage.googleapis.com/cgme/projects/images/scrapscript--01.jpg"],"primary_language":"Python","archived":false},{"project_id":"126440da-37dd-44c9-8a74-fc875ff06953","name":"Typogenetics","slug":"typogenetics","date":"2023-12-28","rating":7,"project_type":"program","controls":null,"short_description":"Artificial evolutionary system from Douglas Hofstadter","description":"Implementation of the artificial evolutionary system described in Douglas Hofstadter's \"Gödel, Escher, Bach\". Strands of bases are translated into sequences of amino acids. Amino acids are mapped to instructions. Instructions are applied to strands to produce new strands. This tangled hierarchy has the potential to enable the evolution of self-replicating enzymes. I implemented this project in Python and then used ChatGPT to convert it into Rust.","remarks":null,"tags":["genetics","biology","complexity","simulation","life","hofstadter","hierarchy","strange","loop"],"tools":["Python","uv","Typer","ruff","pytest","rich","GitHub Actions"],"source_link":"https://github.com/gregorybchris/typogenetics","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"Python","archived":false},{"project_id":"9c2be332-91a6-4ad0-883a-b7d6f1aba7eb","name":"Vidrank","slug":"vidrank","date":"2024-01-15","rating":5,"project_type":"tool","controls":null,"short_description":"Web interface for prioritizing YouTube videos.","description":"Web interface for prioritizing YouTube videos in large playlists. Uses TrueSkill rating algorithm to select batches of videos to compare for fast ranking. The interface is designed to allow you to prioritize YouTube videos if you have a large backlog of content to work through.","remarks":null,"tags":["youtube","video","interface","trueskill","ranking","rating","prioritization","elo"],"tools":["TypeScript","Python","Poetry","Fly.io","Docker","GitHub Actions","click","FastAPI","pendulum","trueskill","Ruff","covcheck","Tailwind CSS","Luxon","ts-pattern","Next.js","React","Phosphor Icons","Radix"],"source_link":"https://github.com/gregorybchris/vidrank","download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/vidrank--main.jpg","https://storage.googleapis.com/cgme/projects/images/vidrank--ratings.jpg"],"primary_language":"TypeScript","archived":false},{"project_id":"e3d78601-e7ca-483a-a3a4-632e13d64e78","name":"Langton","slug":"langton","date":"2024-01-17","rating":3,"project_type":"simulation","controls":null,"short_description":"Langton's ant cellular automaton simulation.","description":"Simulation of a cellular automaton called Langton's ant. It's a demonstration of very simple rules leading to complex emergent behavior. This project generates an mp4 video by streaming iterations of the simulation to frames of a video on disk. This simple little ant is provably Turing complete.","remarks":null,"tags":["simulation","cellular","automaton","ant","langton"],"tools":["Python","Poetry","click","OpenCV","black","pylint","pytest"],"source_link":"https://github.com/gregorybchris/langton","download_link":null,"web_link":null,"original_link":"https://en.wikipedia.org/wiki/Langton%27s_ant","image_links":["https://storage.googleapis.com/cgme/projects/images/langton--01.gif"],"primary_language":"Python","archived":false},{"project_id":"66489382-3dfb-4eef-9b4a-7c30b37e009f","name":"idtrace","slug":"idtrace","date":"2024-08-11","rating":3,"project_type":"program","controls":null,"short_description":"Microservice for tracing the origin of unique identifiers.","description":"Microservice for tracing the origin of unique identifiers. A user can run this microservice and associate user IDs with item IDs, enabling them to generate shareable links for items with embedded information about the user who shared the link.","remarks":null,"tags":["uuid","link","shareable","url","trace","origin"],"tools":["Python","Poetry","FastAPI","SQLModel","Ruff","pytest"],"source_link":"https://github.com/gregorybchris/idtrace","download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/idtrace--01.jpg"],"primary_language":"Python","archived":false},{"project_id":"93699c64-1103-4324-a356-6429f2792b20","name":"markers","slug":"markers","date":"2024-08-19","rating":3,"project_type":"program","controls":null,"short_description":"Boolean formula parser and evaluator.","description":"Program for parsing and evaluating expressions of boolean variables. The parser supports AND, OR, NOT, and parentheses. Given a boolean formula as a string and a set of variable assignments, the program evaluates the formula and returns the result.","remarks":null,"tags":["boolean","formula","parsing","binary","conditional","interpreter","sat"],"tools":["Python","Poetry","click","Ruff","pytest"],"source_link":"https://github.com/gregorybchris/markers","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"Python","archived":false},{"project_id":"34dcb22e-8ddc-45c4-a5f2-f2342759bd8d","name":"surv","slug":"surv","date":"2024-09-01","rating":3,"project_type":"program","controls":null,"short_description":"Dynamic survey generator.","description":"Program to dynamically select survey questions based on previous answers using information theory. The ID3 and C4.5 algorithms were used as inspiration for this program, which uses entropy and information gain to compute the feature most likely to help predict a target variable. This codebase also provides a tabular dataset abstraction that is independent of surveys that can be used to associate feature type and purpose information with columns of a tabular dataset.","remarks":null,"tags":["survey","decision","tree","dynamic","dataset","question"],"tools":["Python","Poetry","click","pandas","Ruff","pytest","pydantic-settings"],"source_link":"https://github.com/gregorybchris/surv","download_link":null,"web_link":null,"original_link":null,"image_links":[],"primary_language":"Python","archived":false},{"project_id":"bc34f93b-a65a-42fb-b4e8-aa65c6a762da","name":"tuxc","slug":"tuxc","date":"2024-11-30","rating":6,"project_type":"tool","controls":null,"short_description":"Tufts University Cross Country team website.","description":"tuxc.org is a website for the Tufts University Cross Country team. The site is a collection of running routes around the Tufts campus, building on the data collected by the TUXC Run Preservation Project of 2020.","remarks":null,"tags":["run","route","college","cross","country","team","boston","map","track","running","archive"],"tools":["TypeScript","Next.js","React","Tailwind CSS","Mapbox"],"source_link":"https://github.com/gregorybchris/tuxc","download_link":null,"web_link":"https://www.tuxc.org","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/tuxc--01.jpg","https://storage.googleapis.com/cgme/projects/images/tuxc--03.jpg","https://storage.googleapis.com/cgme/projects/images/tuxc--04.jpg"],"primary_language":"TypeScript","archived":false},{"project_id":"8d421fa3-3a93-4df2-a38f-3fb8d4f2fd2b","name":"Myxa","slug":"myxa","date":"2024-12-30","rating":3,"project_type":"tool","controls":null,"short_description":"Compatibility-aware package manager.","description":"Myxa is a compatibility-aware package manager. By tracking type signatures of package members, Myxa can check packages before they are published to enforce semantic versioning. It can also auto-upgrade users to the newest compatible version.","remarks":null,"tags":["package","upgrade","dependency","management","repository","manager","compatibility"],"tools":["Python","uv","covcheck","Ruff","pytest","Typer"],"source_link":"https://github.com/gregorybchris/myxa","download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/myxa--package.png"],"primary_language":"Python","archived":false},{"project_id":"e95acc0c-3708-4d13-8ca4-7e74bb0cf3ce","name":"Cadenza","slug":"cadenza","date":"2025-04-06","rating":6,"project_type":"program","controls":null,"short_description":"Music theory experiments.","description":"Music theory and audio engineering experiments including a pipe organ synthesizer, chord parser, and just-intonation optimizer.","remarks":null,"tags":["music","theory","audio","engineering"],"tools":["Python","uv","Ruff","pytest","Typer","rich","pyyaml","torch","torchaudio"],"source_link":"https://github.com/gregorybchris/cadenza","download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/cadenza--spectrogram.png","https://storage.googleapis.com/cgme/projects/images/cadenza--optimize.png"],"primary_language":"Python","archived":false},{"project_id":"968cd978-1d22-4e94-827d-a38098e15020","name":"TrueScore","slug":"truescore","date":"2025-04-13","rating":5,"project_type":"program","controls":null,"short_description":"Gaussian belief propagation for marketplace optimization.","description":"TrueScore considers how users rate items in an online marketplace and provides a measure of rater reliability using Gaussian belief propagation. The model jointly learns to estimate item quality and user reliability from data, putting less weight on ratings from users determined to be less reliable. As rater reliability changes, so do item quality estimates, hence the \"propagation\" in Gaussian belief propagation.","remarks":null,"tags":["online","marketplace","reliability","trust","network","reputation","rating","score","product","item","user"],"tools":["Python","uv","Ruff","pytest","Typer","FastAPI","SQLModel","rich"],"source_link":"https://github.com/gregorybchris/truescore","download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/truescore--loss-curve.png"],"primary_language":"Python","archived":false},{"project_id":"ae7deb06-81f4-4826-a6ac-91d730b41868","name":"MNIST NCA","slug":"mnist-nca","date":"2025-05-21","rating":7,"project_type":"program","controls":null,"short_description":"Self-classifying MNIST Digits.","description":"A PyTorch implementation of \"Self-classifying MNIST Digits: Achieving Distributed Coordination with Neural Cellular Automata\" (2020) by Randazzo, Mordvintsev, Niklasson, Levin, and Greydanus.","remarks":null,"tags":["self","classifying","digits","mnist","neural","cellular","automata"],"tools":["Python","uv","Ruff","pytest","Typer","PyTorch","rich","Pillow","OpenCV","matplotlib"],"source_link":"https://github.com/gregorybchris/mnist-nca","download_link":null,"web_link":null,"original_link":"https://distill.pub/2020/selforg/mnist","image_links":["https://storage.googleapis.com/cgme/projects/images/mnist-nca--mutations.gif","https://storage.googleapis.com/cgme/projects/images/mnist-nca--d5.gif","https://storage.googleapis.com/cgme/projects/images/mnist-nca--loss-history.png"],"primary_language":"Python","archived":false},{"project_id":"e89fd7e7-8ebe-47d4-8183-cb5389a4c4a2","name":"Zhed","slug":"zhed","date":"2025-07-25","rating":2,"project_type":"program","controls":null,"short_description":"Solver for the mobile puzzle game Zhed.","description":"Zhed is a puzzle game for iPhone and Android. The object of the game is to determine the correct order of moves to cover a goal location on a grid of tiles. The creator of Zhed was very thoughtful about how levels progress. Each level gets just slightly harder and every few levels you're guided to a new insight that helps you solve all levels more efficiently. The game gives you a feeling of discovery that is rare to find in a game with such a simple interface.","remarks":null,"tags":["solver","puzzle"],"tools":["Python","uv","Ruff","pytest","Typer","rich","pyyaml","ThreadPoolExecutor"],"source_link":"https://github.com/gregorybchris/zhed","download_link":null,"web_link":null,"original_link":"https://play.google.com/store/apps/details?id=com.groundcontrol.zhed","image_links":["https://storage.googleapis.com/cgme/projects/images/zhed--benchmark.gif"],"primary_language":"Python","archived":false},{"project_id":"ae9304f7-ef4d-4b71-9f0f-967f87cbbe15","name":"GlazeTown","slug":"glaze-town","date":"2026-01-17","rating":5,"project_type":"tool","controls":null,"short_description":"Website for potters and ceramicists to discover glaze combinations.","description":"GlazeTown is a website that lets potters and ceramicists discover new glaze combinations and share the glazes they've used on past pieces.","remarks":null,"tags":["glaze","pottery","ceramics","art","color","share","discover"],"tools":["Firebase","Vite","React","Tailwind CSS","Framer Motion","Recharts","Embla Carousel"],"source_link":null,"download_link":null,"web_link":null,"original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/glaze-town--01.png","https://storage.googleapis.com/cgme/projects/images/glaze-town--02.png","https://storage.googleapis.com/cgme/projects/images/glaze-town--03.png","https://storage.googleapis.com/cgme/projects/images/glaze-town--04.png","https://storage.googleapis.com/cgme/projects/images/glaze-town--05.png"],"primary_language":"TypeScript","archived":false},{"project_id":"51cd03b0-d4bf-48ce-9925-47dfe6d20ee6","name":"Fermata","slug":"fermata","date":"2026-02-10","rating":8,"project_type":"tool","controls":null,"short_description":"Custom programming language and web IDE.","description":"Fermata is a custom programming language and web IDE. The language is designed to be simple and easy to learn, with a focus on readability and expressiveness. The web IDE includes code examples to help users learn the language and users can create their own projects that are shared globally.","remarks":null,"tags":["programming","language","interpreter","parser"],"tools":["Python","uv","Ruff","pytest","Typer","FastAPI","SQLModel","rich","inflect","unique-namer","loguru","lark"],"source_link":null,"download_link":null,"web_link":"https://fermata-ide.vercel.app","original_link":null,"image_links":["https://storage.googleapis.com/cgme/projects/images/fermata--ide.png","https://storage.googleapis.com/cgme/projects/images/fermata--about.png"],"primary_language":"Python","archived":false}]