stardance has been extended another month! the new deadline is october 31 :)

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

AidenHammy

@AidenHammy

Joined June 8th, 2026

  • 30Devlogs
  • 8Projects
  • 7Ships
  • 53Votes
Open comments for this post

2h 15m 15s logged

Devlog #1: Getting TimeBridge Off the Ground

Spent the weekend building the first version of TimeBridge, a small Chrome extension aimed at making timezone coordination less of a headache. The idea is to detect time references as you type and eventually let you convert them to your contacts’ local times without doing the math yourself.

I started with two core features. A popup contact book that saves names and timezones using chrome.storage.local and a live text parser powered by chrono-node. The popup displays contacts’ local times while the parser detects phrases like “let’s call tomorrow at 3pm” using a debounced content script. I also used the browser’s native Intl.supportedValuesOf("timeZone") API to populate the timezone list instead of maintaining one manually and bundled only the English parser to bring its size down from around 400 KB to 100 KB but getting everything to run turned out to be its own challenge.

Chrome refused to load the extension because the bundled parser file was missing and regenerating it exposed an empty package.json that caused npm to throw an EJSONPARSE error. After fixing the dependencies, rebuilding the bundle with esbuild and correcting the script order in the manifest, the extension finally loaded. I also had to enable file URL access in Chrome before my local test page would work with the content script.

The skeleton is alive and well, the contacts persist, local times update and time expressions are detected as I type. There’s no UI for the parser yet so everything still goes to the console

0
0
45
Ship

This ship finishes off every placeholder app and adds two real interface upgrades.

Calculator does immediate-execution arithmetic with full keyboard support. Mood Lamp applies a real ambient color wash across the whole desktop and not just its own window (fortunately). Fortune Cookie cracks open into an actual paper slip with a fortune and six lucky numbers. The Browser now has a working address bar with back/forward/reload and typed URLs load inline. Searches open in a new tab since search engines block being framed no matter what you do.

Right-click also does something everywhere now including titlebars, taskbar and desktop and also including a new “Always on Top” pin. And the taskbar clock isn’t static anymore! Click it for a small calendar with today marked and leap years are handled correctly without any special-case code.

Current apps → Fully functional:
Settings, Notepad, Terminal, Calculator, Mood Lamp, Browser, Fortune Cookie

Placeholder apps → None remaining!

  • 3 devlogs
  • 8h
  • 12.28x multiplier
  • 94 Stardust
  • WebOS 2
Try project → See source code →
Open comments for this post

1h 35m 39s logged

Devlog: building the browser interface


Every other app in AuriaOS gave me something real and had bugs that behaved normally. The browser gave me two completely different problems, each one hiding behind the last.

Problem one: search engines don’t want to be embedded

With the real browser wired up, the address bar, back/forward/reload/home and an actual iframe, it looked done. Typing a URL worked but typing a search term did not. Every search just sat there, blank. I got to know why that was very soon from the console:

textFraming 'https://html.duckduckgo.com/' violates the following ContentSecurity Policy directive: "frame-ancestors 'self'". The request hasbeen blocked.

DuckDuckGo sends a header that basically says “don’t let anyone put me inside another page” but that’s not just a DuckDuckGo thing though, it’s standard for basically every search engine because a framed search results page is a classic clickjacking setup. No amount of JavaScript on my end changes an HTTP header the other server is sending. Well, this can’t be considered a bug, it was like a wall and every search engine has the same one. So the fix wasn’t really a fix, it was about rethinking the whole situation. I had to stop trying to show search results inside the embedded view and just open them in a real new tab instead where framing rules don’t apply. Direct URLs still load inside the app like before since plenty of ordinary sites don’t block framing, it’s the search engines specifically.

Problem two: it worked but it didn’t feel like it worked

