You are browsing as a guest. Sign up (or log in) to start making projects!

Hamstersarus

@Hamstersarus

Joined June 2nd, 2026

  • 6Devlogs
  • 5Projects
  • 1Ships
  • 0Votes
Ship Changes requested

I created a website to serve as my portfolio. It is a tiny web operating system. Instead of making just a regular about me page, I made a "desktop" that people can use to get to know me. I included by resume, skills, prior projects, and contact information.

Try project → See source code →
Open comments for this post

33m 42s logged

This update was mostly polish and housekeeping. I renamed my repository to HamstersarusOS, which gave my portfolio a cleaner link to share around — it now lives at https://hamstersarus.github.io/HamstersarusOS/. After renaming I went through and updated all the internal links so the project cards and README point to the new address instead of the old broken one. I also cleaned up my portfolio a bit: I tweaked the likes in my About Me section and removed a leftover note in the Skills app that was only meant for me but was accidentally showing to visitors. Nothing flashy this time, just tightening things up and making the site easier to send to people.

This update was mostly polish and housekeeping. I renamed my repository to HamstersarusOS, which gave my portfolio a cleaner link to share around — it now lives at https://hamstersarus.github.io/HamstersarusOS/. After renaming I went through and updated all the internal links so the project cards and README point to the new address instead of the old broken one. I also cleaned up my portfolio a bit: I tweaked the likes in my About Me section and removed a leftover note in the Skills app that was only meant for me but was accidentally showing to visitors. Nothing flashy this time, just tightening things up and making the site easier to send to people.

Replying to @Hamstersarus

0
Open comments for this post

48m 32s logged

Since my last update I turned my webOS into a proper portfolio. First I gave the music player a real upgrade so a lofi track starts playing the moment you enter the desktop, with a little “now playing” notification, and it keeps playing even if you close the music window instead of stacking a second song on top like it used to. Then I added four new apps to show off my work: a Projects window with cards for HamstersarusOS, my SENTINEL surveillance game, my Fight game, and my 2048 game, each linked to its GitHub repo; a Skills window with little proficiency bars; a Resume window with my education, internship, and awards; and a Contact window with my GitHub, LinkedIn, and email. I also filled in the About Me app with my real name and bio. One thing I was careful about was privacy, since the site is fully public with no password I deliberately left my home address and phone number off it and only put the professional stuff online. It’s all live at https://hamstersarus.github.io/Hamstersarus_Website/ and it actually feels like a portfolio now instead of just a demo.

Since my last update I turned my webOS into a proper portfolio. First I gave the music player a real upgrade so a lofi track starts playing the moment you enter the desktop, with a little “now playing” notification, and it keeps playing even if you close the music window instead of stacking a second song on top like it used to. Then I added four new apps to show off my work: a Projects window with cards for HamstersarusOS, my SENTINEL surveillance game, my Fight game, and my 2048 game, each linked to its GitHub repo; a Skills window with little proficiency bars; a Resume window with my education, internship, and awards; and a Contact window with my GitHub, LinkedIn, and email. I also filled in the About Me app with my real name and bio. One thing I was careful about was privacy, since the site is fully public with no password I deliberately left my home address and phone number off it and only put the professional stuff online. It’s all live at https://hamstersarus.github.io/Hamstersarus_Website/ and it actually feels like a portfolio now instead of just a demo.

Replying to @Hamstersarus

0
Open comments for this post

38m 47s logged

Since my last update I finished the rest of the webOS jam. I built my first real app, an About Me window with a little bio and my likes and dislikes, and then two “advanced” apps: a music player that actually plays real lofi tracks with play, pause, and skip (the disc even spins while it’s playing), and a fully playable purple version of 2048 that you control with the arrow keys or WASD. The 2048 game is my bonus feature that the guide didn’t ask for. The trickiest part was a layout bug where the 2048 board kept spilling out of its window and making everything look like it was shifting around while I played, which turned out to be a CSS grid quirk where the columns refused to shrink to fit, fixed by switching them to minmax(0, 1fr). I also added a README so anyone visiting my repo knows what the project is and how to run it. Everything is live and public at https://hamstersarus.github.io/Hamstersarus_Website/ and all five parts of the jam are now done.

