Changelog
A log of the changes I’ve made to the blog.
2026-07-25
- Changed the typeface for headings and site UI from Aleo to Missive Serif
2026-07-21
- Tweaked background colour of light mode from
#EAEAEAto#EFEFEF - Tweaked the background colour for code from
#F2F2F2to#F9F9F9
2026-07-20
V4.7.2
- Updated the light/dark mode code to use the newer
light-dark()setup
2026-07-19
- Change background colour of light mode from
#F3F1ECto#EAEAEA, an off white colour—I found the original colour to be slightly a bit too “bright”
2026-07-16
- Added a script so that very long, vertical images (like a screenshot from a phone) will have a narrow width so that they don’t take up so much vertical space on desktop
2026-07-15
- I discovered that you can actually put HTML in Bear Blog’s nav section so I updated my light/dark button so it works better
- Changed monospace font to Monaco on Mac
- Tightened up the spacing of the lists on the About page
2026-07-14
- Swapped “Roadmap” for “Colophon” in the footer. My roadmap page is now unpublished—I just feel like it don’t really use it much or follow it, so it’s kind of useless
- Reduced the spacing above my avatar in the homepage from
3.5remto2rem - Restructured the About page to a 2-column layout to better make use of space (took a page out of Chloe’s blog)
2026-07-13
- Fixed an issue where the top bar would flash on every page load only in Safari—it was due to a WebKit quirk with preloaded fonts and a sticky top bar. So my solution was to not preload fonts as it didn’t seem to make much of a difference on load speed anyways
2026-07-11
- Removed
font-displayaltogether in the CSS because I’ve noticed that it sometimes causes the font to not load at all - Changed the font of blockquotes to Rosario in italics and made the vertical line thicker with 20% opacity
- Added previous and next buttons for the photo gallery
2026-07-10
- Changed
font-displaytooptionalto avoid a flash of unstyled text - Updated the northwest arrow rule so that it indicates an external link rather than a link opening in a new tab
- Added code to accommodate posts with multiple tags by adding a middle dot or interpunct
·in between the tags
main > p.tags a:not(:first-child)::before{
content:"·";
margin:0 0.5em;
color:var(--text-color);
opacity:0.5;
}
2026-07-09
- Revamped the About page
- Added a script so I can type
-toc-anywhere in a post and have a collapsible table of contents block automatically generated - Headings in table of contents are now numbered for clearer hierarchy
2026-07-08
- Added font fallback for traditional Chinese with Cantonese-specific characters
- Pushed the footer to the bottom on pages with shorter content
- Moved the tags in the Blog page to the top and styled them so they look more like filtering options
- Replaced hyphens with spaces in post tags
- Made the “open in new tab” arrow a bit less intrusive
- Finally figured out how to adjust the spacing between the page title and the body text in non-post pages:
h1:not(:has(+ p > i > time)){
margin-bottom: 0.8em;
}
2026-07-07
- Fixed an issue where, upon clicking a backlink in the footnote, the footnote superscript in the post body text would be covered by the sticky top bar. Added
sup.footnote-refin the global CSS:
h1, h2, h3, h4, h5, h6,
sup.footnote-ref {
scroll-margin-top: 100px;
}
- Added a bit of animation to the upvote button
- Reduced the indentation of blockquotes for better readability by adding
margin-left: 20pxtoblockquote {…}
2026-07-06
V4.5
- Shrank the text size of the top bar to make it more out of the way
- Refined the styling for the “open in new tab” arrow so that it doesn’t get an underline, is smaller and 70% opaque, therefore slightly less intrusive
2026-07-05
- Fixed an issue where the embedded audio players on my Logic Pro compressor guide wouldn’t obey the manual light/dark toggle
- Fixed some dead/redundant/conflicting code
2026-07-03
- Fixed the issue where in dark mode, the corners of code blocks would have a tiny whitespace peeking out
- Tweaked the indentation of nested lists
- Implemented a script so list spacing is responsive for better readability
- Changed the font for blog lists and the dates in blog lists to be Rosario instead of Aleo and tightened up the spacing
2026-07-02
- V4.3 Light/dark mode toggle: Inspired by Have A Doodhpeda’s post, I’ve implemented a light/dark toggle to the blog.
- Added an editorial style guide to keep things consistent across the blog (old habit from my writing degree!)
2026-07-01
- Updated the text on the homepage, making it more succinct, and moved self-introduction info to the About page
- Tweaked the red accent colour to
#C00E0E - Added a northwest arrow to links that will open in a new tab using the following CSS:
a[target="_blank"]::after {
content: " ↗";
}
2026-06-29
I asked my wife to give her thoughts on the design on my blog and she said that she had a “Godot moment” and found the red accent too harsh (“I can’t read red text 🤣”). So I changed the red—originally
#DD0000—to a more subtle one#D21A1ATweaked the visited link colour from
#B5002Cto#970000Tweaked the highlight colour from
#ff0000to#ff1111and added a slight box shadow for a glow effect
2026-06-27
- Blog list is now grouped by month using this script:
<script src="https://cdn.jsdelivr.net/gh/froodooo/bear-plugins@0.0.44/bear/blog-posts.js"></script>
2026-06-26
V4.2.1:
- Added underline to hyperlinks in post body for better accessibility
2026-06-24
V4.2 Typography overhaul:
- Body text is now a sans-serif typeface, Rosario
- Content that used to be set in sans-serif is now in a serif typeface, Alegreya
2026-06-19
- Added the code below to the CSS to style keyboard shortcuts (e.g., OPT + SHIFT + K)
kbd{
font-family:var(--font-mono);
font-weight:700;
font-size:0.9em;
padding:0.3em 0.7em 0.35em;
border-radius:3px;
white-space:nowrap;
color:#2c2c2c;
background:linear-gradient(#fafafa, #e3e3e3);
border:1px solid #bfbfbf;
box-shadow:
inset 0 2px 0 #ffffff, /* glossy domed top */
0 4px 0 #c4c4c4, /* the tall keycap wall */
0 6px 5px rgba(0,0,0,0.25); /* shadow cast on the page */
}
@media (prefers-color-scheme:dark){
kbd{
color:#f0ede4;
background:linear-gradient(#474747, #2f2f2f);
border-color:#1c1c1c;
box-shadow:
inset 0 2px 0 rgba(255,255,255,0.14),
0 4px 0 #1d1d1d,
0 6px 5px rgba(0,0,0,0.55);
}
}
- Allowed landscape-oriented images to be wider than the paragraph width while limiting the width of vertical images to be the same as paragraph width (like this blog post). This is so that on desktop, landscape-oriented images can take advantage of the width of computer monitors.
How is this achieved?
Full disclosure: I have zero background in HTML/CSS so I got the code from Claude. However, I tested the code to make sure it worked the way I wanted it to in CodeRunner before putting it in the theme of my Bear Blog.
Put this in the global CSS:
:root{ --img-overflow: 150px; } /* this determines how much a wide image exceeds the paragraph width */
main img.wide{
/* never poke out more than the space actually available,
so narrow screens don't get a horizontal scrollbar */
--_overflow: max(0px, min(var(--img-overflow), calc((100vw - 100%) / 2 - 8px)));
width: calc(100% + 2 * var(--_overflow));
max-width: none;
margin-inline: calc(-1 * var(--_overflow)); /* breaks out, stays centered */
}
@media (max-width: 540px){ /* KNOB: below this width, no breakout */
main img.wide{
width: 100%;
margin-inline: 0;
}
}
Then put this script in the footer directive:
<script>
// Widen landscape photos in the post body; leave portraits at column width.
(function () {
// KNOB: only widen images whose width/height ratio is at least this.
// 1 = any landscape image. Raise toward ~1.2 to skip near-square photos.
var MIN_LANDSCAPE_RATIO = 1;
function classify(img) {
if (!img.naturalWidth || !img.naturalHeight) return; // not measurable yet
if (img.naturalWidth / img.naturalHeight >= MIN_LANDSCAPE_RATIO) {
img.classList.add('wide');
}
}
function run() {
// content images only: inside <main>, skipping galleries + opted-out images
var imgs = document.querySelectorAll('main img:not(.no-style):not(.inline)');
imgs.forEach(function (img) {
if (img.closest('.bear-gallery')) return; // skip gallery thumbnails
if (img.complete) classify(img);
else img.addEventListener('load', function () { classify(img); });
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', run);
} else {
run();
}
})();
</script>
2026-06-17
Major blog theme redesign! It’s now on V4. Homepage got its own design from the rest of the site. Will be writing a blog post about it, but here’s a quick overview of the changes:
For the site title and the nav, I changed it from a sidebar to a sticky top bar
Font for body text changed from PT Serif to Gelasio
Reduced the overall scaling of the blog
Each post’s tag has been moved to above the post title, stripped off the hashtag sign and made all caps so it looks like the name of a series or topic
Fine-tuned the spacing for lists where each item contains only a word or two vs lists where each item contain quite a few words (like this one)
2026-02-26
- Added a new page, Coffee Roasters I Want to Try, to keep track of coffee roasters I’ve tried and want to try
- Unpublished the Lifelog page and removed it from the navigation. I found it to be too social media–like and I’m just too lazy to update it frequently
2026-02-10
- Added the Coffee Log page to, well, log all the coffee beans I’ve brewed
2026-02-05
- Added the Lifelog page to capture general life updates and random thoughts
2026-02-02
- My Guestbook page is back up on the navigation! I took it down because the dev ran into an issue with Azure that rendered all his tools unavailable. The issue has recently been resolved.
2026-01-31
- Added a Roadmap page where I keep track of my plans for this blog
2026-01-23
- Added a Today I Learned (TIL) page to document helpful stuff I come across on a daily basis
2026-01-19
- Removed the self-hosted IBM Plex Mono font for code, and replaced it with the default system font
I recently discovered the Menlo typeface through Diarly and fell in love with it. Most monospace typefaces remind me of coding and programming, but Menlo doesn’t. Shortly after, I coincidentally discovered that if you set the font-family to just monospace, the browser on Apple devices will default it to Menlo, so I thought I would just do that instead of using the self-hosted IBM Plex Mono and save some kb in the font loading. I know on non-Apple devices it won’t be Menlo, but I don’t mind that either.
2026-01-06
- Redesigned the Timeline in my About page
- Added new code to fine-tune the spacing of bullet lists so it’s a bit more on mobile and a bit tighter on wide screens:
main ul li,
main ol li{
margin-bottom: calc((var(--post-leading) - 1) * 1em);
}
2026-01-05
- Added some styling for hyperlinked images so they have a subtle effect while a cursor is hovering to indicate it’s clickable:
a:hover{
background-color:var(--main-color);
color:#fff;
}
a:hover:has(img){
background-color:transparent;
color:inherit;
}
a img{
display:inline-block;
cursor:pointer;
transition:transform 0.18s ease;
}
a:hover img{
transform:translateY(-2px);
}
2026-01-04
2025-12-30
- Increased the spacing of each item in the blog list
2025-12-26
- Reduced the size of the site header (i.e., “James Zhan in real life.”)
- Removed the line above footer—I thought it looked cleaner without
2025-12-22
- Updated the toast button
2025-12-21
- Updated the short bio on the homepage
- Reduced
font-weightofh1from700to400 - Cleaned up and consolidated the CSS
- Tweak the spacing for paragraphs and headings
- Removed comments section for all posts
- Tweaked the typography of the footnotes by adding the below CSS code
.footnotes {
font-size: 0.8em;
}
.footnotes p {
margin: 0;
}
.footnotes li {
margin-bottom: 0.3em;
}
2025-12-19
- Changed the typeface of body text from Source Serif 4 to PT Sans. I thought Source Serif 4 was just slightly too “dated” or traditional and slightly too round than I preferred
- Reduced the table of contents’ background colour opacity from 8% to 5% to increase colour contrast
- Reduced H1 text size slightly
- Reduced max width of the blog from 720px to 680px to reduce line length for better readability
- Cleaned up some redundancy in the CSS code with the help of ChatGPT (I have zero background experience in programming; however, I do try my best to learn/understand the codes and test them to verify that they are sound before use them on this blog)
- Updated the CSS so that inline-TOCs won’t be affected by the typographic styling rules for dedicated TOCs:
/* Same-page jump links like <a href=“#section”> */
main a[href^=“#”]:not([href=“#”]):not(.inline-toc a) {
border-bottom-width: **0px**; /* thicker underline just for jump links */
font-size: calc(var(—font-scale) * **0.8**);
font-weight: **500**;
}
.inline-toc a[href^=“#”] {
font-size: inherit;
font-weight: inherit;
}
2025-11-30
- Changed the toast (upvote) button from the default upward arrows to ♡ when it’s not upvoted, and ❤️ after being upvoted
- Made “Hi, I’m James” stand out more in the homepage
2025-11-16
- Added a Discover page for all the pages that aren’t blog posts
2025-11-12
- Fixed an issue where the message field on my guestbook and the email signup text field on my Now page had a white background in dark mode so the text input (light grey in colour) was hard to see (thanks for pointing it out, Sophia!)
2025-11-10
- Updated the design for the email signup input box and button
- Merged the CSS for the email signup and guestbook
2025-11-08
- Changed text colour from #171717 to #000000 for better contrast
- Put “100% written by James, not AI” as a line on its own between the maple leaf and the contact line in the footer
2025-11-07
- Updated the font for code blocks to IBM Plex Mono
- The link to each of the past versions of the Now page has /now/ in the path
- Added this changelog page (no idea why, but I’m doing it lmao)
- Increased paragraph spacing
- Increased spacing before and after headings that aren’t H1
2025-11-06
- Cloned my old blog here and set up URL forwarding with pathing