Search now actually functioned since New tab pops open with real results every time. And the very next thing I thought of was “it acts like a separate window opener instead of being part of the browser app” and it was a fair thought. What I really wanted was to show search results inside the iframe which loops straight back to problem one. I didn’t have much choice. I pushed back on that hard. Everything else in AuriaOS does what it claims to do. The terminal runs real commands, the calculator does real math and I didn’t want the browser to be the one app quietly faking it. But I eventually decided to keep the new tab. Added a small toast inside the browser window itself. “Opened search in a new tab” that fades in for about two seconds and back out. Doesn’t change where the search happens it just closes the feedback gap. Something visibly happens inside the app the moment you hit Go instead of the window just sitting there while a tab opens somewhere else on screen

2
0
27
Open comments for this post

3h 49m 36s logged

Devlog: Right-clicks, calendars and… a fortune cookie?!


Fresh update to AuriaOS. Two new interface features, one new app and a bug that crashed the entire desktop before it got fixed. Right-clicking finally does something! Before this, right-clicking almost anything in AuriaOS just opened the browser’s own menu (“Reload / Inspect”) which ruined the illusion of a real little operating system.

Now right-clicking gives you a proper menu where it should:

A window’s title bar -> Minimize, Maximize/Restore, Always on Top, Close

An app in the taskbar -> Restore/Minimize, Close

Empty taskbar space -> Show Desktop, Close All Windows, Settings

Empty desktop space -> Personalize, Open a Terminal, Refresh

A desktop icon -> Open


The genuinely new trick is “Always on Top”. Pin a window and it stays above every other window, no matter what else you click instead of getting buried like normal windows.

The clock finally does something!

The taskbar clock used to just show the time. Now you can click it and get a small calendar for the current month just like on a real computer. The calendar handles the fiddly stuff automatically. It knows how many days are in each month, accounts for February 29 in leap years and always lines up with Sunday as the start of the week. The faded days at the beginning and end fill out the grid so it doesn’t have awkward gaps. And if you leave the calendar open when midnight hits, it updates itself and moves the highlight to the new day without needing to be closed and reopened.

Actually building the Fortune Cookie App

It’s basically what it sounds like. A fortune cookie that you click to crack open. It shrinks and fades as if it’s actually being cracked,then a little paper slip slides into view with a fortune and six “lucky numbers” underneath just like a real fortune cookie.

The bug that broke everything

This was the messy part. It wasn’t really one bug but two bugs back to back both caused by the same basic mistake.

Bug one: the crash. To make the calendar auto-update, the clock code runs every second and checks whether the calendar popup is open. The problem was an ordering mistake. That check ran before the calendar popup had actually been set up.

Because the error happened near the top of the file, everything after it never got initialized including the taskbar and Start Menu click handlers. From the outside, the whole desktop looked dead. Frozen clock, dead Start Menu and an unresponsive taskbar.

Bug two: After fixing the crash, the calendar still wouldn’t open. Turns out I’d written all the code for the popup but forgotten to actually add the popup to the page. Most of the code quietly ignored the missing element but one part wasn’t so forgiving and could throw an error on every click anywhere in the app. Adding the missing element fixed it and I added safety checks around similar code so missing elements can’t cause the same mess again

0
0
34
Open comments for this post

3h 23m 32s logged

Devlog 3: Three Hours of My Life I’m Never Getting Back (And Slack’s Media Renderer Can Thank Me For It)


The false confidence

I thought the bot was done. I really did. The commands worked, the database was syncing, the cron jobs were firing. It was a fully functional space bot. I sat down to do what I thought would be a 15-min final polish before shipping. Three hours later, I was found questioning my reality and whether I should just delete the folder and take up farming. What started as a quick polish turned into a full-blown war against dead community APIs, Slack’s deeply picky Block Kit renderer and the absolute garbage fire that is Node.js DNS resolution on free hosting platforms.

The dead API saga

