John
@sheek.org
Most online communities are just rented space.
I'm building something different: a real home for your people, on your server. Honest, simple, and yours forever. No landlords allowed.
I'm building something different: a real home for your people, on your server. Honest, simple, and yours forever. No landlords allowed.
Took a short break because life is too short 😛
Back to work 🍿
I fleshed out app settings a bit more. I added default values, you can now cancel changes, reset, and if you save a change, it's saved directly to the db. Much better 😙
#javascript #dev #webdev #buildinpublic #UX #community
Back to work 🍿
I fleshed out app settings a bit more. I added default values, you can now cancel changes, reset, and if you save a change, it's saved directly to the db. Much better 😙
#javascript #dev #webdev #buildinpublic #UX #community
November 6, 2025 at 3:41 PM
Took a short break because life is too short 😛
Back to work 🍿
I fleshed out app settings a bit more. I added default values, you can now cancel changes, reset, and if you save a change, it's saved directly to the db. Much better 😙
#javascript #dev #webdev #buildinpublic #UX #community
Back to work 🍿
I fleshed out app settings a bit more. I added default values, you can now cancel changes, reset, and if you save a change, it's saved directly to the db. Much better 😙
#javascript #dev #webdev #buildinpublic #UX #community
This took a surprising amount of time to get right, but I added app settings ⚙️
The idea is simple. You do the vast majority of config in an admin interface.
#javascript #dev #buildinpublic #webdev #UI #admin
The idea is simple. You do the vast majority of config in an admin interface.
#javascript #dev #buildinpublic #webdev #UI #admin
October 6, 2025 at 6:56 PM
This took a surprising amount of time to get right, but I added app settings ⚙️
The idea is simple. You do the vast majority of config in an admin interface.
#javascript #dev #buildinpublic #webdev #UI #admin
The idea is simple. You do the vast majority of config in an admin interface.
#javascript #dev #buildinpublic #webdev #UI #admin
More fun with on the fly image processing ✨
Doing it programmatically means there's a "general" max width for display images (based on user's screen dimensions * DPR). This avoids useless bandwidth
Plus, there's UI elements that have known dimensions
#dev #buildinpublic #javascript #performance
Doing it programmatically means there's a "general" max width for display images (based on user's screen dimensions * DPR). This avoids useless bandwidth
Plus, there's UI elements that have known dimensions
#dev #buildinpublic #javascript #performance
October 2, 2025 at 10:50 PM
More fun with on the fly image processing ✨
Doing it programmatically means there's a "general" max width for display images (based on user's screen dimensions * DPR). This avoids useless bandwidth
Plus, there's UI elements that have known dimensions
#dev #buildinpublic #javascript #performance
Doing it programmatically means there's a "general" max width for display images (based on user's screen dimensions * DPR). This avoids useless bandwidth
Plus, there's UI elements that have known dimensions
#dev #buildinpublic #javascript #performance
Did some work on images 📸
You're probably seen this pattern before. Resize and transform images on the fly with query params
Watch a 700KB image shrink to 20KB when we pass the right params we need (for its place in the UI) to the image server
#javascript #dev #buildinpublic #performance
You're probably seen this pattern before. Resize and transform images on the fly with query params
Watch a 700KB image shrink to 20KB when we pass the right params we need (for its place in the UI) to the image server
#javascript #dev #buildinpublic #performance
October 2, 2025 at 9:10 PM
Did some work on images 📸
You're probably seen this pattern before. Resize and transform images on the fly with query params
Watch a 700KB image shrink to 20KB when we pass the right params we need (for its place in the UI) to the image server
#javascript #dev #buildinpublic #performance
You're probably seen this pattern before. Resize and transform images on the fly with query params
Watch a 700KB image shrink to 20KB when we pass the right params we need (for its place in the UI) to the image server
#javascript #dev #buildinpublic #performance
Worked on a first pass for the #chat page 👷
Wired up some db collections and some UI
It was much easier to get into because the design patterns from the forum page translate well here. I've always been a fan of emerging patterns in place of extensive planning
#javascript #dev #buildinpublic #ui
Wired up some db collections and some UI
It was much easier to get into because the design patterns from the forum page translate well here. I've always been a fan of emerging patterns in place of extensive planning
#javascript #dev #buildinpublic #ui
October 2, 2025 at 6:28 PM
Worked on a first pass for the #chat page 👷
Wired up some db collections and some UI
It was much easier to get into because the design patterns from the forum page translate well here. I've always been a fan of emerging patterns in place of extensive planning
#javascript #dev #buildinpublic #ui
Wired up some db collections and some UI
It was much easier to get into because the design patterns from the forum page translate well here. I've always been a fan of emerging patterns in place of extensive planning
#javascript #dev #buildinpublic #ui
I'm going to stop the first (rough) forum thread list work here
I feel like I got a lot of the ideas down. More importantly, the shell is there to continue when I get back to it.
I'm moving on to chat next
#dev #ui #javascript #forum #buildinpublic #webdev
I feel like I got a lot of the ideas down. More importantly, the shell is there to continue when I get back to it.
I'm moving on to chat next
#dev #ui #javascript #forum #buildinpublic #webdev
October 2, 2025 at 12:18 PM
I'm going to stop the first (rough) forum thread list work here
I feel like I got a lot of the ideas down. More importantly, the shell is there to continue when I get back to it.
I'm moving on to chat next
#dev #ui #javascript #forum #buildinpublic #webdev
I feel like I got a lot of the ideas down. More importantly, the shell is there to continue when I get back to it.
I'm moving on to chat next
#dev #ui #javascript #forum #buildinpublic #webdev
Spent some time thinking about the thread list
What info is actually useful once you do all the filtering?
I mostly care about three things
The title
When it was last active (relative to my time)
and how many people replied to it
the rest is... noise
#forum #UX #dev #javascript #buildinpublic
What info is actually useful once you do all the filtering?
I mostly care about three things
The title
When it was last active (relative to my time)
and how many people replied to it
the rest is... noise
#forum #UX #dev #javascript #buildinpublic
October 1, 2025 at 8:46 PM
Spent some time thinking about the thread list
What info is actually useful once you do all the filtering?
I mostly care about three things
The title
When it was last active (relative to my time)
and how many people replied to it
the rest is... noise
#forum #UX #dev #javascript #buildinpublic
What info is actually useful once you do all the filtering?
I mostly care about three things
The title
When it was last active (relative to my time)
and how many people replied to it
the rest is... noise
#forum #UX #dev #javascript #buildinpublic
"The UI as the URL editor" is a nice mental model 👷
You have all kinds of inputs to add let the user control the URL, then you show a single list that incorporates that URL
The URL is shareable and the list is live because you sub with the same filters
#javascript #UI #buildinpublic #dev #forum
You have all kinds of inputs to add let the user control the URL, then you show a single list that incorporates that URL
The URL is shareable and the list is live because you sub with the same filters
#javascript #UI #buildinpublic #dev #forum
October 1, 2025 at 11:30 AM
"The UI as the URL editor" is a nice mental model 👷
You have all kinds of inputs to add let the user control the URL, then you show a single list that incorporates that URL
The URL is shareable and the list is live because you sub with the same filters
#javascript #UI #buildinpublic #dev #forum
You have all kinds of inputs to add let the user control the URL, then you show a single list that incorporates that URL
The URL is shareable and the list is live because you sub with the same filters
#javascript #UI #buildinpublic #dev #forum
Made some more progress on the forum drill-down 🎨
There's still a lot of stuff to iron out, but I'm really liking how everything is locked to the URL.
#community #forum #dev #javascript #buildinpublic #webdev #UI
There's still a lot of stuff to iron out, but I'm really liking how everything is locked to the URL.
#community #forum #dev #javascript #buildinpublic #webdev #UI
October 1, 2025 at 9:14 AM
Made some more progress on the forum drill-down 🎨
There's still a lot of stuff to iron out, but I'm really liking how everything is locked to the URL.
#community #forum #dev #javascript #buildinpublic #webdev #UI
There's still a lot of stuff to iron out, but I'm really liking how everything is locked to the URL.
#community #forum #dev #javascript #buildinpublic #webdev #UI
Worked on UI layouts for the different types of content 🖌️
It's mostly drill-down because I think this is the most efficient way to explore content.
#buildinpublic #community #javascript #webdev #UI
It's mostly drill-down because I think this is the most efficient way to explore content.
#buildinpublic #community #javascript #webdev #UI
September 30, 2025 at 7:07 PM
Worked on UI layouts for the different types of content 🖌️
It's mostly drill-down because I think this is the most efficient way to explore content.
#buildinpublic #community #javascript #webdev #UI
It's mostly drill-down because I think this is the most efficient way to explore content.
#buildinpublic #community #javascript #webdev #UI
I added the Node app server back, but in a much better way 🦄
It's now a very direct way to call functions on the server. Always returns JSON and the functions are "mostly" pure.
It's integrated with the main db. ctx.user is the read user from the db.
#javascript #dev #fullstack #buildinpublic
It's now a very direct way to call functions on the server. Always returns JSON and the functions are "mostly" pure.
It's integrated with the main db. ctx.user is the read user from the db.
#javascript #dev #fullstack #buildinpublic
September 29, 2025 at 5:15 PM
I added the Node app server back, but in a much better way 🦄
It's now a very direct way to call functions on the server. Always returns JSON and the functions are "mostly" pure.
It's integrated with the main db. ctx.user is the read user from the db.
#javascript #dev #fullstack #buildinpublic
It's now a very direct way to call functions on the server. Always returns JSON and the functions are "mostly" pure.
It's integrated with the main db. ctx.user is the read user from the db.
#javascript #dev #fullstack #buildinpublic
systemd auto restarts with delays and max retries is such a good pattern
random fatal errors become more like minor hiccups unless there's something fundamentally broken
#javascript #dev #buildinpublic #backend #devops #webdev
random fatal errors become more like minor hiccups unless there's something fundamentally broken
#javascript #dev #buildinpublic #backend #devops #webdev
September 29, 2025 at 1:07 PM
systemd auto restarts with delays and max retries is such a good pattern
random fatal errors become more like minor hiccups unless there's something fundamentally broken
#javascript #dev #buildinpublic #backend #devops #webdev
random fatal errors become more like minor hiccups unless there's something fundamentally broken
#javascript #dev #buildinpublic #backend #devops #webdev
The scope of the project is increasing a bit and I now have a bunch of services I need to manage🏃
I added an install script that will offload all of that to systemd
This means we get auto-restarts and all kinds of systemd magic 🏋️
Npm no longer runs anything
#javascript #dev #buildinpublic #infra
I added an install script that will offload all of that to systemd
This means we get auto-restarts and all kinds of systemd magic 🏋️
Npm no longer runs anything
#javascript #dev #buildinpublic #infra
September 29, 2025 at 12:17 PM
The scope of the project is increasing a bit and I now have a bunch of services I need to manage🏃
I added an install script that will offload all of that to systemd
This means we get auto-restarts and all kinds of systemd magic 🏋️
Npm no longer runs anything
#javascript #dev #buildinpublic #infra
I added an install script that will offload all of that to systemd
This means we get auto-restarts and all kinds of systemd magic 🏋️
Npm no longer runs anything
#javascript #dev #buildinpublic #infra
I removed the main Node server in favor of smaller stateless processes
A new dev-only process runs a persistent esbuild build. This detects changes and has it's own SSE endpoint for live reload
Another dumb process will be for on off server functions - JSON
#javascript #buildinpublic #dev #webdev
A new dev-only process runs a persistent esbuild build. This detects changes and has it's own SSE endpoint for live reload
Another dumb process will be for on off server functions - JSON
#javascript #buildinpublic #dev #webdev
September 28, 2025 at 9:38 PM
I removed the main Node server in favor of smaller stateless processes
A new dev-only process runs a persistent esbuild build. This detects changes and has it's own SSE endpoint for live reload
Another dumb process will be for on off server functions - JSON
#javascript #buildinpublic #dev #webdev
A new dev-only process runs a persistent esbuild build. This detects changes and has it's own SSE endpoint for live reload
Another dumb process will be for on off server functions - JSON
#javascript #buildinpublic #dev #webdev
Doing some exploration for uploads 🕵️
I want to anchor uploads to content (no orphaned uploads)
I tried Quil as the "blessed" editor and it works really well with pocketbase
Quil handles most of the UI, pocketbase handles file storage and permissions
#javascript #dev #buildinpublic #webdev #dx
I want to anchor uploads to content (no orphaned uploads)
I tried Quil as the "blessed" editor and it works really well with pocketbase
Quil handles most of the UI, pocketbase handles file storage and permissions
#javascript #dev #buildinpublic #webdev #dx
September 26, 2025 at 1:32 PM
Doing some exploration for uploads 🕵️
I want to anchor uploads to content (no orphaned uploads)
I tried Quil as the "blessed" editor and it works really well with pocketbase
Quil handles most of the UI, pocketbase handles file storage and permissions
#javascript #dev #buildinpublic #webdev #dx
I want to anchor uploads to content (no orphaned uploads)
I tried Quil as the "blessed" editor and it works really well with pocketbase
Quil handles most of the UI, pocketbase handles file storage and permissions
#javascript #dev #buildinpublic #webdev #dx
I integrated OAuth for social logins 💁
You get your client id and secret from some provider (like google or github) and add them in an .env file
That's all you need to do 🦄
Everything else is wired up. Pocketbase does most of the heavy work 🏋️
#javascript #dev #buildinpublic #webdev #UX #oauth
You get your client id and secret from some provider (like google or github) and add them in an .env file
That's all you need to do 🦄
Everything else is wired up. Pocketbase does most of the heavy work 🏋️
#javascript #dev #buildinpublic #webdev #UX #oauth
September 25, 2025 at 3:06 PM
I integrated OAuth for social logins 💁
You get your client id and secret from some provider (like google or github) and add them in an .env file
That's all you need to do 🦄
Everything else is wired up. Pocketbase does most of the heavy work 🏋️
#javascript #dev #buildinpublic #webdev #UX #oauth
You get your client id and secret from some provider (like google or github) and add them in an .env file
That's all you need to do 🦄
Everything else is wired up. Pocketbase does most of the heavy work 🏋️
#javascript #dev #buildinpublic #webdev #UX #oauth
The latest work on real-time subscriptions 🏃
You no longer need any server routes. All the subscription stuff can be client-side.
This is mostly thanks to pocketbase apis
In other words, a component can be fully isolated, data and all.
#javascript #dev #buildinpublic #pubsub #webdev #dx
You no longer need any server routes. All the subscription stuff can be client-side.
This is mostly thanks to pocketbase apis
In other words, a component can be fully isolated, data and all.
#javascript #dev #buildinpublic #pubsub #webdev #dx
September 24, 2025 at 11:38 PM
The latest work on real-time subscriptions 🏃
You no longer need any server routes. All the subscription stuff can be client-side.
This is mostly thanks to pocketbase apis
In other words, a component can be fully isolated, data and all.
#javascript #dev #buildinpublic #pubsub #webdev #dx
You no longer need any server routes. All the subscription stuff can be client-side.
This is mostly thanks to pocketbase apis
In other words, a component can be fully isolated, data and all.
#javascript #dev #buildinpublic #pubsub #webdev #dx
I added Mailpit as a dev mail server 📬
mail.localhost will give you a place to catch emails sent locally in dev
This will ship with project templates. One less thing you need to worry about configuring. Plus Mailpit is a single binary 🔥
#javascript #dev #buildinpublic #webdev #dx
mail.localhost will give you a place to catch emails sent locally in dev
This will ship with project templates. One less thing you need to worry about configuring. Plus Mailpit is a single binary 🔥
#javascript #dev #buildinpublic #webdev #dx
September 24, 2025 at 7:13 PM
I added Mailpit as a dev mail server 📬
mail.localhost will give you a place to catch emails sent locally in dev
This will ship with project templates. One less thing you need to worry about configuring. Plus Mailpit is a single binary 🔥
#javascript #dev #buildinpublic #webdev #dx
mail.localhost will give you a place to catch emails sent locally in dev
This will ship with project templates. One less thing you need to worry about configuring. Plus Mailpit is a single binary 🔥
#javascript #dev #buildinpublic #webdev #dx
I got a first pass of work done integrating Caddy 👀
The immediate impact:
removed all static file handling and all the compression logic from the node app 🔥
enabling zstd (gzip fallback) is literally one word 🦄
#javascript #dev #buildinpublic #webdev #performance
The immediate impact:
removed all static file handling and all the compression logic from the node app 🔥
enabling zstd (gzip fallback) is literally one word 🦄
#javascript #dev #buildinpublic #webdev #performance
September 22, 2025 at 3:34 PM
I got a first pass of work done integrating Caddy 👀
The immediate impact:
removed all static file handling and all the compression logic from the node app 🔥
enabling zstd (gzip fallback) is literally one word 🦄
#javascript #dev #buildinpublic #webdev #performance
The immediate impact:
removed all static file handling and all the compression logic from the node app 🔥
enabling zstd (gzip fallback) is literally one word 🦄
#javascript #dev #buildinpublic #webdev #performance
I can't think of anything to caption this with, so here it is 💁
Real, live, performant db search in the content field of posts. The thing on the left is the entire thing.
the war on boilerplate continues 🤸
#javascript #dev #buildinpublic #performance #dx #webdev
Real, live, performant db search in the content field of posts. The thing on the left is the entire thing.
the war on boilerplate continues 🤸
#javascript #dev #buildinpublic #performance #dx #webdev
September 21, 2025 at 11:56 PM
I can't think of anything to caption this with, so here it is 💁
Real, live, performant db search in the content field of posts. The thing on the left is the entire thing.
the war on boilerplate continues 🤸
#javascript #dev #buildinpublic #performance #dx #webdev
Real, live, performant db search in the content field of posts. The thing on the left is the entire thing.
the war on boilerplate continues 🤸
#javascript #dev #buildinpublic #performance #dx #webdev
Playing around with Pocketbase 👀
What an amazing piece of software ❤️
There's no need for app-level endpoints
The official SDK is designed to be run in the browser. It talks directly to the db server (single Golang binary)
This is all client code
#javascript #dev #buildinpublic #webdev
What an amazing piece of software ❤️
There's no need for app-level endpoints
The official SDK is designed to be run in the browser. It talks directly to the db server (single Golang binary)
This is all client code
#javascript #dev #buildinpublic #webdev
September 21, 2025 at 7:20 PM
Playing around with Pocketbase 👀
What an amazing piece of software ❤️
There's no need for app-level endpoints
The official SDK is designed to be run in the browser. It talks directly to the db server (single Golang binary)
This is all client code
#javascript #dev #buildinpublic #webdev
What an amazing piece of software ❤️
There's no need for app-level endpoints
The official SDK is designed to be run in the browser. It talks directly to the db server (single Golang binary)
This is all client code
#javascript #dev #buildinpublic #webdev
I revisited this with a fresh pair of eyes after working on the SSR component and I managed to cut down boilerplate a bit with an #SSE component 👻
Essentially, you give it an endpoint, a render function, and a method (replace or the default "append") for what to do
#javascript #dev #buildinpublic
Essentially, you give it an endpoint, a render function, and a method (replace or the default "append") for what to do
#javascript #dev #buildinpublic
September 20, 2025 at 7:35 PM
I revisited this with a fresh pair of eyes after working on the SSR component and I managed to cut down boilerplate a bit with an #SSE component 👻
Essentially, you give it an endpoint, a render function, and a method (replace or the default "append") for what to do
#javascript #dev #buildinpublic
Essentially, you give it an endpoint, a render function, and a method (replace or the default "append") for what to do
#javascript #dev #buildinpublic
Another example of "static islands" 👀
This time with "live search"
everything is CSR except but it responds to client URL which is modified with a CSR input
The product cards are essentially static links, so, skip the middle JSON part and just SSR them
#javascript #dev #buildinpublic
This time with "live search"
everything is CSR except
The product cards are essentially static links, so, skip the middle JSON part and just SSR them
#javascript #dev #buildinpublic
September 20, 2025 at 5:56 PM
Another example of "static islands" 👀
This time with "live search"
everything is CSR except but it responds to client URL which is modified with a CSR input
The product cards are essentially static links, so, skip the middle JSON part and just SSR them
#javascript #dev #buildinpublic
This time with "live search"
everything is CSR except
The product cards are essentially static links, so, skip the middle JSON part and just SSR them
#javascript #dev #buildinpublic
I spent a bit more time on this 🍿
I see a path forward with this pattern.
I see a path forward with this pattern.
September 20, 2025 at 3:43 PM
I spent a bit more time on this 🍿
I see a path forward with this pattern.
I see a path forward with this pattern.