Compare commits

11 Commits

Author SHA1 Message Date
0509ce9d04 remove dup blog title
Some checks failed
/ Deploy website to server (push) Failing after 11s
2025-10-09 02:14:44 +01:00
3c1a33561e new poast
Some checks failed
/ Deploy website to server (push) Failing after 14s
2025-10-09 02:12:25 +01:00
9243522261 update latest post title and pub date
Some checks failed
/ Deploy website to server (push) Failing after 16s
2025-10-02 01:54:41 +01:00
86919cd64d gitpod to ona
Some checks failed
/ Deploy website to server (push) Failing after 1m59s
2025-10-02 01:49:31 +01:00
217f65b090 new poast 2025-10-02 01:48:51 +01:00
897eb3b07a update version no
Some checks failed
/ Deploy website to server (push) Failing after 1m10s
2025-08-25 02:25:16 +01:00
40b898d544 new poast
Some checks failed
/ Deploy website to server (push) Has been cancelled
2025-08-25 02:23:52 +01:00
f696554fee Merge pull request 'Add book read section to my website' (#1) from book-reads into main
Some checks failed
/ Deploy website to server (push) Failing after 15s
Reviewed-on: #1
2025-08-06 01:21:47 +01:00
85f91aed49 fix book read layout header overlap on mobile 2025-08-06 01:18:08 +01:00
2936ab3384 add notes and web pages for them 2025-08-06 01:15:18 +01:00
5dc7db36f8 initial book read page layout 2025-08-04 00:43:27 +01:00
16 changed files with 377 additions and 9 deletions

View File

@@ -6,5 +6,6 @@ import Link from "./Link.astro";
<nav class="flex flex-row items-center space-x-4">
<p class="font-bold text-lg">kennethnym</p>
<Link href="/">home</Link>
<Link href="/read">books</Link>
</nav>
</header>

View File

@@ -0,0 +1,25 @@
---
title: amor fati
description: love of fate
pubDate: Aug 25 2025
---
I am slowing coming to terms that I have little to no control of what will.
The past few months were nothing short of surprises, good or bad. Through various twists and turns, fate took me to where I am now: living in a bustling city in a cozy flat, while having a fulfilling job in an environment where I can thrive and grow. Look back at the windy path behind me: puddles of tears I shed, stench of sweats that ran down from me, trails of blood from all the injuries that I endured. It is true: the only way out was through, and Fate was my navigator.
At times, I hated them. I could not understand why they would take me through such a strenuous path. Every moment of disappointments, exhaustions and heartbreaks felt like a dead end, and it would make me question whether Fate was sabotaging me. Fate is a patient one, however. Despite my doubts, they remained undeterred, and fought through all the troubles together.
Eventually, we saw light. The light came from a peaceful sanctuary where fellow travellers rest and heal before they move on. Before we could enter, Fate said:
"Before we could enter, you must give up something that is dear to you. What you give up changes the path that the Sanctuary leads you. I get to decide what it is, but you can trus that I will make the best decision for you."
Before I could open my mouth, Fate did it. They put their hands straight through my chest, and ripped away my heart. They placed it on the alter before the Sanctuary. The gates slowly widened as my heart evaporated into thin air.
Now, Fate and I are in the Sanctuary. I am healing from the missing heart that was forcefully ripped away and from the damages I took from the journey to here. I finally get to settle down and rest.
"We are slightly closer to the top of the mountain now." Fate told me, "enjoy your rest - you deserved it."
"Where are we going next?" I asked, to which they replied, "to your destination."
Fate is mysterious. Fate is unforgiving. Fate is also loyal, and only Fate knows the way. Tell Fate where you want to go, fight by them, and Fate will bring you there.

View File

@@ -0,0 +1,13 @@
---
title: fear of falling behind
description: The looming pressure of keeping up with everything
pubDate: Oct 1 2025
---
I am lucky enough to be in an [environment](https://kennethnym.com/blog/your-environment-dictates-everything/) where I am surrounded by bright-minded, high-achieving people that are doing incredible work every day, and they are nothing short of inspiring. Safe to say - I am the dumbest person in the room. On one hand, I get to learn from them every day, driving myself to get better. On the other, comparison inevitably arises within myself, and it has been slowly getting onto me recently: will I ever be good enough?
There is always a looming pressure within me to work hard to prove myself to people; to prove that I belong in the room; to prove that I am equally capable of brilliance. I always tell myself: if I ever slack off, I will fall behind, and I will be vacated from the room of smarts.
Truthfully, no matter how hard I work, it will never feel enough. In the same vein that [validations](https://kennethnym.com/blog/the-pathological-desire-for-validation/) numb my insecurity and my wounds, working numbs the fear (which stems from my insecurity.) Neither makes the source of the problems go away. The answer to this is obvious: one should work not out of insecurity, but for the love of the game; for self-improvement; for themselves and **themselves only**.
The problem now lies within addressing insecurities and wounds within each of us. For many, including myself, this is a life-long journey of self discovery: processing past events, learning from failures, powering through traumas, and sitting with discomforts. Regardless of what one does, always remember: symptom relieves are never the solution.

View File

@@ -0,0 +1,54 @@
---
title: Kenneth v24.0 released today
description: Release note for Kenneth v24.0
pubDate: Oct 8 2025
---
I am happy to announce that I have officially released v24.0 of myself today. Kenneth v24 is the biggest release ever, containing heaps of improvements and new features. This blog post serves as a release note of what has changed since v23. For the impatient, here are several notable breaking changes:
- New job @ [Ona](https://ona.com) working on coding agents
- Migrated home location to /uk/london
- Drastically improved appearance
- Many important (heartbreaking) life lessons learned
- Kenneth is about 20% more self-aware
- Met many friends from x dot com
Please read on for more technical details.
---
Enough tech gibberish. I would like to use this blog post as a reflection of the past year since my last birthday.
## Software Engineer @ Ona
Last birthday, I made a wish that I would get another job and move to London. Little did I know that I smashed that wish.
Ever since I was a teenager, I have always wanted to work at a startup. The idea that I get full autonomy over my work and that I get to work on something that I deeply care about is what motivates me to get up to work every day. Since then, I had applied to numerous positions at various companies of varying sizes, but to no avail.
Everything changed in June. I went to a pub event in London hosted by the nice folks at (Scaling Devtools)[https://scalingdevtools.com/], expecting that I would get to meet like-minded people, chat about tech, and exchange details. Suddenly, 2 people at Ona (known as Gitpod back then) showed up, and my mind *lit up*. I have known Gitpod for a long time, and to be able to meet the people behind it in a pub was mind-blowing. "How on earth did Gitpod, out of all companies, manage to find us here??" I thought to myself. We began introducing ourselves, and I got to talk about [tesseract](https://github.com/kennethnym/tesseract), a CDE that I built for my own use. My enthusiasm touched them, and they decided to give me a chance. The rest is history.
This, for me, has been the biggest turning point of my career. Being able to work alongside like-minded and smart people on a product that I am passionate about is something that I deeply cherish. I am and will forever be grateful for Ona for having me on the team, and I am honored to be on the team.
## Important life lessons
I won't go into details here, but many, many life events have happened since my last birthday. I am processing and healing through them, and I have also learned several important lessons. The biggest of them all is that one should take action on addressing their insecurities and be gentle with them at the same time.
I am a deeply insecure person, and my insecurities show up in all kinds of places. With people, they show up as my anxiety and my constant chase for validation. This has ruined friendships that I very very very very highly valued, which further reinforces my core beliefs, forming a vicious cycle. With work, they put unnecessary stress on myself, leading me to think that I am not good enough or that I am not working enough.
I have since started therapy, and the biggest progress I have made is the fact that this blog post exists! It has made me a lot more self-reflective and identity thinking patterns, which helps me process traumas and events (in ways that I did not expect when I signed up for it initially.)
Even though they are painful, I am still glad that they happened, because they have fundamentally changed me as a person. I am more outgoing, more compassionate, and more mature. They are memories that I will forever cherish.
## Maybe friends are oomfs we met on x dot com
I managed to meet many oomfs on x dot com and somehow managed to convince one of them to be my neighbor. Every meet up is nothing short of awesomeness. Unfortunately, most of them are not based around London, so I won't be able to see them again any time soon. If you are reading this and you are one of them, I will come see you again!
## The one constant birthday wish
Yes... the Achilles heel. We all know what it is. This year is no different. This is a part of life where I genuinely feel stuck and helpless. Being single has its perks, but I also long for the someone. The person with whom I can be vulnerable. The person with whom I can experience life until the end of the universe. I have made so much progress in other parts of life, but when it comes to this, I am absolutely clueless. I will build literal rockets that take me to the Moon before I figure this out.
Oh to be loved.
## Plans for v25
Aside from the obvious answer, my big plan is to release the *very secret thing* that I have been building. I want to refrain myself from talking about it, because then it will demotivate me from actually finishing it. I also wish for the friends I have made along the way to stay with me.

View File

@@ -14,4 +14,13 @@ const blog = defineCollection({
}),
});
export const collections = { blog };
const read = defineCollection({
type: "content",
schema: z.object({
title: z.string(),
author: z.string(),
goodReadLink: z.string().optional(),
}),
});
export const collections = { blog, read };

View File

@@ -0,0 +1,6 @@
---
title: Being You
author: Anil Seth
---
I am still organizing my notes for this book.

View File

@@ -0,0 +1,34 @@
---
title: The Creative Act
author: Rick Rubin
goodReadLink: https://www.goodreads.com/book/show/60965426-the-creative-act
---
## Everyone is a creator
- To live as an artist is a way of being in the world
## Tuning in
- We are all participating in a larger creative act we are not conducting. We are being conducted. The artist is on a cosmic timetable, just like all of nature.
- In this great unfolding, ideas and thoughts, themes and songs and other works of art exist in the aether and ripen on schedule, ready to find expression in the physical world.
As artists, it is our job to draw down this information, transmute it, and share it.
- We are all antennae for creative thought.
- To pick up on signals, don't look for it, or try to predict and analyze our way into it. Instead, create an open space that allows it. A space so free of the normal overpacked condition of our minds that it functions as a vacuum.
- Practicing a way of being that allows you to see the world through uncorrupted, innocent eyes can free you to act in concert with the universe's timetable.
## The source of creativity
- The Source is out there. A wisdom surrounding us, an inexhaustible offering that is always available.
- Art is a circulation of energetic ideas. What makes them appear new is that they are combining differently each time they come back.
## Awareness
- The universe is only as large as our perception of it. When we cultivate our awareness, we are expanding the universe.
## The Vessal and the Filter
- The vessel holds the sum of our thoughts, feelings, dreams, and experiences in the world.
- Information is filtered uniquely for each person before entering the vessel.
- Artists seek to restore childlike perceptions, a more innocent state of wonder and appreciation untethered to utility or survival.
- One can think of the creative act as taking the sum of our vessel's contents as potential material, selecting for elements that seem useful or significant in the moment, and re-representing them.

View File

@@ -0,0 +1,7 @@
---
title: User Friendly
author: Cliff Kuang, Robert Fabricant
goodReadLink: https://www.goodreads.com/book/show/41940285-user-friendly
---
I will start making notes here when I start reading this book.

View File

@@ -0,0 +1,7 @@
---
title: Zero to One
author: Peter Thiel, Blake Masters
goodReadLink: https://www.goodreads.com/book/show/18050143-zero-to-one
---
I will start making notes here when I start reading this book.

View File

@@ -35,7 +35,9 @@ const {
<Header />
<main class="py-10">
<article>
<div class="prose prose-lg dark:prose-invert">
<div
class="prose prose-lg dark:prose-invert prose-headings:text-ctp-text prose-headings:font-medium"
>
<div>
<div class="opacity-60">
<FormattedDate date={pubDate} />

View File

@@ -0,0 +1,58 @@
---
import type { CollectionEntry } from "astro:content";
import BaseHead from "../components/BaseHead.astro";
type Props = CollectionEntry<"read">["data"];
const { title, author, goodReadLink } = Astro.props;
---
<!doctype html>
<html lang="en">
<head>
<BaseHead
title={`Kenneth's Read - ${title}`}
description={`Notes I made for the book ${title}`}
/>
</head>
<body
class="w-full reads -z-2 bg-stone-200 dark:bg-stone-900 flex justify-center dark:text-stone-300 pt-20 md:py-40"
>
<header
class="fixed scroll-to-blur w-full -z-1 top-0 left-0 right-0 flex justify-center"
>
<div
class="w-full max-w-[calc(65ch+var(--spacing)*24)] px-8 md:px-12 py-4 md:py-12 opacity-80"
>
<h1 class="font-bold text-sm">Kenneth's Read</h1>
<h2 class="text-sm">Quotes and notes from my readings.</h2>
</div>
</header>
<main
class="relative w-full max-w-[calc(65ch+var(--spacing)*24)] px-8 md:px-12 py-10 rounded-t-2xl md:rounded-2xl shadow-lg border border-stone-300 dark:border-stone-600 bg-stone-100 dark:bg-stone-800 min-h-[calc(100vh-var(--spacing)*28)]"
>
<article>
<div class="flex justify-between items-center w-full mb-10">
<header class="flex flex-col">
<h1 class="font-bold">{title}</h1>
<h2 class="font-medium">{author}</h2>
</header>
<a href={goodReadLink} class="underline">GoodRead</a>
</div>
<div
class="prose dark:prose-invert prose-headings:font-medium prose-headings:tracking-tight prose-h2:mb-0.5 dark:prose-headings:text-stone-300 dark:text-stone-300 dark:marker:text-stone-300 prose-ul:list-none prose-ul:p-0 prose-li:p-0 prose-li:before:content-['•'] prose-li:relative prose-li:before:absolute prose-li:before:left-0 prose-li:before:-translate-x-4"
>
<slot />
</div>
</article>
<div
class="absolute left-6 top-0 -translate-y-1/2 transition-all rounded-lg bg-stone-100 dark:bg-stone-800 border border-stone-300 dark:border-stone-700 shadow-lg h-min"
>
<a
class="block px-2 py-0.5 text-sm opacity-80 transition-all"
href="/read">&lt;- All books</a
>
</div>
</main>
</body>
</html>

View File

@@ -1,15 +1,15 @@
---
import { type CollectionEntry, getCollection } from 'astro:content';
import BlogPost from '../../layouts/BlogPost.astro';
import { type CollectionEntry, getCollection } from "astro:content";
import BlogPost from "../../layouts/BlogPost.astro";
export async function getStaticPaths() {
const posts = await getCollection('blog');
const posts = await getCollection("blog");
return posts.map((post) => ({
params: { slug: post.slug },
props: post,
}));
}
type Props = CollectionEntry<'blog'>;
type Props = CollectionEntry<"blog">;
const post = Astro.props;
const { Content } = await post.render();

View File

@@ -25,7 +25,11 @@ const posts = (await getBlogs()).sort(
<p class="font-bold text-2xl">kennethnym</p>
</header>
<main class="py-8">
<p>dumping ground for my thoughts. all opinions are my own.</p>
<p>
software engineer @ <Link href="https://ona.com">ona</Link>. all
opinions are my own.
</p>
<p>check out <Link href="/read">the books I am reading!</Link></p>
<h1 class="font-bold mt-8 mb-2 text-lg visited">current projects:</h1>
<ul class="not-prose space-y-4 md:space-y-2">
<li>
@@ -66,11 +70,16 @@ const posts = (await getBlogs()).sort(
<main
class="py-8 px-4 max-w-4xl flex flex-col items-center space-y-0 leading-tight"
>
<header class="font-bold text-center">KENNETHNYM v23.5</header>
<header class="font-bold text-center">KENNETHNYM v24.0</header>
<p class="leading-none">&nbsp;</p>
<p class="text-center">software engineer. unpaid hhkb salesman.</p>
<p class="text-center">
software engineer @ <Link href="https://ona.com">Ona</Link>. unpaid
hhkb salesman.
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<Link href="/read" class="w-full">books i am reading</Link>
<p>&nbsp;</p>
<ul
aria-label="recent blog posts"
class="w-full space-y-2 sm:space-y-0"

94
src/pages/read.astro Normal file
View File

@@ -0,0 +1,94 @@
---
import { getCollection } from "astro:content";
import BaseHead from "../components/BaseHead.astro";
const nowReading = {
title: "The Creative Act",
slug: "the-creative-act",
};
const quote = {
content:
"Practicing a way of being that allows you to see the world through uncorrupted, innocent eyes can free you to act in concert with the universe's timetable.",
bookTitle: "The Creative Act",
};
const books = (await getCollection("read")).filter(
(book) => book.slug !== nowReading.slug,
);
---
<!doctype html>
<html
lang="en"
class="bg-stone-200 dark:bg-stone-900 text-stone-700 dark:text-stone-400"
>
<head>
<BaseHead
title="Kenneth's Reads"
description="Quotes and notes from my readings."
/>
</head>
<body class="reads px-8">
<main class="mt-8 mb-20 md:mt-0 max-w-4xl grid grid-cols-11">
<header class="col-span-11 grid grid-cols-11">
<h1
class="col-span-10 md:col-span-3 md:justify-self-end text-lg font-bold mt-8"
>
<a href="/" class="hover:underline">Kenneth</a>&#39;s Reads
</h1>
<p
class="col-span-10 md:col-span-8 text-lg font-medium mb-10 md:mb-20 md:ml-12 md:mt-8"
>
Quotes and notes from my readings.
</p>
</header>
<div class="md:justify-self-end col-span-10 md:col-span-3">
<div class="flex items-center opacity-70 mb-2 md:mb-20">
<div
class="w-3 h-3 bg-green-500 border-green-200 dark:bg-green-500 border-2 dark:border-green-300 rounded-full animate-pulse mr-2"
>
</div>
<h2 class="tracking-tight">Now Reading</h2>
</div>
</div>
<div class="col-span-10 md:col-span-8 md:ml-12 mb-16 md:mb-20">
<a class="font-medium underline" href={`/read/${nowReading.slug}`}
>{nowReading.title}</a
>
</div>
<div
class="md:justify-self-end col-span-10 md:col-span-3 flex flex-col md:items-end opacity-70"
>
<p class="text-6xl leading-none font-black select-none">“</p>
<h2 class="leading-none -translate-y-8 tracking-tight">
{quote.bookTitle}
</h2>
</div>
<p
class="col-span-10 md:col-span-8 max-w-prose md:ml-12 text-2xl md:text-4xl tracking-tight mb-20"
>
{quote.content}
</p>
<h2
class="col-span-10 md:col-span-3 tracking-tight md:justify-self-end mb-4"
>
All Books
</h2>
<ul class="col-span-10 md:col-span-8 md:ml-12 space-y-2">
{
books.map((book) => (
<li>
<a class="underline" href={`/read/${book.slug}`}>
{book.data.title}
</a>
</li>
))
}
</ul>
</main>
</body>
</html>

View File

@@ -0,0 +1,20 @@
---
import { type CollectionEntry, getCollection } from "astro:content";
import BookRead from "../../layouts/BookRead.astro";
export async function getStaticPaths() {
const posts = await getCollection("read");
return posts.map((post) => ({
params: { slug: post.slug },
props: post,
}));
}
type Props = CollectionEntry<"read">;
const post = Astro.props;
const { Content } = await post.render();
---
<BookRead {...post.data}>
<Content />
</BookRead>

View File

@@ -1,5 +1,6 @@
@import "tailwindcss";
@import "@catppuccin/tailwindcss/mocha.css";
@import url("https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap");
@plugin "@tailwindcss/typography";
@@ -84,6 +85,34 @@ body.blog {
font-family: "Source Serif 4", "Georgia", serif;
}
body.reads * {
font-family: "Inter", sans-serif;
}
.nf {
font-family: "NerdFont";
}
.scroll-to-blur {
animation-name: scroll-to-blur;
animation-duration: 1ms; /* Firefox requires this to apply the animation */
animation-timeline: scroll(block nearest);
}
@keyframes scroll-to-blur {
0% {
filter: blur(0px);
}
20% {
filter: blur(5px);
transform: scale(0.99);
opacity: 0%;
}
100% {
filter: blur(5px);
transform: scale(0.99);
opacity: 0%;
}
}