First, /skl-mars completely died. Not a graceful failure. Not a friendly JSON error. It just silently redirected to a GitHub Pages 404 HTML page. Axios, bless its optimistic little heart, tried to parse that HTML as JSON, choked and took the whole bot down with it. I made the executive decision to ditch that entirely. The rover is probably tired of taking photos anyway. I swapped it out for NASA’s EPIC API, which takes photos of Earth from the DSCOVR satellite. But EPIC had its own trap. If you just ask for the “most recent” photos, it returns a tiny array of about 13 photos from the last active day. The bot kept spamming the exact same image of Earth. I had to rewrite the endpoint to fetch the archive of all available dates, shuffle the entire history of the satellite and pull a random day from the past just to get some variety. Then, the Open Notify API (used for ISS location and crew data) went offline too. Same GitHub 404 redirect. I had to write nested try/catch fallbacks with 5-second timeouts to route requests to wheretheiss.at just to keep the telemetry commands alive. It was a war of attrition against community-run infrastructure.

Slack Block Kit & the APOD nightmare

Getting the APOD (/skl-apod) to actually render in the chat was an absolute nightmare. Originally, the bot just dropped a raw URL into the chat. Slack looked at it and said “Cool link, not displaying it” so I rebuilt the command using Slack’s Block Kit image block. That fixed images. But.. a video? Because of course, if you pass an .mp4 URL into an image block, Slack silently drops the message entirely. I had to write logic to check the media_type: if it was a YouTube link, I parsed the URL and rendered it using Slack’s native video block. If it was a raw .mp4, I had to stream the video file directly into Slack using filesUploadV2 so it would embed and play right in the chat. And to prevent the bot from OOM-crashing the server on large videos, I had to use responseType: "stream" so it chunked the download instead of loading a 50MB video into RAM all at once.

The Nest hosting quirk

Right when I thought I was victorious, APOD and Earth started failing with getaddrinfo ENOTFOUND api.nasa.gov. After staring at my screen wondering if I had forgotten how URLs work, I learned that Node.js 17+ defaults to IPv6 for DNS resolution and the hosting platform (Nest) doesn’t fully support IPv6 routing. The server literally couldn’t find NASA. Adding dns.setDefaultResultOrder('ipv4first') to the top of the service file fixed it instantly. Extremely normal behavior, I love computers.

The actual architecture shift

Amidst all the API firefighting, I also ripped out the hardcoded .env channel routing. Making someone edit a .env file just to move a bot to a new channel is a crime. I moved the scheduled announcements to a SQLite-backed system with /skl-setup and /skl-unset commands so the bot could support multiple servers dynamically without touching environment variables. What started as a simple script turned into a much more reliable bot with backup APIs, saved data, scheduled posts and the ability to handle images and videos directly in Slack. It was hella exhausting, my brain is completely fried but atleast it’s done.

0
0
16
Open comments for this post

2h 12m 45s logged

Devlog: giving AuriaOS two real apps (and finding out neither of them worked)


Calculator and Mood Lamp had been placeholders since day one. A folder icon and a div that said “🧮 Calculator app” and nothing else. A window
opened, technically. Nothing else did. For the second submission I finally built them for real.

Building them

Calculator got a real display and button grid, doing immediate-execution math on purpose: 6 + 3 × 2 = gives 18 not 12 because that’s how an actual physical calculator behaves and a proper order-of-operations parser felt like solving a problem nobody asked for. Divide by zero gives Error like it should. Keyboard input works too but only while
the calculator window is actually focused so it can’t hijack typing elsewhere.

Mood Lamp got more ambition! Instead of a “click a button, see a color” toy, it’s a global ambient tint over the whole desktop not just its own
window. Four presets pulled from the existing accent palette, plus a real color picker and intensity slider for anyone who wants to go off-menu.

Wrote the CSS, wrote the JS, wired both in, called it done. It was not done. The buttons that did nothing.

Time for the First bug! Mood Lamp’s buttons didn’t work. No errors, no visual change, just silence..which is a specific kind of bug since broken JS usually throws. Silence like that means the code never actually ran. That’s exactly what happened. wireCalculator() and wireMoodLamp() were both fully written and correct and never called from anywhere. openWindow() still had the old dispatch list from before either app existed so every button in both apps existed in the DOM with zero listeners attached. Not a typo, just two lines I never wrote.

