diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..490d928
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,2 @@
+[*.luau]
+max_line_length = 80
diff --git a/.luaurc b/.luaurc
index bd87ff3..c678188 100644
--- a/.luaurc
+++ b/.luaurc
@@ -5,6 +5,7 @@
"globals": [
"maivi",
"h",
- "this"
+ "this",
+ "Iter"
]
}
diff --git a/data/about.md b/data/about.tkt
similarity index 73%
rename from data/about.md
rename to data/about.tkt
index f84f39e..a657d99 100644
--- a/data/about.md
+++ b/data/about.tkt
@@ -2,7 +2,7 @@
title = "about me :)"
+++
-###### ✨ i'm passionate about:
+~ ✨ i'm passionate about:
software (neovim, nix, rust, and more)
@@ -10,7 +10,7 @@ title = "about me :)"
nature & mythology (gardens, forests, folklore)
-###### 🌱 in my projects, i blend these passions together:
+~ 🌱 in my projects, i blend these passions together:
evergarden (a soft, nature-inspired colorscheme)
@@ -19,13 +19,17 @@ title = "about me :)"
... and more.
-> _"Among the roses, beneath the twilight."_ 🌙🌿
+
+ "Among the roses, beneath the twilight." 🌙🌿
+
-## how this site was build
+== how this site was build
this site is build using the following tools:
-- zola, for static site generation
+- [maivi], for html templating in luau
- nix, for reproducible builds everywhere
you can read more about it [here](/blog/building-this-site).
+
+[maivi]: https://codeberg.org/comfysage/site
diff --git a/data/blog/building-this-site.md b/data/blog/building-this-site.tkt
similarity index 73%
rename from data/blog/building-this-site.md
rename to data/blog/building-this-site.tkt
index 26b4ddc..58b26f7 100644
--- a/data/blog/building-this-site.md
+++ b/data/blog/building-this-site.tkt
@@ -1,12 +1,12 @@
+++
-title = "building this site"
+title = "[outdated] building this site"
date = 2025-01-22
modified = 2026-01-07
desc = "my tiny adventure in static site generation"
tags = site,
+++
-## static site generation
+= static site generation
while looking for a static site generator for my site i tried a few interesting
tools, like hugo and astro. i even tried building my own ssg (which failed
@@ -16,13 +16,13 @@ written in rust. zola uses tera templates to build sites with minimal effort.
zola separates content from templates. where markdown files can specify which
templates to use.
-### templates
+== templates
here is my blog page. it specifies a template to use for the section. in this
template i can use zola's section variables to create a dynamic posts page
(which i'll get into in a bit).
-```markdown
+~~~ markdown
+++
title = "blog"
description = "questionable ideas put to paper"
@@ -30,7 +30,7 @@ sort_by = "date"
template = "pages/blog.html"
page_template = "pages/post.html"
+++
-```
+~~~
the blog page also specifies a `page_template`. this is the template that will
be used for all child pages (my blogposts).
@@ -38,7 +38,7 @@ be used for all child pages (my blogposts).
in my `pages/blog.html` template i can use zola's section variables to iterate
over all my blogposts and generate a list at build time.
-```tera
+~~~ tera
{% block content %}
{{ section.content | safe }}
@@ -47,9 +47,9 @@ over all my blogposts and generate a list at build time.
{% endfor %}
{% endblock content %}
-```
+~~~
-## build and deploy
+= build and deploy
to ease building and deploying the site i use nix to setup my tools and build.
because the site is static i simply can use github pages to deploy.
@@ -57,7 +57,7 @@ because the site is static i simply can use github pages to deploy.
the nix builder simply takes zola as a buildinput and runs the build. i then
copy the static content to the `$out` directory.
-```nix
+~~~ nix
stdenvNoCC.mkDerivation {
src = ./.;
@@ -80,26 +80,23 @@ stdenvNoCC.mkDerivation {
runHook postInstall
'';
}
-```
+~~~
deployment is done using a single github
action you can find
[here](https://codeberg.org/comfysage/site/src/commit/0b94d7338c1d7c50c09635b4d20fbeab552d58fd/.github/workflows/deploy.yml).
-
+< (note) ~ update: codeberg ci
+< deployment is now done with codeberg ci using woodpecker using the config
+< you can find [here][codeberg ci]
-## resources
+[codeberg ci]: https://codeberg.org/comfysage/site/src/commit/0b94d7338c1d7c50c09635b4d20fbeab552d58fd/.woodpecker/deploy.yaml
+
+= resources
diff --git a/data/blog/creating-a-colorscheme.md b/data/blog/creating-a-colorscheme.tkt
similarity index 97%
rename from data/blog/creating-a-colorscheme.md
rename to data/blog/creating-a-colorscheme.tkt
index a01de41..f96e7b0 100644
--- a/data/blog/creating-a-colorscheme.md
+++ b/data/blog/creating-a-colorscheme.tkt
@@ -23,14 +23,14 @@ own colorscheme journey. these tips are based on my extensive time researching
color theory, both in creating colorschemes and art in
general.
-### where to start
+== where to start
the best thing is to start with a concept. use a scene, videogame or movie you
like as inspiration. next, collect some images relating to your concept. by
creating a moodboard, you quickly have access to reference material for your
colorscheme.
-### finding your neutral colors
+== finding your neutral colors
every colorscheme starts with a background color. it is quite difficult to
select foreground colors until you know which color they will contrast with;
@@ -54,7 +54,7 @@ next up is creating your neutral shades. this can simply be done by
incrementally changing the components of your background color until they reach
the value of your foreground color.
-### how to select colors
+== how to select colors
look in your reference material for a _single_ color that you find
representative of your concept. next, crank up the lightness and
@@ -66,7 +66,7 @@ the hue over about 60 to 90 degrees each time. by selecting colors that
differ only in _one_ component, either hue or lightness or saturation, you
create a palette that looks quite harmonious.
-### adjusting your colors
+== adjusting your colors
you might notice that some of your colors look a little off. this is because
saturation and lightness in the hsl (or hsv) color space is not perceptually
@@ -84,7 +84,7 @@ in general, there are a few rules for a coherent palette: your reds and oranges
will have a higher saturation than your other colors, whereas your blues and
greens will have a lower saturation.
-### look at community resources
+== look at community resources
to further help you on your journey I have selected a collection of resources I
discovered while researching colorschemes. the end result of these resources
diff --git a/data/blog/neovim-artio-picker.md b/data/blog/neovim-artio-picker.tkt
similarity index 94%
rename from data/blog/neovim-artio-picker.md
rename to data/blog/neovim-artio-picker.tkt
index 942fe77..950188a 100644
--- a/data/blog/neovim-artio-picker.md
+++ b/data/blog/neovim-artio-picker.tkt
@@ -5,7 +5,7 @@ desc = "working on a neovim general picker using the ui2 framework and native fe
tags = neovim,plugin
+++
-## preface
+= preface
Fuzzy searching in neovim has been a heavily debated topic for years. There
were those we fought for telescope being merged into core (which fortunately
@@ -39,7 +39,7 @@ in the cmdline like it's a normal buffer. This is very similar to emacs'
minibuffer feature, which allows plugin authors to use the same UI component
(at the bottom of the screen) to show information.
-## overview
+= overview
[artio.nvim] is a lightweight fuzzy picker for neovim built on top of the new
ui2 window system. It aims to provide a simple and responsive selection UI
@@ -56,7 +56,7 @@ plugins and core features. Since `vim.ui.select` allows plugin authors to pass
[additional attributes][vim-ui-select-attributes] to its props artio can use these to add additional
functionality.
-```lua
+~~~ lua
local files = vim.iter(vim.fs.dir('.')):map(function(node, nodetype)
return nodetype == 'file' and node
end):totable()
@@ -72,9 +72,9 @@ vim.ui.select(files, {
-- artio exclusive:
get_icon = function(item) return require('mini.icons').get("file", item.v) end,
}, function(item, _) vim.cmd.cd(item) end)
-```
+~~~
-## features
+= features
Artio provides a fuzzy-filtered selection window implemented entirely in lua.
it uses ui2 for layout and rendering, which keeps the interface consistent
@@ -94,16 +94,16 @@ to be a plugin focused on performance. If you want these features, you can imple
For example, if you want to process fuzzy sorting through and external dependency you can do so by overwriting the default sorter:
-```lua
+~~~ lua
package.loaded['artio'].sorter = function(lst, input)
local output = ... -- run your external cmd through `vim.system`
-- process output and return matches
return vim.iter(output):fold({}, ...)
end
-```
+~~~
-## configuration
+= configuration
The configuration of artio is similarly designed like most neovim components:
to be extensible and flexible. E.g., you can simply change some resizing behavior
@@ -112,7 +112,7 @@ with `config.shrink` or change the way the preview is drawn with
an example setup could look something like this:
-```lua
+~~~ lua
vim.pack.add({ "https://codeberg.org/comfysage/artio.nvim" })
-- after installation, calling its setup function allows you to adjust behavior
@@ -138,11 +138,11 @@ require('artio').setup({
hidestatusline = true,
},
})
-```
+~~~
Keymappings are left to the user. You can find some examples in the [README]:
-```lua
+~~~ lua
vim.keymap.set("n", "", "(artio-files)")
vim.keymap.set("n", "fg", "(artio-grep)")
@@ -154,22 +154,20 @@ vim.keymap.set("n", "fh", "(artio-helptags)")
vim.keymap.set("n", "fb", "(artio-buffers)")
vim.keymap.set("n", "f/", "(artio-buffergrep)")
vim.keymap.set("n", "fo", "(artio-oldfiles)")
-```
+~~~
These mappings are available through the [``][plug-key] interface. These
are abstract 'keys' that have been mapped by plugin authors (like me) to certain action
and can be mapped to by users with their custom keybinds.
-
+# TODO: comparison with other pickers
+# - position relative to builtin UI
+# - related tools and comparison
+# - contrast with Telescope
+# - contrast with fzf-lua
+# - contrast with snacks
-## future
+= future
Currently artio is in a relatively stable state. Improvements or changes might
be made to solve issues or improve performance but there (probably) won't be
@@ -178,22 +176,18 @@ any major api changes.
As for possible future features, im mostly looking into leveraging async
handling of sorters but i'm open to further suggestions.
-
-
-## closing
-
-
+# TODO:
+# - future direction
+# - possible improvements
+# - areas intentionally left open
+# - maintenance philosophy (long-term intent)
+
+= closing
+
+# closing summary (wrap-up)
+# restating purpose
+# who should use it
+# who probably should not
I discovered a lot of cool features and weird neovim quirks while designing
this plugin. Neovim's ui2 definitely is not finished yet and a minibuffer
diff --git a/data/blog/neovim-native-configuration.md b/data/blog/neovim-native-configuration.tkt
similarity index 81%
rename from data/blog/neovim-native-configuration.md
rename to data/blog/neovim-native-configuration.tkt
index 8445531..b30cb1c 100644
--- a/data/blog/neovim-native-configuration.md
+++ b/data/blog/neovim-native-configuration.tkt
@@ -5,19 +5,11 @@ desc = "my adventure building a native-first neovim experience"
tags = neovim,config
+++
-
+# intro
+# - why i wanted a quieter, native-first neovim experience
+# - frustration with sprawling plugin ecosystems and fragile abstractions
+# - goal: a configuration that feels like neovim, not a replacement for it
+# - result: sylvee, a native-first neovim distro — and lynn, the small plugin manager that powers it
if you're like me and love configuring your neovim setup, you might reach a
point of customization where the different plugins you're using start holding
@@ -33,21 +25,14 @@ focus on bringing features to my editor using built-in building blocks and
components. this meant no [nvim-cmp] or [blink-cmp] and, most importantly, no
[lazy.nvim].
-### philosophy and foundation
-
-
+# section 1: philosophy and foundation
+# (what kind of user sylvee is built for)
+# - starting from neovim’s built-in features
+# - avoiding wrapping everything in custom logic
+# - respecting the defaults, only extending when necessary
+# - the garden metaphor: letting neovim bloom on its own
neovim has become incredibly powerful out-of-the-box and i want to take advantage of that.
so i created [sylvee][], a native-first neovim configuration that builds on the amazing
@@ -57,7 +42,7 @@ to power plugin management i created a wrapper around [`vim.pack`], neovim
nightly's native plugin manager. this wrapper is called [lynn.nvim][], and it
powers the configuration that i made.
-## neovim's built-in features
+= neovim's built-in features
sylvee was built to extend neovim's built-in features. i didn't want to wrap my
clean and powerful editor in a layer of bloated plugins. using neovim's
@@ -93,25 +78,9 @@ get sourced. all you need to do is enable the lsp's you use using
simplified: you no longer have to even `require` this plugin - just
throw it in your plugin list and it works.
-
-
-### sylvee: keeping configuration gentle
-
-
+= sylvee: keeping configuration simple
a core part of sylvee is the idea that configuration should be simple and
minimal. this meant using the `plugin/` to load custom scripts instead of death
@@ -127,29 +96,9 @@ keymap model: switching tabs made more sense with `bracket + ` than
[`gt/gT`]. although the goal is minimalism, i didn't want to compromise on my
preferences - sylvee can be a little opinionated sometimes.
-## lynn - a plugin manager with charm
-
-
-
-### why i don't like lazy.nvim or packer
+== why i don't like lazy.nvim or packer
over time the neovim community has reinvented plugin management time and time
again - to me the days of `vim-plug` dont feel that far away and we've come a
@@ -190,7 +139,7 @@ led me to create [lynn.nvim], a plugin manager that leverages neovim's builtin
features which are responsible for all the heavy lifting and creates a configuration interface that fits
neovim's file based model.
-### lynn as a lightweight wrapper: no magic, just convenience
+== lynn as a lightweight wrapper: no magic, just convenience
lynn didnt need to do a lot: git cloning, installing, and setting up the plugin
path was already handled by [`vim.pack`]. lynn simply needed to help with urls
@@ -215,33 +164,15 @@ done by the `:runtime` command - neovim already has a builtin mechanism for
finding files in your setup and there is no need for lua code going over your
filesystem.
-## using lynn and sylvee
-
-
-
-### adding plugins to lynn
+== adding plugins to lynn
plugin specs are quite simple. you're probably already familiar with most of the fields it supports.
-a simple example would look like this:
+here's an example with all the possible options:
-```lua
+~~~ lua
{
'owner/repo',
url = 'https://github.com/owner/repo', -- optionally specify a custom url
@@ -254,7 +185,7 @@ a simple example would look like this:
after = function() end, -- pass a function to run after the plugin is loaded, by default sources the `config/plugin-name.lua` file
before = function() end, -- pass a function to run before the plugin is loaded
}
-```
+~~~
lazy loading is only done if `lazy` is set to `true` or an autocmd event is
specified. this means that normally lynn will load the plugin after neovim's
@@ -265,40 +196,24 @@ to be used. `after` will default to loading your config file so any important
code should go there. `before` is only useful if you want to run code before
the plugin is loaded.
-### using sylvee
+== using sylvee
using sylvee is as simple as cloning the repo and running neovim with [`NVIM_APPNAME`] set to `"sylvee"`.
-```bash
+~~~ bash
git clone https://github.com/comfysage/sylvee.git ~/.config/sylvee
NVIM_APPNAME=sylvee nvim
-```
+~~~
this can be simplified even more by creating a quick wrapper script for sylvee:
-```bash
+~~~ bash
#!/usr/bin/env sh
# ~/.local/bin/sylvee
NVIM_APPNAME=sylvee nvim "$@"
-```
-
-## what sylvee and lynn don’t do
-
-
+== what sylvee and lynn don’t do
sylvee and lynn don't aim to solve every problem. they just try to stay out of
your way sylvee is a minimalistic approach that tries to remove the friction of
@@ -322,23 +237,7 @@ edge-cases.
[neovim/pr/lock]: https://github.com/neovim/neovim/issues/34776
-## growing your own garden
-
-
+= growing your own garden
i would also like to note that the philosophy of sylvee and lynn is not to be a
complete solution, but rather a starting point for those that want to build
@@ -360,23 +259,6 @@ own lazy-loading solution (ofcourse thats always a viable and fun option).
[neovim/docs/grep]: https://neovim.io/doc/user/quickfix.html#_5.-using-:vimgrep-and-:grep
[neovim/docs/marks]: https://neovim.io/doc/user/motion.html#_7.-marks
-
-
i hope that this setup works for you. i personally loved working on it and
learned a lot about how powerful of an editor neovim can be if you try to look
into some of its more complex aspects. the neovim core team has worked really
@@ -392,7 +274,7 @@ if that sounds like your kind of garden, give sylvee and lynn a try. i think
they're something interesting to try out. if you have any questions or feedback
please [let me know](https://github.com/comfysage/sylvee/discussions)!
-# references
+= references
here are some references that add more context to this blogpost:
diff --git a/data/index.md b/data/index.md
deleted file mode 100644
index a0e79c8..0000000
--- a/data/index.md
+++ /dev/null
@@ -1,21 +0,0 @@
-## 🪴 garden
-
-welcome to my internet garden, a cozy corner of the internet for storing my ideas and sharing what i'm working on.
-
-```bash
-curl -L robinwobin.dev
-```
-
-in my garden you can find my [blog posts](/blog) and more frequently some small [notes](/notes).
-
-this is where i keep the tools i've built - small creations designed to make
-development smoother, workflows simpler, and ideas easier to bring to life.
-
-- evergarden - a soft, nature-inspired colorscheme
-- ivy - a nix-based neovim setup
-- lynn.nvim - a lightweight neovim plugin manager _(you can read more about it [here](/blog/neovim-native-configuration))_
-- artio.nvim - a minimal, nature-infused file picker for neovim using the new extui window
-
-more tools are always growing here - check back later! 🌿
-
-you can find links to some cool people on the [badges](/badges) page.
diff --git a/data/index.tkt b/data/index.tkt
new file mode 100644
index 0000000..22b8f41
--- /dev/null
+++ b/data/index.tkt
@@ -0,0 +1,23 @@
+== 🪴 garden
+
+welcome to my internet garden, a cozy corner of the internet for storing my ideas and sharing what i'm working on.
+
+~~~ bash
+curl -L robinwobin.dev
+~~~
+
+in my garden you can find my [blog posts](/blog) and more frequently some small [notes](/notes).
+
+this is where i keep the tools i've built - small creations designed to make
+development smoother, workflows simpler, and ideas easier to bring to life.
+
+