Delete a Postgres Cluster
Documentation and guides from the team at Fly.io.
Fly Ā· fly.io [1]
Deleting a fly postgres db cluster was not straightforward to me as the app name is not inferred from the toml like it is for the main app.
fly apps destroy <pg-app-name>
fly pg db list -a <pg-app-name>
Note
This post is a thought [2]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: https://fly.io/docs/postgres/managing/deleting/
[2]: /thoughts/
GitHub Stars
GitHub stars posts
1859 posts
latest post 2026-05-24
Publishing rhythm
![[None]]
Yet again twitter cards were causing me pain. This time it was me not realizing that they require full urls, and not relative or abolute urls.
This was not working
<meta name="twitter:image" content="/shot/?path={{ request.url|quote_plus }}" content-type='image/png'/>
This does work with a full url
<meta name="twitter:image" content="https://thoughts.waylonwalker.com/shot/?path={{ request.url|quote_plus }}" content-type='image/png'/>
Note
This post is a thought [1]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: /thoughts/
-
Boot.dev is crushing it with these interviews. This one has Wes Bos, includes teaching, webdev, where is webdev headed.
Note
This post is a thought [1]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: /thoughts/
gen.nvim [1] by David-Kunz [2] is a game-changer in its space. Excited to see how it evolves.
Neovim plugin to generate text using LLMs with customizable prompts
References:
[1]: https://github.com/David-Kunz/gen.nvim
[2]: https://github.com/David-Kunz
[1]
This seems like a promising tool to use with ollama.
Note
This post is a thought [2]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: /static/https://github.com/David-Kunz/gen.nvim
[2]: /thoughts/
Ollama
Ollama is the easiest way to automate your work using open models, while keeping your data safe.
ollama.ai [1]
ollama is the easiest to get going local llm tool that I have tried, and seems to be crazy fast. It feels faster than chat gpt, which has not been the experience I have had previously with running llmās on my hardware.
curl https://i.jpillora.com/jmorganca/ollama | bash
ollama serve
ollama run mistral
ollama run codellama:7b-code
ollama list
Note
This post is a thought [2]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: https://ollama.ai/
[2]: /thoughts/
Check out Boeing [1] and their project config-file-validator [2].
Cross Platform tool to validate configuration files
References:
[1]: https://github.com/Boeing
[2]: https://github.com/Boeing/config-file-validator
If youāre into interesting projects, donāt miss out on NeoTweet [1], created by ChristianChiarulli [2].
No description available.
References:
[1]: https://github.com/ChristianChiarulli/NeoTweet
[2]: https://github.com/ChristianChiarulli
GitHub - sysid/sse-starlette
Contribute to sysid/sse-starlette development by creating an account on GitHub.
GitHub Ā· github.com [1]
sse-FastAPI [2].">starlette provides server sent events for startlette and FastApi. Iām evaluating for use with htmx [3].
Installation: # [4]
pip install sse-starlette
Usage: # [5]
import asyncio
import uvicorn
from starlette.applications import Starlette
from starlette.routing import Route
from sse_starlette.sse import EventSourceResponse
async def numbers(minimum, maximum):
for i in range(minimum, maximum + 1):
await asyncio.sleep(0.9)
yield dict(data=i)
async def sse(request):
generator = numbers(1, 5)
return EventSourceResponse(generator)
routes = [
Route("/", endpoint=sse)
]
app = Starlette(debug=True, routes=routes)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000, log_level='info')
Note
This post is a thought [6]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: https://github.com/sysid/sse-starlette
[2]: /fastapi/
[3]: /htmx/
[4]: #installation
[5]: #usage
[6]: /thoughts/
overflow - Layout
Utilities for controlling how an element handles content that is too large for the container.
tailwindcss.com [1]
Controlling overflow with tailwindcss
Examples # [2]
<div class="overflow-visible ..."></div>
<div class="overflow-hidden ..."></div>
Note
This post is a thought [3]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: https://tailwindcss.com/docs/overflow
[2]: #examples
[3]: /thoughts/
[1]
Default scrollbars on a dark theme website are just the ugliest thing. This page covers all the pseudo selectors needed to style the scrollbar.
/* width */
::-webkit-scrollbar {
width: 10px;
}
/* Track */
::-webkit-scrollbar-track {
background: #f1f1f1;
}
/* Handle */
::-webkit-scrollbar-thumb {
background: #888;
}
/* Handle on hover */
::-webkit-scrollbar-thumb:hover {
background: #555;
}
Note
This post is a thought [2]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: /static/https://www.w3schools.com/howto/howto_css_custom_scrollbar.asp
[2]: /thoughts/
[1]
Wincent (Greg Hurrel) has a pretty solid and fast zshrc. I recently grabbed his completion section and it seems to be working better than whatever I had.
zsh completion snippet
#
# Completion
#
fpath=($HOME/.zsh/completions $fpath)
autoload -U compinit
compinit -u
# Make completion:
# - Try exact (case-sensitive) match first.
# - Then fall back to case-insensitive.
# - Accept abbreviations after . or _ or - (ie. f.b -> foo.bar).
# - Substring complete (ie. bar -> foobar).
zstyle ':completion:*' matcher-list '' '+m:{[:lower:]}={[:upper:]}' '+m:{[:upper:]}={[:lower:]}' '+m:{_-}={-_}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
# Colorize completions using default `ls` colors.
zstyle ':completion:*' list-colors ''
# Allow completion of ..<Tab> to ../ and beyond.
zstyle -e ':completion:*' special-dirs '[[ $PREFIX = (../)#(..) ]] && reply=(..)'
# $CDPATH is overpowered (can allow us to jump to 100s of directories) so tends
# to dominate completion; exclude path-directories from the tag-order so that
# they will only be used as a fallback if no completions are found.
zstyle ':completion:*:complete:(cd|pushd):*' tag-order 'local-directories named-directories'
# Categorize completion...
Change Autocomplete Styles in WebKit Browsers | CSS-Tricks
We got a nice tip from Lydia Dugger via email with a method for changing the styles that WebKit browsers apply to form fields that have been autocompleted.
CSS-Tricks Ā· css-tricks.com [1]
All the hover, select, autofil, focus combinations have left me confused on how to consistently get my form elements styled in dark mode
This snippet from CSS tricks has fixed all the different states for me to give me full control.
/* Change Autocomplete styles in Chrome*/
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
textarea:-webkit-autofill,
textarea:-webkit-autofill:hover,
textarea:-webkit-autofill:focus,
select:-webkit-autofill,
select:-webkit-autofill:hover,
select:-webkit-autofill:focus {
border: 1px solid green;
-webkit-text-fill-color: green;
-webkit-box-shadow: 0 0 0px 1000px #000 inset;
transition: background-color 5000s ease-in-out 0s;
}
Note
This post is a thought [2]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: https://css-tricks.com/snippets/css/change-autocomplete-styles-webkit-browsers/
[2]: /thoughts/
GitHub - florimondmanca/arel: Lightweight browser hot reload for Python ASGI web apps
Lightweight browser hot reload for Python ASGI web apps - florimondmanca/arel
GitHub Ā· github.com [1]
arel is a āLightweight browser hot reload for Python ASGI web appsā
I just implemented this on my thoughts website using fastapi [2], and itās incredibly fast and lightweight. There just two lines of js that make a web socket connection back to the backend that watches for changes.
When in development mode, this snippet gets injected directly on the page and does a refresh when arel detects a change.
const ws = new WebSocket("ws://localhost:5000/hot-reload");
ws.onmessage = () => window.location.reload();
Note
This post is a thought [3]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: https://github.com/florimondmanca/arel
[2]: /fastapi/
[3]: /thoughts/
main.py [1]
python
import os
import arel
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates("templates")
if _debug := os.getenv("DEBUG"):
hot_reload = arel.HotReload(paths=[arel.Path(".")])
app.add_websocket_route("/hot-reload", route=hot_reload, name="hot-reload")
app.add_event_handler("startup", hot_reload.startup)
app.add_event_handler("shutdown", hot_reload.shutdown)
templates.env.globals["DEBUG"] = _debug
templates.env.globals["hot_reload"] = hot_reload
@app.get("/")
def index(request: Request):
return templates.TemplateResponse("index.html", context={"request": request})
# run:
# DEBUG=true uvicorn main:app --reload
I just discovered arel [2] for hot reloading python applications when content changes from this snippet that implements it for fatapi.
On app startup add the /hot-reload routes if in DEBUG mode.
import os
import arel
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates("templates")
if _debug := os.getenv("DEBUG"):
hot_reload = arel.HotReload(paths=[arel.Path(".")])
app.add_websocket_route("...
External Link
X (formerly Twitter) Ā· twitter.com [1]
I need to learn regex capture groups better. This is so dang powerful. I really like the \v that bob uses here, it really does cut down on the terseness of all the special characters.
I wanted to replace all occurrences of:
name,[email protected],0,171,,2023-09-21
With:
name,[email protected]
Easy to do with Python, but what about a bit of > regex in Vim?
:%s/\v([^,]+,[^,]+),.*/\1/
Note
This post is a thought [2]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: https://twitter.com/bbelderbos/status/1709525676154368055
[2]: /thoughts/
External Link
X (formerly Twitter) Ā· twitter.com [1]
HATEOAS gonna hate. More and more htmx [2] seems like the js library for backend devs. So rather than making 55 rest calls here, just make an endpoint that does what you want it to do with one, or a few requests.
Note
This post is a thought [3]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: https://twitter.com/teej_dv/status/1708258701008593173
[2]: /htmx/
[3]: /thoughts/
Open source, not open contribution with Ben Johnson (Changelog Interviews #433)
This week we're talking with Ben Johnson. Ben is known for his work on BoltDB, his work in open source, and as a freelance Go developer. Late January when Ben open sourced his newest project Litest...
Changelog Ā· changelog.com [1]
Ben Johnson was on the Changelog a few years back covering his work on litestream, and talks about why he chose to go open source, but not open contribution.
You should have a good reason to move off of sqlite.
Note
This post is a thought [2]. Itās a short note that I make
about someone elseās content online #thoughts
References:
[1]: https://changelog.com/podcast/433
[2]: /thoughts/
jpillora/installer is the install script generator I have been looking for. It
downloads binaries for your machine from GitHub releases and unzips them for
you. It grabs the latest release, so you can easily update them. I have
tried scripting these installs in the past and struggled to consistently get
the latest version for every package and unpack it correctly.
Also these pre-compiled binaries install rediculously fast compared to building
them from source.
Check out some example links.
opening in a browser will show metadata
https://i.jpillora.com/serve
If you pass in script=true it will instead return the install script as it
would by default through curl.
https://i.jpillora.com/serve?script=true
Use it to install neovim # [1]
All you need to do to generate an install script is to pass in the GitHub repo
slug with the org.
curl https://i.jpillora.com/neovim/neovim | bash
The shell script that it generates for neovim looks like this.
#!/bin/bash
if [ "$DEBUG" == "1" ]; then
set -x
fi
TMP_DIR=$(mktemp -d -t jpillora-installer-XXXXXXXXXX)
function cleanup {
rm -rf $TMP_DIR > /dev/null
}
function fail {
cleanup
msg=$1
echo "============"
echo "Error: $msg" 1>&2
...
I wanted to host some static files through fastapi [1]. Typical use cases for this
might be some static web content like html [2]/css/js. It could also be images or
some data that doesnāt need dynamically rendered.
From the Docs # [3]
The docs cover how to host static files, and give this solution that is built
into fastapi.
https://fastapi.tiangolo.com/tutorial/static-files/
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
app = FastAPI()
app.mount("/static", StaticFiles(directory="static"), name="static")
Authenticated Static Files # [4]
Thanks to #858 [5].
OscartGiles [6] posted this solution to add
authentication to static files. I tried this out on my
thoughts [7] and it worked flawlessly.
import typing
from pathlib import Path
import secrets
from fastapi import FastAPI, Request, HTTPException, status
from fastapi.staticfiles import StaticFiles
from fastapi.security import HTTPBasic, HTTPBasicCredentials
PathLike = typing.Union[str, "os.PathLike[str]"]
app = FastAPI()
security = HTTPBasic()
async def verify_username(request: Request) -> HTTPBasicCredentials:
credentials = await security(request)
correct_username = secrets.compare_diges...