The command that lied about itself

From the previous reviews, I got to know that typing lightmode on in the terminal printed darkmode turned on. The Dark Mode → Light Mode rename happened everywhere except one spot. The shared toggleBooleanSetting() helper used the internal state key (darkmode, which still has to exist since the actual effect is a literal CSS invert) for the confirmation message too. I split those apart so the message reflects what you actually typed not the plumbing underneath it.

The mood lamp that had no mood

Once the wiring was fixed, buttons visibly responded but the desktop itself looked exactly the same. Sampling the actual rendered pixel before/after at max intensity confirmed it. The shift was small enough to round to nothing. The overlay used mix-blend-mode: soft-light which was picked for subtlety. Except soft-light scales toward zero as the base color approaches black and AuriaOS’s desktop is about as close to black as a color gets (almost). The mode I chose for subtlety was almost mathematically guaranteed to do nothing on this exact theme. I switched it to screen, which always adds light regardless of how dark the base is. Same 30% intensity setting, suddenly an actual visible wash instead of a rounding error.


The actual lesson? None of these three were exotic bugs. A missing function call, a copy mismatch, a blend mode never checked against the theme it’d run on. All three shipped unnoticed because each one failed quietly instead of throwing. Worth remembering “it’s not doing anything” isn’t a shrug, it’s a symptom!

0
0
122
Ship

Started as a standard “first Slack bot” with catfacts, jokes, quotes, the usual starter-project stuff. It was redesigned into something actually worth using. A space-themed bot that tracks the ISS in real time, counts down to the next rocket launch, posts NASA’s daily astronomy photo (with zero effort on your part) and pulls random Mars rover photos on demand.

It also remembers things now. SQLite-backed mission logs per channel and custom callsigns per user and shows up uninvited with scheduled posts instead of only responding when poked.

Built with Node.js + Slack Bolt (Socket Mode, no public URL needed), SQLite for persistence, node-cron for scheduling and free APIs (Open Notify, NASA, Launch Library 2) for the live data. Deployed and running 24/7 on Hack Club Nest.

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

2h 57m 5s logged

Devlog: SlackyssaLiu Went to Space (and I Forgot to Write Any of This Down)


The itch

SlackyssaLiu started as a pretty standard first Slack bot. Slash commands, a few API wrappers, the usual suspects: catfacts, jokes, quotes, echo, ping, some sneeze/wave filler commands for personality. It worked fine. It also looked exactly like every other “my first slackbot” project out there because it basically followed the same recipe everyone does. Integrate a joke API, integrate a weather-adjacent API, call it done.

I wanted to know how to make it stand out so I asked around for ideas. The answer was pretty obvious in hindsight. Stop building the demo everyone builds and build something around an actual theme with actual state instead of a stateless command list wrapped around whatever free API came up first.

I bounced between a few themes.. figure skating (RIP, no usable free API), medieval history (also no API, just Wikipedia scraping, hard pass) and space. Space won because it had exactly what I needed. Solid free APIs with no bureaucracy (Open Notify needs zero auth, NASA’s API just needs a free key) and enough surface area to build something that actually feels alive instead of just answering when poked.


What actually changed

This ended up being a full redesign not a patch job. Rough shape of it (RIP to /skl-achoo, you were doing your best).

Killed the old command set! No more catfact/joke/quote/echo/achoo/wave.
None of it fit the new direction and it was the generic stuff I was trying to get away from in the first place. A moment of silence for the bot that could sneeze but not tell you when a rocket was launching.

New space-themed commands: /skl-iss and /skl-crew (Open Notify, no key needed), /skl-launch (Launch Library 2, with an actual countdown for maximum dramatic tension), /skl-apod and /skl-mars (NASA’s API, APOD + random Curiosity rover photos the rover did not consent to being featured but also cannot complain).