Since my last update I finished the rest of the webOS jam. I built my first real app, an About Me window with a little bio and my likes and dislikes, and then two “advanced” apps: a music player that actually plays real lofi tracks with play, pause, and skip (the disc even spins while it’s playing), and a fully playable purple version of 2048 that you control with the arrow keys or WASD. The 2048 game is my bonus feature that the guide didn’t ask for. The trickiest part was a layout bug where the 2048 board kept spilling out of its window and making everything look like it was shifting around while I played, which turned out to be a CSS grid quirk where the columns refused to shrink to fit, fixed by switching them to minmax(0, 1fr). I also added a README so anyone visiting my repo knows what the project is and how to run it. Everything is live and public at https://hamstersarus.github.io/Hamstersarus_Website/ and all five parts of the jam are now done.

Replying to @Hamstersarus

0
Open comments for this post

23m logged

Building my personal website as a little web operating system for Stardance, following the Hack Club webOS jam. It’s plain HTML, CSS, and JavaScript with a lavender “Tokyo Night” desktop-rice look crossed with a Y2K Windows scrapbook vibe, and the graph-paper wallpaper is pure CSS. So far I’ve got a welcome screen that boots into a desktop with a live clock, clickable desktop icons, and draggable windows you can move around, bring to the front, and close. The trickiest bug was my enter button “not working,” which turned out to be my code editor’s preview, not my code, fixing itself the moment I opened it in a real browser. It’s live and public at https://hamstersarus.github.io/Hamstersarus_Website/ and next up is building my first real app plus a bonus feature the guide doesn’t cover.

Building my personal website as a little web operating system for Stardance, following the Hack Club webOS jam. It’s plain HTML, CSS, and JavaScript with a lavender “Tokyo Night” desktop-rice look crossed with a Y2K Windows scrapbook vibe, and the graph-paper wallpaper is pure CSS. So far I’ve got a welcome screen that boots into a desktop with a live clock, clickable desktop icons, and draggable windows you can move around, bring to the front, and close. The trickiest bug was my enter button “not working,” which turned out to be my code editor’s preview, not my code, fixing itself the moment I opened it in a real browser. It’s live and public at https://hamstersarus.github.io/Hamstersarus_Website/ and next up is building my first real app plus a bonus feature the guide doesn’t cover.

Replying to @Hamstersarus

0
Open comments for this post

1h 49m 24s logged

The quit option:

Added a Q — Quit option to the action menu so it appears on every turn. Typing it exits the game cleanly with a goodbye message. It’s also documented on the instructions screen now.

Trimming dead code:

Character.java carried a full set of getters and setters that nothing in the game actually called — every field is accessed directly. I removed all of them, so Character.java is now just its fields, the ANSI color constants, and a constructor, which is exactly what a data-model class should be.

Board.java documentation:

Added thorough inline comments throughout Board.java, explaining the grid primitives, the ANSI cursor-positioning trick used in printBoard() (the CELL/START column math that keeps emoji aligned), and every map-object method.

The big one — an automated test harness:

The headline addition is TestHarness.java, a standalone tool that stress-tests the whole combat system. It runs every character against every character — all 100 matchups, 20 times each, in two passes (once with map objects, once without) for roughly 4,000 battles. Both fighters are driven by the existing opponent AI, so no input is needed. Each battle is wrapped to catch any exception or assertion failure, and a turn cap catches any battle that never ends. At the end it prints a win-rate matrix plus a count of any crashes or timeouts.

Making this fast required one small change to Fight.java: an animationsEnabled flag, because the attack animation uses Thread.sleep and 4,000 battles of real-time animation would take hours. The flag defaults to on, so normal play is unaffected; the harness flips it off. I wrote the full design into CLAUDE.md before building it.

The first run came back completely clean — 0 exceptions, 0 timeouts, all in about 300ms — and the results matrix matched expectations (Dragon dominates, Goblin and Zombie struggle), which is a good sign the combat, ability, shield, and map-object systems all hold up under every pairing.

Smaller touches:

Added a credits line under the title screen, updated the README with the quit option, the new file, and a testing section.

The quit option:

Added a Q — Quit option to the action menu so it appears on every turn. Typing it exits the game cleanly with a goodbye message. It’s also documented on the instructions screen now.

Trimming dead code:

Character.java carried a full set of getters and setters that nothing in the game actually called — every field is accessed directly. I removed all of them, so Character.java is now just its fields, the ANSI color constants, and a constructor, which is exactly what a data-model class should be.

