Monday, March 30
Git Commits
xpro-nextjs-dashboard commits 1
ohnsh/xpro-nextjs-dashboard-
10:45 am — John Sherrell <dev@ohn.sh>
Added search and pagination to the invoices page. Added authentication with next-auth. Final project is complete.
10:45 am — John Sherrell <dev@ohn.sh>
Added search and pagination to the invoices page. Added authentication with next-auth. Final project is complete.
Caution: Crazy
3:33 pm — John Sherrell <dev@ohn.sh>
Fixed weird portrait artifacts in profile photo.
2:59 pm — John Sherrell <dev@ohn.sh>
Need to remove duplicate commit (using sha) when incrementally fetching with `since`. (The commit associated with the timestamp will always be returned.)
2:40 pm — John Sherrell <dev@ohn.sh>
Github loader: Incrementally fetch commits using `since` query parameter.
1:35 pm — John Sherrell <dev@ohn.sh>
Bump dependencies; new Typescript and Lucide.
10:09 am — John Sherrell <dev@ohn.sh>
Latest Videos -> Latest Uploads
10:52 am — John Sherrell <dev@ohn.sh>
RCP26.4: Testing dynamic rendering with noStore()
5:24 pm — John Sherrell <dev@ohn.sh>
New sort order for video tabs prioritizing talking vids, then running vids.
4:01 pm — John Sherrell <dev@ohn.sh>
Now prioritize talking videos for og:image thumbnail. (Running videos come next, then everything else.)
12:56 pm — John Sherrell <dev@ohn.sh>
YouTube loader: rudimentary incremental fetching implemented. If a playlist already has items saved in local JSON, only fetch 10 items at a time until an already-saved item is reached, then stop. Implementation uses an async generator to page through the API. I'm uncertain about what exactly happens to the playlist when I *update* metadata on an already-published video, but I'm quite certain that this incremental fetch implementation won't handle it gracefully. When a fresh sync is needed, simply delete the .days/youtube directory, where the API JSON is cached.
10:18 am — John Sherrell <dev@ohn.sh>
Github loader: important to use `pushed_at` timestamp instead of `updated_at`. The latter is (seemingly) not updated on push.
10:12 am — John Sherrell <dev@ohn.sh>
Github loader: Only fetch commits for repositories updated since last sync. Still fetching *all* commits, which needs to be optimized.
6:01 pm — John Sherrell <dev@ohn.sh>
Bump to 8 most recent videos to maximize space.
5:54 pm — John Sherrell <dev@ohn.sh>
Basic responsive thumbnail grid for <LatestVids> component. Good enough to deploy, but needs plenty of work. Currently displaying six most recent uploads with a maximum of three grid rows. (If only one column, the last three rows will be hidden.)
11:03 pm — John Sherrell <dev@ohn.sh>
Post about recent Github Actions assignment in MIT xPRO. Filtering drafts in <LatestPosts> feed.
8:46 pm — John Sherrell <dev@ohn.sh>
Responsive grid layout for <LatestVideos>. The grid needs to be upgraded to thumbnails before it's ready.
6:41 pm — John Sherrell <dev@ohn.sh>
The default feed now uses <Excerpt> instead of <Post>. <Excerpt> now renders a "View full post..." link, and calculation of fallback cutoff point (in the absence of an explicit `excerpt` frontmatter or `<!-- excerpt -->` delimeter) has been tuned a bit. Now, the first two paragraphs are included by default, with an internal option to cut things short if a top-level <div> is encountered (e.g. code blocks).
6:38 pm — John Sherrell <dev@ohn.sh>
Added rudimentary Latest Videos feed to index. Unlike the rest of the site, the videos are selected by date *uploaded* (published) rather than date recorded. The idea is to surface older videos as I add them.
12:24 am — John Sherrell <dev@ohn.sh>
No redundant title on post pages. The test is done from the <Post> component and involves checking `Astro.routePattern`. Astro is lowercasing the value (`/[...postslug]` instead of `/[...postSlug]`), which seems like a bug. Still the best test, I think.
11:07 pm — John Sherrell <dev@ohn.sh>
De-duplicate effort deriving slugs (2026/03/22) versus keys (2026-03-22).
10:39 pm — John Sherrell <dev@ohn.sh>
Finally giving in and making date slugs fully numeric. It looks especially bad next to the dev server's 4-digit port number, but in practice, it's the most sensible option. Sorting works without conversion to javascript's truly godforsaken date object. Simple string replacement converts between ISO-like dates (2026-03-22) and slugs (2026/03/22). And currently my post slugs are formatted like `2026/03/post-title-slug`. I think I like them that way, but definitely not if the month is an abbreviation.
8:44 pm — John Sherrell <dev@ohn.sh>
Re-organize posts for a reality where their paths directly map to URL slugs. New [...postSlugs].astro for routing those slugs. Simplified sidebar loading in all routes with new `getSidebar()` which imports its own day and tag maps. (Now that the project has grown, a few routes don't need those maps for anything except the sidebar.)
5:32 pm — John Sherrell <dev@ohn.sh>
Added slugify library; wrapping with lib/slugify.ts to define default custom replacements for emoji.
2:49 pm — John Sherrell <dev@ohn.sh>
Minimum viable Excerpt implementation for posts. Not actually rendering <Excerpt> anywhere yet, but it will inevitably become the default when listing days or posts. Inspired by HiDeoo/starlight-blog, which is a bit more sophisticated. <Excerpt> will render the markdown-formatted `excerpt` property from the post frontmatter if available. Otherwise, the rendered post is passed through to <ExcerptWrapper>, which scans the HTML for a special delimeter: `<!-- excerpt -->`. If a match is found, the post is cut off at the delimeter. If not, the default fallback is to cut off the post after the first `</p>`.
2:48 pm — John Sherrell <dev@ohn.sh>
Clean up types a little bit.
10:48 pm — John Sherrell <dev@ohn.sh>
Module 25 complete. Mostly worked on rendering /ui/dashboard, /ui/customers, and /ui/invoices within a layout. (For some reason, per the instructions, the layout is copied to each route instead of being shared.)
12:08 am — John Sherrell <dev@ohn.sh>
Starting Next.js dashboard project for MIT xPRO course. Upgraded everything--next, react, tailwind, etc. Only keeping around .mjs versions of config files. Made a few config changes for Tailwind 4 to work, plus replaced `@tailwind` directives in global.css with `@import "tailwindcss"`.
8:03 pm — John Sherrell <dev@ohn.sh>
Added rudimentary latest posts feed to index. Currently, it links to the post's day because there's no route for individual posts. I'm not sure if it's worth making one.
6:35 pm — John Sherrell <dev@ohn.sh>
Extracting tags from YouTube descriptions now. Still not using them. (If I add YouTube tags to the main tag map, things get messy. Need to create emoji-slug mappings and think through what I'm actually trying to accomplish.)
6:08 pm — John Sherrell <dev@ohn.sh>
March 21 metadata.
6:05 pm — John Sherrell <dev@ohn.sh>
Working on metadata overlay to merge into collections (especially youtube). Probably pausing for now, but probably also should at least parse descriptions for tags inside the youtube loader.
10:37 am — John Sherrell <dev@ohn.sh>
Fix off-by-one bug after refactoring lib/dates.ts. Need to always be explicit about whether a date is a timestamp (okay to implicitly convert to local time) or a "plain date" (which is important to represent the way it's typed out). To help with this, I made a new wrapper, `slugFromDay`, which is only for plain date strings like '2026-03-21'.