Added actual persistence. SQLite via better-sqlite3. This was the real shift. The old bot had the memory of a goldfish with amnesia. It never remembered anything between requests. Now it tracks mission logs per channel, user callsigns and which launches it’s already announced (so it doesn’t spam the same countdown twice like an overeager intern). Added scheduled behavior. node-cron jobs that post NASA’s picture of the day every morning and ping the channel when a launch is within the hour. This is the part I think actually makes it feel like a running thing instead of a command list. It does stuff without being asked which is more initiative than I show most mornings.

I gave it an actual personality module! pulled every joke/flavor line out of the command handlers and centralized them in personality.js. Went through two tone passes because apparently I couldn’t decide if the bot should sound like a stoic AI from a space movie or like it’s been on Twitter since 2019. It landed somewhere in between and honestly that’s a personality a lot of people have. Having it centralized meant the whole voice-swap was a single-file change instead of hunting through every command like a raccoon going through someone’s trash.

Fixed real bugs from the original file along the way, typos that would’ve crashed the bot. cool, cool, very cool, glad I caught that before it caught me.


Why I forgot to log any of this

Short version, I was moving fast across a lot of files at once. db setup, service wrappers, command rewiring, personality, scheduler and treated it like “just get it working” instead of “document as I go”. I was working on a lot of projects at the same time and this was something I did just after finding about Stardance so I barely remembered to ship it. But I’m doing so now, several weeks late, riding in on a horse made of retroactive commit messages. I barely had any brainpower left for side projects at 1am because of my “awesome” uni.

0
0
120
Open comments for this post

2h 9m 11s logged

Devlog 2


script.js is the new addition so here’s what it’s actually doing! It holds all the material data (steel, concrete, timber, etc. actual specs, pros/cons, use cases) and it builds the registry cards from that data instead of having every card written out individually, it also runs the boot-sequence typing effect when you open a record and fills out the detail page when you click into a material (title, seal, dials, the whole thing) and handles switching between sections! including moving the gauge fill to wherever you’ve navigated


so basically, it’s the part making the site do things instead of just sitting there looking nice. which, to be fair, was kind of the previous situation. also noticed a few other things while going through the files. so update! the nav labels got renamed to something a little moodier. Registry is now Compendium, Application is now Instrumentality. apparently we’re doing terminology now (I hope it does sound better though). The landing page kicker changed too, from the previous plain version to “The Seventeenth Record” which raises the fairly obvious question of where records one through sixteen are. WELL, let me just say.. I don’t know! probably somewhere above my pay grade


there are also two fonts being imported that aren’t actually used anywhere in the CSS yet. they’re just there in the import line, loaded in and ready to contribute absolutely nothing. honestly, good for them anndddd just to be clear, none of the stuff from the last devlog i noticed are fixed yet. We got an absolutely broken mobile responsiveness. This pass was mostly about getting things organized rather than fixing anything. one thing at a time though! we’re not building the interstate

0
0
14
Open comments for this post

2h 32m 35s logged

Devlog 1


Alright, first one of these so let’s keep it honest instead of doing a highlight reel. ARCHIVE-7 is a materials reference site I’m building that’s skinned like a terminal from a sunken Art Deco engineering archive. Steel, concrete, timber, that kind of thing but presented like you salvaged the data from underwater instead of scrolling a normal database. That’s the pitch anyway. Where it actually is right now is a bit messier than the pitch.


The nav is a pressure gauge and I’m still into that idea. Instead of a normal navbar there’s a vertical gauge running down the left edge! A tube with five stops on it, marked in fathoms instead of section names (0, 22, 48, 76, 110). Click a stop, in theory the fill level rises to meet it and the whole thing feels like you’re descending deeper into the archive. In practice, right now, the animation just isn’t firing. It snaps to the new state instead of settling into it so at the moment it’s basically a fancy-looking list that skips the part that made it interesting. That’s next on the list to actually fix not just assume is working because the CSS looks right.