Board.java documentation:

Added thorough inline comments throughout Board.java, explaining the grid primitives, the ANSI cursor-positioning trick used in printBoard() (the CELL/START column math that keeps emoji aligned), and every map-object method.

The big one — an automated test harness:

The headline addition is TestHarness.java, a standalone tool that stress-tests the whole combat system. It runs every character against every character — all 100 matchups, 20 times each, in two passes (once with map objects, once without) for roughly 4,000 battles. Both fighters are driven by the existing opponent AI, so no input is needed. Each battle is wrapped to catch any exception or assertion failure, and a turn cap catches any battle that never ends. At the end it prints a win-rate matrix plus a count of any crashes or timeouts.

Making this fast required one small change to Fight.java: an animationsEnabled flag, because the attack animation uses Thread.sleep and 4,000 battles of real-time animation would take hours. The flag defaults to on, so normal play is unaffected; the harness flips it off. I wrote the full design into CLAUDE.md before building it.

The first run came back completely clean — 0 exceptions, 0 timeouts, all in about 300ms — and the results matrix matched expectations (Dragon dominates, Goblin and Zombie struggle), which is a good sign the combat, ability, shield, and map-object systems all hold up under every pairing.

Smaller touches:

Added a credits line under the title screen, updated the README with the quit option, the new file, and a testing section.

Replying to @Hamstersarus

0
Open comments for this post

1h 43m 5s logged

The biggest change this session was a major refactor of how the code is organized across files. Fight.java was getting bloated as the game controller, so logic was redistributed to the classes that actually own it.

Board.java gained five new methods: printBoard() (the bordered grid renderer), spawnObjects(), checkObjectInteraction(), restoreHouseIfVacating(), and ejectFromHouseIfExpired(). All of the map object logic now lives alongside the board data it operates on, rather than sitting in the game controller as static helpers.

Opponent.java absorbed moveOpponentToward() and opponentAI() as instance methods. An opponent now knows how to move and take its turn — Fight.java just calls opponent.opponentAI(…) instead of running all that logic externally.

Fight.java is now significantly leaner, focused only on game setup, the turn loop, player input, and UI rendering.

On the bug fix side, the shield raise failure messages (“Something is in the way”) were moved out of raiseShield() and into the player-only call site. Previously these messages would print whenever the opponent AI tried and failed to raise its shield, which confused players who weren’t doing anything with their shield.

The board display was also reworked to use ANSI cursor column positioning (\033[nG) to force each cell to a fixed terminal column, solving a long-standing alignment issue where emoji with different display widths would push cells out of place.

The instructions screen was rewritten — cleaner language, shorter sentences, and a new map objects section explaining how the house, hospital, and heart work. The “(I) How to play” hint was moved to sit next to the “Choose your character” header so it’s visible before scrolling through the roster.

The README was also reviewed and is current.

The biggest change this session was a major refactor of how the code is organized across files. Fight.java was getting bloated as the game controller, so logic was redistributed to the classes that actually own it.

Board.java gained five new methods: printBoard() (the bordered grid renderer), spawnObjects(), checkObjectInteraction(), restoreHouseIfVacating(), and ejectFromHouseIfExpired(). All of the map object logic now lives alongside the board data it operates on, rather than sitting in the game controller as static helpers.

Opponent.java absorbed moveOpponentToward() and opponentAI() as instance methods. An opponent now knows how to move and take its turn — Fight.java just calls opponent.opponentAI(…) instead of running all that logic externally.

Fight.java is now significantly leaner, focused only on game setup, the turn loop, player input, and UI rendering.

On the bug fix side, the shield raise failure messages (“Something is in the way”) were moved out of raiseShield() and into the player-only call site. Previously these messages would print whenever the opponent AI tried and failed to raise its shield, which confused players who weren’t doing anything with their shield.

The board display was also reworked to use ANSI cursor column positioning (\033[nG) to force each cell to a fixed terminal column, solving a long-standing alignment issue where emoji with different display widths would push cells out of place.

The instructions screen was rewritten — cleaner language, shorter sentences, and a new map objects section explaining how the house, hospital, and heart work. The “(I) How to play” hint was moved to sit next to the “Choose your character” header so it’s visible before scrolling through the roster.

The README was also reviewed and is current.

Replying to @Hamstersarus

0

Followers

Loading…