💻 My personal website blog.kacaii.dev/
blog gleam lustre

:sparkles: add `/uses`

+44 -3
+27
priv/posts/uses.md
··· 1 + --- 2 + title = "uses" 3 + date = 2026-01-01 4 + tags = ["uses"] 5 + --- 6 + 7 + ## Software 8 + 9 + - [Lazyvim](https://www.lazyvim.org/): I might give Helix a try some other time. 10 + - [Just](https://just.systems/): A command runner similar to Taskfile. 11 + - [Djot](https://djot.net/): Feels nicer to use than than regular markdown. 12 + - [Fly.io](https://fly.io/): It surprisingly easy to deploy containers there. 13 + - [Yazi](https://yazi-rs.github.io/): Terminal file manager. 14 + - [Tmux](https://github.com/tmux/tmux): Terminal multiplexer. 15 + - [Direnv](https://direnv.net/): Load enviroment variables on switching directories 16 + 17 + ### Programming Languages 18 + 19 + - [Gleam](https://gleam.run/): It's still my favorite programming language. 20 + - [Fish](https://fishshell.com/): My default shell for around 1 year, super intuive. 21 + 22 + ### Version Control 23 + 24 + - [Tangled](https://tangled.org/): I recently moved away from Github, 25 + because of their recent decisions, tangled feels like breath of fresh air. 26 + - [Jujutsu](https://www.jj-vcs.dev): Feels a lot more flexible and intuitive than Git, 27 + Also tangled has support for it!
+5
priv/static/blog.css
··· 67 67 font-size: 1.5rem; 68 68 } 69 69 70 + hr { 71 + color: var(--mocha-overlay0); 72 + padding: var(--default-padding) 0; 73 + } 74 + 70 75 a { 71 76 text-decoration: underline; 72 77 text-underline-offset: 2px;
+1 -1
src/blog/page/content.gleam
··· 39 39 class( 40 40 "grid grid-cols-1 gap-4" 41 41 <> " mx-auto max-w-md sm:max-w-lg md:max-w-2xl" 42 - <> " text-pretty post-content", 42 + <> " text-pretty post-content w-full", 43 43 ) 44 44 45 45 element.fragment([element.unsafe_raw_html("", "article", [style], post_body)])
+1
src/blog/page/navbar.gleam
··· 8 8 html.nav([style], [ 9 9 anchor_with_icon(icon: "nf-fa-home", href: "/", label: "Home"), 10 10 anchor_with_icon(icon: "nf-md-note_edit", href: "/posts", label: "Articles"), 11 + anchor_with_icon(icon: "nf-fa-gift", href: "/uses", label: "Uses"), 11 12 ]) 12 13 } 13 14
+2 -1
src/blog/page/posts.gleam
··· 14 14 15 15 pub fn handle_request(ctx: web.Context) -> wisp.Response { 16 16 let ul_styles = class("grid grid-cols-1 gap-4 mx-auto max-w-lg md:max-w-2xl") 17 + let posts = list.filter(ctx.posts, fn(post) { post.meta.title != "uses" }) 17 18 18 19 let content = [ 19 20 navbar.view(), 20 - html.div([], [html.ul([ul_styles], list.map(ctx.posts, post_preview))]), 21 + html.div([], [html.ul([ul_styles], list.map(posts, post_preview))]), 21 22 footer.view(), 22 23 ] 23 24
+1 -1
src/blog/page/recent_posts.gleam
··· 8 8 9 9 pub fn view(recent_posts: List(post.Post)) { 10 10 let previews = 11 - recent_posts 11 + list.filter(recent_posts, fn(post) { post.meta.title != "uses" }) 12 12 |> list.take(2) 13 13 |> list.map(post_to_li) 14 14
+6
src/blog/post.gleam
··· 29 29 string.lowercase(post.meta.title) 30 30 |> string.replace(" ", "-") 31 31 |> string.replace("_", "-") 32 + |> string.replace("(", "") 33 + |> string.replace(")", "") 34 + |> string.replace("[", "") 35 + |> string.replace("]", "") 36 + |> string.replace("{", "") 37 + |> string.replace("}", "") 32 38 } 33 39 34 40 pub fn parse(path file: String) -> Result(Post, PostError) {
+1
src/web/http_router.gleam
··· 9 9 10 10 case wisp.path_segments(req) { 11 11 [] -> home.handle_request(ctx) 12 + ["uses"] -> content.handle_request(ctx, "uses") 12 13 ["posts"] -> posts.handle_request(ctx) 13 14 ["posts", post] -> content.handle_request(ctx, post) 14 15