The landing page has a hole in it. This one stings a bit to post but whatever, that’s the point of a devlog. The cover page is supposed to show a facility summary and a featured specimen pulled from the real data. Something that gives you a reason to be on that page instead of just a title. Right now both of those sections are rendering completely empty. The header text up top is fine, the sign-off line at the bottom is fine but there’s a big gap in the middle where actual content should be.


Small thing but noting it. There’s a thin vertical line + rotated readout sitting on the right edge, purely there to balance the gauge visually so the page doesn’t feel like it’s all weighted to one side. Right now it’s sitting a little too close to the scrollbar for my taste. Minor but going on the list.


So that’s the state of it. Visually the parts that ARE rendering look like what I want. The palette, the type, the gauge shape but structurally there’s real stuff not working yet. Next devlog is hopefully “the gauge moves and the cover page isn’t empty” we’ll see!

0
0
62
Ship

a NASA APOD (Astronomy Picture of the Day) viewer, built plain HTML/CSS/JS + Vite because I like typing npm run dev and feeling official. Now, you might be asking, what does it do? pick any date since June 1995 and see the actual picture NASA published that day plus the write-up! You can flip day by day, jump to today, hit random and get flung somewhere in the archive or browse a full month at once instead of clicking next-day forever. There’s an “on this day” strip that pulls the same date across past years too which turned out cooler than I expected when I first sketched it. And a logbook so you can save entries you like, persisted in local storage. No account, no backend, just sitting quietly in your browser! not perfect yet, still stuff I’d like to poke at but it works, atleast it does what it says it does!

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

30m 3s logged

Devlog #4


There’s not much coming to my mind on where to go from here so instead I went in to style.css to fix text truncation. Well.. I accidentally ended up tweaking basically everything. I added new easing functions, cleaned up button styling and fixed a stupid transition typo. While I was at it I gave the media box a custom cursor and added some hover/scale/rotation animations. I also polished the logbook, lightbox and gave the archive cards a little more life! Also fixed a few tiny compatibility and sizing things while I was there. DIdn’t do much but that’s something. Probably my final devlog before shipping

0
0
22
Open comments for this post

6h 31m 12s logged

Devlog #3


Okay so update from the last one where I was basically just doing CSS and hoping for the best. Turns out trusting the process was, in fact, the move because somehow I went from “vague brass and navy colors on a div” to an entire working site. I genuinely didn’t expect to get here especially with college still eating my whole week.


The NASA API stuff is finally hooked up and actually works now not just “works in theory” but actually pulling real pictures for real dates. Prev/next day, jumping to today, random date, all of it fetches properly. There’s a whole archive view now too where you can browse a full month at once instead of clicking one day at a time forever and an “on this day” strip that shows the same date from past years which honestly turned out way cooler than I expected!


Also added a logbook thing so you can save entries you like and they stick around in localStorage. No backend, no login, just quietly sitting in your browser. Feels good having something that persists without having to build a whole account system for a side project. ALso uh, I spent an embarrassing amount of time on tiny details that probably nobody will consciously notice but me.. a little reticle cursor over the image instead of the default pointer, a custom loading animation instead of a plain spinner, a weird little rotated stamp on the corner of each plate that just says “field log” because I thought it was cute. None of it needed to exist BUT all of it exists anyway.


Still caught a genuinely embarrassing amount of bugs going through it though. Had a straight up syntax error sitting in my object literal for who knows how long, had the archive endpoint pointed at a fetch() call instead of an actual url string and had a whole render function that hid the plate right after trying to show it so nothing ever displayed and I could not figure out why for a long time. Felt very smart once I found each one and very stupid for how long it took.


Still following the “learn it from a tutorial not from AI” thing I keep telling myself and it’s actually paying off! I can explain almost every part of this now instead of just going “uh, it works, don’t ask me why” Not fully done yet, still want to poke at a couple things. That’s it for this one. Back to pretending I don’t have an assignment due tomorrow (I actually have 3).


Also, quick note on why this is one giant entry instead of three; most of this stretch was JS work and the CSS barely moved while I was doing it. Didn’t feel like there was a real “here’s a visual update” moment to split off on its own so instead of forcing three thin entries out of what was really one continuous push on the JS side, I just let it be one entry that covers all of it, hope that makes sense!

0
0
16
Open comments for this post

1h 19m 10s logged

Devlog 2 - Tiny Progress is Still Progress


College has been eating up most of my time lately so I haven’t been able to work on Asterism as much as I’d like. Still, I’ve been squeezing in about 5–10 minutes whenever I can. It doesn’t sound like much but I keep telling myself that something is better than nothing. Hopefully that’s true in my case too. Most of the progress has been on the CSS. Nothing groundbreaking yet but it’s taking shape, I think..? It’s still very much a work in progress and honestly… I’m kind of figuring things out as I go. I’m not entirely sure where this project is heading aesthetically but I’m trusting the process. Sometimes you just have to keep building until everything starts clicking into place. That’s pretty much it for this devlog. I wish I had more exciting things to share but college has completely drained me. I’m absolutely exhausted and my brain has officially stopped producing coherent thoughts. Hopefully the next update will have more than just CSS tweaks and maybe even some NASA API magic (hopefully x2)

0
0
9
Open comments for this post
Reposted by @AidenHammy

52m 37s logged

So I added the base for the galerie.I just need to add a slideshow thing which is going to be a little hard because I already have 2 and I need to add the 2 buttons to switch between the images.I am giving my best to squeze in coding time but the graphics themselves take a lot of time.Thanks for reading!!!

2
1
351
Open comments for this post

2h 20m 13s logged

Devlog 1 - Getting something on the page

Renamed the project to Asterism mostly because I didn’t want to keep looking at “apod-site” in my file tree. I spent way longer than I expected just laying out the HTML. I kept going back and forth on whether to build the archive/logbook or wait until I actually need them and ended up just doing all of it upfront so I’m not restructuring divs later while also trying to debug JS. Not sure that was the right call, it means I have a full page of markup and literally none of it does anything YET


The JS side was easy actually. I wanted to just check the NASA API actually returns what I think it returns before touching the real page so I hacked together a quick fetch on a totally separate.

#datepicker/#app that isn’t even in my real HTML. I mean it previously did. And It worked, sort of. Proved the concept but now I have to go rip it out and rewire it to the actual elements. Also just noticed I left a require("jspdf") at the top of the file that I don’t even use. I must’ve grabbed it off some snippet while I was googling something else and forgot to delete it. That’s not going to work anyway since this is Vite/ES modules and not Node. I didn’t get to do styling at all beyond the reset so right now it’s just there. Black text on white, nothing scoped, no theme variables defined just yet

0
0
5
Ship

My personal site, it’s built around a notebook metaphor instead of a standard portfolio layout. Grid paper background, hand-drawn margin annotations and a Marginalia section for things that don’t fit under “projects”. Built with HTML, CSS and a small amount of JavaScript (very small indeed). Full writeup of the process is in the devlog!

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

2h 4m 31s logged

Devlog 4 - probably the last one before this ships


I keep telling myself this is close to done which is exactly what I said the last three times so take that with the appropriate amount of salt. But this time there’s a real reason to believe it. Most of what’s left is polish not decisions anymore.

what actually changed

The site went through more identities than I’d like to admit before landing on the notebook look. I tried a blueprint version, a PCB/circuit-board version, a GitHub-dark version. All of them looked fine. But none of them looked like it suited me, it was a very conflicting feeling. The notebook one stuck because it’s the only one where the metaphor does real work! grid paper, a spiral binding, margin notes with actual arrows pointing at the sentence that matters. It made sense in my head so I left it that way.


Once the theme was settled, most of the work was making it feel less templated and more like something a person actually wrote. Early drafts of the About section kept reusing the same few phrases without me noticing. Every project blurb ending on the same self-deprecating note. Once I caught it, I went back through line by line and cut the repeats until it actually sounded like me instead of me imitating myself. The newest piece is Marginalia. A small section for the stuff that doesn’t fit under “projects” because it’s not a project, it’s just what I’m reading right now; that could mean a design thinking book, German grammar drills, Meditations, my interest about semiconductors. It’s styled as loose index cards taped down at odd angles instead of a clean list on purpose. A tidy bulleted list would’ve looked like a resume section. This is supposed to look like stuff pinned to a corkboard because that’s closer to what it actually is. There’s a colophon now too, tucked at the very bottom. What I built it with, what it’s set in. Small thing but I like that it’s there.

why it’s taking this long

Two honest reasons, no dressing them up. College session started back up and coursework wins every time it competes with a side project for hours in a day. That’s not a complaint, it’s just the actual constraint. I can’t build fast on a hobby site when the thing paying for the degree needs the same brain. And I’ve just been tired. Just the ordinary physical exhaustion of stacking coursework on top of a project I care about where neither one gets the focus it deserves and both end up a little slower for it. Some nights the right call was closing the laptop instead of pushing out a section that would’ve needed redoing anyway.


Neither of those is a great excuse for a slow devlog cadence but they’re the true ones.


what’s actually left

Contact section still isn’t back in. dropped it a while ago, might need to rebuild it now that the rest of the layout has moved on. I do need suggestions and opinions for that. And there’s a couple of real bugs to clean up before this goes anywhere public. And then it’s done or at least done enough to stop calling it a work in progress

0
0
13
Open comments for this post

3h 16m 16s logged

Devlog 3

There are already enough portfolios on the internet. You know the ones with dark background, giant gradient blob, “Hi, I’m X” followed by twelve technology logos and a call-to-action that says “Let’s Connect.” They’re polished but they don’t really tell you anything about the person behind them. And I wanted something different. The idea slowly became a notebook. Not a perfect one, one that’s been carried around for a while. Grid paper, handwritten annotations, sticky notes, typewriter text, little arrows pointing at things that probably didn’t need explaining but got explained anyway


The About section became surprisingly personal. Instead of listing hobbies, I wrote about why I enjoy electronics, why medieval engineering fascinates me and why I keep pulling things apart until I understand how they work. It feels much more honest than anything else. Marginalia is probably my favorite section so far. It’s exactly what the name suggests! the things I’m currently reading, learning or obsessing over. German grammar drills, Meditations, semiconductors.. they’re all snapshots of whatever has my attention at the moment. The little sticky notes scattered around the page make it feel like someone actually uses this notebook instead of simply displaying it. I also hid a small easter egg in the navigation. Every personal website deserves at least one thing that exists purely because it made its creator smile.


This devlog ended up being less about adding new features and more about polishing what was already there. Most of the time went into fixing CSS quirks, adjusting spacing, repositioning elements and making everything feel a little more cohesive. None of the changes were particularly flashy on their own but together they made the site feel much closer to the notebook aesthetic I had in mind. It’s one of those sessions where a dozen tiny tweaks ended up making a much bigger difference than a single new feature ever could

0
0
8
Open comments for this post

2h 20m 22s logged

Devlog 2


Getting the About section written took longer than I expected. Because it’s surprisingly difficult to write about yourself without sounding like you’re trying to impress someone. I rewrote the same paragraphs more times than I’d like to admit, slowly replacing things that sounded good with things that actually felt like me. The Projects section had a different problem. Turns out writing code is easier than writing about the code you’ve already written. Summarizing months of work into a few sentences, choosing screenshots, deciding what to leave out and figuring out what someone would actually find interesting is its own little design challenge. The biggest change, though, ended up being the handwritten notes


At first, the page looked like every other portfolio I’d seen. Project title, description, repository link, repeat. It worked but it didn’t feel like my notebook. The little margin notes, project statuses and honest comments about what went well (or didn’t) gave each project a bit of personality. Ironically, those tiny annotations took longer to write than some of the summaries. Maybe building a portfolio isn’t really about showing everything you’ve made

0
0
6
Loading more…

Followers

Loading…