Browse Source

New blog redesign (#1)

Co-authored-by: Artemis <>
Co-authored-by: ArtemisNeko <>
Co-committed-by: ArtemisNeko <>
ArtemisNeko 2 months ago
  1. 6
  2. 13
  3. 1
  4. 51
  5. 13
  6. 264
  7. 70
  8. 17
  9. 17
  10. 14
  11. 0
  12. 56
  13. 12
  14. 15
  15. 7
  16. 7
  17. 7
  18. 12
  19. 7
  20. 7
  21. 10
  22. 8
  23. 7
  24. 9
  25. 30
  26. 12
  27. 9
  28. 9
  29. 15
  30. 9
  31. 9
  32. 12
  33. 10
  34. 43
  35. 23
  36. 29
  37. 4
  38. 4
  39. 4
  40. 4
  41. 4
  42. 4
  43. 4
  44. 4
  45. 6
  46. 8
  47. 4
  48. 4
  49. 4
  50. 6
  51. 6
  52. 6
  53. 6
  54. 36
  55. 11
  56. 13
  57. 12
  58. 11
  59. 4
  60. 14
  61. 12
  62. 8
  63. 5
  64. 10
  65. 9
  66. 11
  67. 12
  68. 116
  69. 3
  70. 53
  71. 18
  72. 76
  73. 114
  74. 40
  75. 11
  76. 6
  77. 32
  78. 45
  79. 45
  80. 0
  81. 0
  82. 0
  83. 0
  84. 0
  85. 0
  86. 0
  87. 0
  88. 0
  89. 0
  90. 0
  91. 0
  92. 0
  93. 0
  94. 0
  95. 0
  96. 0
  97. 0
  98. 0
  99. 0
  100. 0


@ -11,8 +11,10 @@ steps:
- echo $KNOWN_HOSTS > $HOME/.ssh/known_hosts
- echo $SSH_KEY | base64 -d > $HOME/.ssh/id_ed25519
- chmod 400 $HOME/.ssh/id_ed25519
- apk add --no-cache janet bash openssh
- ./
- apk add --no-cache python3 zola openssh
- zola build
- python3
- mv public
- 'tar czf - | ssh $REMOTE_HOST "cd $REMOTE_PATH && tar mxzf -"'


@ -0,0 +1,13 @@
root = true
charset = utf-8
end_of_line = lf
indent_size = tab
indent_style = tab
insert_final_newline = true
trim_trailing_whitespace = true
indent_size = 2
indent_style = space


@ -1 +1,2 @@


@ -3,54 +3,3 @@
The builder is licensed under the CNPLv6 license or later, but not the written content (which is non-free, reserved rights).
Static website generator for my []( NSFW/tech personal blog.
## How it works
The `` bash4+ script makes a copy of `www` into the destination folder (`out`), then runs `find(1)` on the destination folder to find every file in it.
On each file, it re-runs ``, providing the file's relative path as first argument.
if [[ -d "out" ]]; then
rm -rf "out"
cp -r www out
find out -type f -exec "$blog_sh" {} \;
For each file, a match is done, the first matching condition being run and all the other dropped.
- If the extension is `.gmi`, the `handle_html` function is run
- If the file is executable, the `handle_rc` function is run
The `handle_html` function assumes the Gemini file to be compliant with the few semantic requirements defined in this project.
eval $(janet blog.janet --meta $input)
janet blog.janet --html $input | ./ > $output
Using the janet script and the template building script, the final HTML version is built.
The `handle_rc` function assumes the output file name to be the input one, minus its extension.
That means that `feed.xml.janet` will be generated as `feed.xml`.
There is no code to handle extension-less files.
set +e
$input > $output
if (( $? != 0 )); then
# failed: cleanup
rm -f $output
rm $input
set -e
The standard output of the input executable file is piped to the output file, allowing for any kind of generated content, including binary files (such as images).
Additional logic will come at some point, allowing for templatization of existing files, as to allow running custom scripts on otherwise untransformable binary files (such as images).


@ -1,13 +0,0 @@
* Write an image dithering pipeline
* Add an `init` command to ``
* Add relative files (ie ignore those files in the file loop, but if found, use them before using the global one)
* Article linter tool
## Article linter tool
* Dead links
* Headings generating the same slug (conflicting IDs)
* Title and excerpt existence
* Grammar and spelling, using `aspell(1)`


@ -1,264 +0,0 @@
# Utils
(defn tpl/join
"Joins the fragments of a template"
[& frags]
(string/join ;frags "\n"))
(defn slugify
"Slugifies the given string value"
(get (->> v
~{:main (cmt (any (+ (<- :w+) :W))
,|(string/join $& "-"))})
(defn pp-ast
"Pretty prints the Gemini AST (as provided by (peg/match gemini-syntax))"
(if ast
(print "[")
(map |(printf "\t%q" $0) ast)
(print "]"))))
# Parser
(def gemini-syntax
"The gemini syntax, following the format [:type value meta] where value and meta are optional depending on the symbol"
~{# Symbols
:paragraph (some (if-not "\n" 1))
:white (any " ")
# Lines
:shebang (* "#!" :paragraph (? "\n"))
:line (cmt (<- :paragraph) ,|[:line $0])
:empty-lines (cmt (some "\n") ,|[:empty])
:heading (cmt
(* (<- (between 1 3 "#")) :white (<- :paragraph))
,|[:heading (string/trim $1) (slugify $1) (length $0)])
:link (cmt
(* "=>" :white (<- (some :S)) (? (* :white (<- :paragraph))))
,(fn [link &opt alt]
(default alt link)
[:link link alt]))
:list-item (* "* " (cmt (<- :paragraph) ,string/trim))
:quote (+
(cmt (* ">" (<- :paragraph)) ,|[:quote (string/trim $0)])
(cmt ">" ,|[:quote ""]))
## Custom HTML-mapped syntax
:hr (cmt "---" ,|[:hr])
# Aggregates
:blockquote (cmt
(* "```" (? (<- :paragraph)) "\n"
(<- (some (if-not "\n```" 1)))
"\n```" (any (if-not "\n" 1)))
,|(let [l (length $&)]
[:blockquote (get $& (- l 1)) (get $& (- l 2))]))
:list (cmt
(any (* "\n" :list-item)))
,|[:list $&])
:multiline-quote (cmt
(any (* "\n" :quote)))
,|[:multiline-quote $&])
:block (+ :link
:main (*
(? :shebang)
(some (* :block (? "\n"))))})
(defn htmlspecialchars
"Same as PHP's method"
(->> value
(string/replace "&" "&amp;")
(string/replace "<" "&lt;")
(string/replace ">" "&gt;")
(string/replace "\"" "&quot;")
(string/replace "'" "&apos;")))
(defn html-compatible-link
"Transforms a Gemini-file-pointing link to a HTML-file-pointing link"
(if-let [r-parts (reverse (string/split "." link))
ext (first r-parts)
base (reverse (slice r-parts 1))]
(string/join [;base (if (= ext "gmi") "html" ext)] ".")
(defn to-html
"Transforms the Gemini AST (as provided by (peg/match gemini-syntax)) into HTML"
[ast &opt sep]
(default sep "\n")
(if ast
|(match $0
[:blockquote value alt]
(string "<pre><code"
(if alt (string " class='language-" alt "'"))
">" (htmlspecialchars value) "</code></pre>")
[:heading value slug level]
(string "<h" level " id='" slug
"'><a href='#" slug "' class='heading'>::</a> " (htmlspecialchars value) "</h" level ">")
[:multiline-quote value]
(string "<blockquote>\n"
(string/join (map |(string "<p>" (htmlspecialchars (get $0 1)) "</p>") value) "\n")
"<div class='empty'></div>"
[:line value]
(string "<p>" (htmlspecialchars value) "</p>")
[:list items]
(string/join @["<ul>"
;(map |(string "<li>" (htmlspecialchars $0) "</li>") items)
"</ul>"] "\n")
[:link value alt]
(string "<a href='" (html-compatible-link value) "'>" (htmlspecialchars alt) "</a>")
(error (string "Invalid symbol: " (get $0 0))))
(defn to-gmi
"Transforms the Gemini AST (as provided by (peg/match gemini-syntax)) into Gemini"
[ast &opt sep]
(default sep "\n")
(if ast
|(match $0
[:blockquote value alt]
(if (= nil alt)
(string "```\n" value "\n```")
(string "```" alt "\n" value "\n```"))
[:heading value _ level]
(string/join (map (fn [_] "#") (range level)))
" " value)
[:quote value]
(string "> " value)
[:line value]
[:list items]
(string/join |(string "* " $0) items)
[:link value alt]
(if (= value alt)
(string "=> " value)
(string "=> " value alt))
(error (string "Invalid symbol: " (get $0 0))))
(defn to-rss
"Transforms the Gemini AST (as provided by (peg/match gemini-syntax)) into RSS2"
[ast &opt sep]
(default sep "\n")
(defn- ast/ltrim
|(if (and
(= 0 (length $0)) # acc is empty (no content yet) ..
(match $1 [:empty] true [:hr] true)) # .. and item isn't yet to take
$0 # we ignore
[;$0 $1]) # we concat
[] ast))
(defn- ast/rtrim
(-> ast
(defn- is-blank [node]
(match node [:empty] true [:hr] true _ false))
(defn- extract-title
"the title value if the first node is H1, else nil"
(match (get ast 0)
[:heading value _ 1] (htmlspecialchars value)))
(defn- extract-excerpt
"the first paragraph block before empty node or EOF"
(let [ast (if (extract-title ast)
(array/slice ast 1)
(take-until is-blank (ast/ltrim ast))))
(defn extract-meta
"Extract metadata from a gemini document (title, excerpt, links) into a structure"
{:title (extract-title ast)
:excerpt (extract-excerpt ast)})
(defn escape-bash-value
(->> v
(string/replace-all "\"" "&quot;")
(string/replace-all "\n" "")))
(defn dump-bash-eval
"Dumps the metadata table into a bash-eval-compatible format, for easy loading"
(loop [[key value] :in (pairs meta)]
(let [final (cond
(= :string (type value)) value
(= :tuple (type value)) (to-html value))]
(print "export " (string/ascii-upper key) "=\"" (escape-bash-value final) "\";"))))
# Main
(defn parse-doc
[mode path]
(if (= :file
(os/stat path :mode))
(let [value (slurp path)
ast (peg/match gemini-syntax value)]
(= mode :ast) (pp-ast ast)
(= mode :html) (print (to-html ast))
(= mode :meta) (dump-bash-eval (extract-meta ast))
(= mode :gmi) (print (to-gmi ast))
(= mode :rss) (print (to-rss ast))
(error (string/format "unknown mode: %q" mode))))
(string/format "file not found: %s\n" path))))
(defn usage [bin]
(string/format "usage: %s {--html|--meta|--rss} FILE\n" bin))
(os/exit 1))
(defn main [bin & args]
(match args
["--ast" file] (parse-doc :ast file)
["--html" file] (parse-doc :html file)
["--meta" file] (parse-doc :meta file)
["--rss" file] (parse-doc :rss file)
_ (usage bin)))


@ -1,70 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
root=$(dirname "$0")
cd "$root"
export root=$root
blog_sh="$PWD/$(basename $0)"
export blog_name="Aphrodite"
export author="Artémis <>"
export out_dir="$root/"
function handle_html {
eval $(janet blog.janet --meta $input)
if [[ -x $tpl_input ]]; then
janet blog.janet --html $input | $tpl_input | ./ > $output
janet blog.janet --html $input | ./ > $output
function handle_rc {
set +e
$input > $output
if (( $? != 0 )); then
# failed: cleanup
rm -f $output
rm $input
set -e
if (( $# == 1 )); then
if [[ ! -f $file ]]; then
>&2 echo "file not found: $file"
exit 1
fpath=$(dirname $file)
fname=$(basename $file)
if [[ "$ext" == "gmi" ]]; then
handle_html $fpath $name
elif [[ "$ext" != "tpl" && -x "$file" ]]; then
handle_rc $fpath $name $ext
exit 0
echo "Initializing..."
if [[ -d "$out_dir" ]]; then
rm -rf "$out_dir"
cp -r files "$out_dir"
echo "Building..."
find "$out_dir" -type f -exec "$blog_sh" {} \;
echo "Cleaning up build..."
find "$out_dir" -name '*.tpl' -delete


@ -0,0 +1,17 @@
base_url = ""
compile_sass = false
build_search_index = true
theme = "gay gay homosexual gay"
# Blog stuff
title = ""
author = "Artémis <>"
generate_feed = true
feed_filename = "~blog/feed.xml"
highlight_code = true

files/index.gmi → content/

@ -1,5 +1,6 @@
# Aphrodite
title: Welcome
A personal adventure in the worlds of tech and kink, by a kinky software developer.
@ -12,15 +13,15 @@ A personal adventure in the worlds of tech and kink, by a kinky software develop
This blog contains random bits of NSFW (sexual or dark topics), so make sure you're safe before browsing it.
=> ~blog My personal blog
=> ~writings Stories I've written
=> ~notebook My notebook of recipes, projects, and documentations
=> ~resources Some resources and links I chose to share
=> about.gmi About me
* [My personal blog](@/~blog/
* [Stories I've written](@/~writings/
* [My notebook of recipes, projects, and documentations](@/~notebook/
* [Some resources and links I chose to share](@/~resources/
* [About me](@/
## Wanna help?
Most of my projects aren't really in an... "open-contribution shape" right now, which may make it hard for you to contribute to them.
If you'd still like to drop a token of appreciation, this page provides a few ways to donate a small token to me, and also includes a wishlist of stuff I'd really like to get soon, if you'd like to get me something nice.
=> wishlist.gmi The page containing my wishlist
* [The page containing my wishlist](@/

files/about.gmi → content/

@ -1,4 +1,6 @@
# About me
title: About me
I'm a backend developer by job, electrical hacking hobbyist and BDSM-invested tinkerer by passion.
I've always wanted to find a way to mix both worlds into one common interest, and after spending a lot of time trying to come up with a good way to do so, I decided to create this website as a way to group everything.
@ -10,8 +12,8 @@ I settled on the name after trying to think of a decent one, and I
* This is still also tech-oriented, and Aphrodite is described (in the odyssey) as the wife of Hephaestus, which is basically the god of engineering.
* The only tech-like top-level domaine I found was .dev, which kinda sucks because it's owned by a pretty shitty company (a.k.a. Google), but I haven't been able to find any alternative extension, and I think this one sounds nice.
=> About Aphrodite
=> About Hephaestus
* [About Aphrodite](
* [About Hephaestus](
Not only Aphrodite is an awesome name to bear, its story perfectly matches this website's theme!
@ -30,6 +32,6 @@ Now, it has a few more areas.
I'm active on a few platforms on which you may want to chat!
If you want to go through e-mail, any ad, spam, or abusive content will immediately end in an abuse report. If you otherwise just want to chat a bit, feel free to use it!
=> My mastodon account
=> My e-mail address
=> My telegram account
* [My mastodon account](
* [My e-mail address](
* [My telegram account](

files/robots.txt → content/robots.txt


@ -0,0 +1,56 @@
title: Wishlist
* [If you want to get me something from this list, please contact me using one of those methods.](@/
* [Si vous voulez me prendre un truc, contactez-moi en utilisant l'un des moyens listés ici.](@/
Otherwise, you can also give a financial donation by one of those platforms.
* [Liberapay](
* [Buy me a coffee](
I also have a Tether TRC20 address available below, for those who would like to avoid paying using their bank credentials.
TMKmJ114jDYAyxiocVroqVgXbekV86gnY7 (TRC20)
* All annotated prices are rounded up
* Tous les prix notés sont arrondis
## High-priority
* [DBX 286 X mic preamp: 159€](
* [StarTech VESA screen mount: 150€](
* [iiyama G-Master G2440HSU-B1 screen: 180€](
* [YubiKey 5 NFC: 45€](
## Medium-priority
* [Projecteur de chantier sur batterie: 35€](
### Storage server hardware: 375€
* [G-SKill 16GB DDR3-1600 CAS9: 112€](
* [SeaGate Barracuda 1TB: 50€](
* [SeaGate Barracuda 2TB: 60€](
* [StarTech PCI-E 4 SATA ports controller: 110€](
* [ICY BOX IB-2227StS disk bay: 43€](
## Random contributions
I would really appreciate some financial help for my tattoos, which would be whatever you want to give :3
If not, here's a list of random stuff I'd like to get.
* [Hexcorp tank top: 20€](
* [Metal Claws: £8](
* [100m solid-core nylon rope (you know what for ;3): 25€](
* [Zippo hand warmer: 29€](
* [SSD M.2 LDLC 120GB: 32€](
* [Manic Panic pale blue hair dye: 19€](
* [ICopy-XS Portable RFID cloning device: 375€](
* [Cryptosteel capsule solo: 89€](
* [Shodan member account: 49€ (to go through one of my donation platforms only, sadly, I must pay it myself)](
* [The Wayfarer book series, from Becky Chambers](

files/~blog/1-a-new-project.gmi → content/~blog/

@ -1,19 +1,27 @@
# A new project
title: A new project
date: 2020-06-19
A small introduction to this newly born blog.
<!-- more -->
I've maintained my first blog for what felt like decades, but looking back into its current published history, I can only see it going back to October of 2017...
Maybe at some point I decided to scrap everything and start it again, or maybe I lost some articles.
Keeping this first blog purely technical and as factual as possible was a kind of boring game, a game I still play from time to time when I actually have a good idea for an article.
What's a good article idea? Well, to me, a good article is one I actually want to write, usually about a topic that stays close to heart for me.
But there are so many others subjects I'd like to talk about, which I could not really do on this technical scene...
I used to hang out on the Tumblr scene, before its change of leadership, complete focus loss, and ultimately, complete breakdown, and that helped me meet some pretty cool people, mostly with some common interests.
At the time, I was not that invested in the kink world, more so in the tech world, as it was already my main area of expertise.
Still, time flows, and things change, and here I am, after going from platform to platform, ultimately deciding to put my thoughts in a new place, one I do control, which means no ads, no censorship, and a place I can grow and nurture in my image.
I hope to find in this blog a place to put my toughts, projects, passions, and to share them with anyone who may enjoy that content.
If, until, now, you do, well, welcome and have a nice day!

files/~blog/10-about-life.gmi → content/~blog/

@ -1,7 +1,14 @@
# About life
[CW:Anxiety,Depression] Times have been rough, but all the support I received from some people has helped me move forward again.
title: About life
- anxiety
- depression
date: 2020-07-26
Times have been rough, but all the support I received from some people has helped me move forward again.
<!-- more -->
I don't really recall ever having good memories. As far as I can remember, my memories were always clouded with a lot of emptiness and unease.
They still are, today, but I feel like transitioning, drawing, and spending lots of time opening myself to my own thoughts, feelings, helped me
@ -30,4 +37,4 @@ Giving out isn't easy when you're still ridden with social anxiety among other t
I don't really know how to give when even something as simple as meeting my all-around pretty nice neighbors for more than 30min or so will almost always trigger a pretty violent panic attack, this has also made going for groceries, or even meeting good friends very tough.
I failed to attend my girlfriend's birthday due to that, having to leave mid-meal because my instincts kicked in and alerted me of an incoming attack, and I cannot sleep in our room anymore because hearing faint voices outside is enough...
=> /media/10-about-life/2020-07-20-before-after-web.png This image shows two vastly different outlooks on life. The left part shows me, four years ago, submerged in depression and anxiety issues, among other things, while th right part shows me, as of today, on the road to recovery.
![This image shows two vastly different outlooks on life. The left part shows me, four years ago, submerged in depression and anxiety issues, among other things, while th right part shows me, as of today, on the road to recovery.](/media/10-about-life/2020-07-20-before-after-web.png)

files/~blog/11-gender-sex-body-attraction.gmi → content/~blog/

@ -1,7 +1,10 @@
# About gender, sex, and body attraction
title: About gender, sex, and body attraction
date: 2020-07-31
Some clarification.
<!-- more -->
I think too many people miss the point with gender, sex, and body attraction.

files/~blog/12-status-update-tech.gmi → content/~blog/

@ -1,7 +1,10 @@
# Status update & tech
title: Status update & tech
date: 2020-08-22
Got busy, dealt with some stuff, but oh hey, I'm still here apparently
<!-- more -->
So with my job and all that, I slowly started getting back into tech and coding.
Tried my hands at Django, I think I'm gonna stay on this for a while since PHP has horrendous development tools (xdebug is half-dead), Spring (in Java) has no serious documentation, and Elixir has no really working compatible IDE.

files/~blog/13-email-based-automation.gmi → content/~blog/

@ -1,7 +1,10 @@
# E-mail based automation
title: E-mail based automation
date: 2020-09-02
My first serious personal development project in a long time
<!-- more -->
I spend a lot of time using e-mail.

files/~blog/14-status-update-september.gmi → content/~blog/

@ -1,7 +1,10 @@
# Status update: september, basil, activitypub, and more
title: 'Status update: september, basil, activitypub, and more'
date: 2020-09-29
This last month has been filled with adventures around gardening, the ActivityPub protocol, and some first steps in rope bondage learning, here's a small thing on the topic
<!-- more -->
This month's been pretty long and filled with stuff.
@ -27,8 +30,9 @@ Also managed to snag a fallen succulent leaf from the ground, and managed to dev
So uh, garden-wise, I think I got it.
=> /media/14-status-update-september/basil-web.jpg A picture of my basil, post-care
=> /media/14-status-update-september/mint-web.jpg A picture of the mint
![A picture of my basil, post-care](/media/14-status-update-september/basil-web.jpg)
![A picture of the mint](/media/14-status-update-september/mint-web.jpg)

files/~blog/15-goodbye-devto.gmi → content/~blog/

@ -1,7 +1,10 @@
# Goodbye,
title: Goodbye,
date: 2020-12-22
Welp, today marks the day I deleted my account.
<!-- more -->
Been a mod for a while on it, but I ultimately dropped activity after being increasingly tired of seeing it *filled* with marketing and aggressive advertisement bullshit for which the other mods and comms managers seemed pretty comfortable with.

files/~blog/16-new-blog.gmi → content/~blog/

@ -1,7 +1,10 @@
# New blog
title: New blog
date: 2021-03-07
Gemini, JanetLisp as new builder, simpler HTML, ...
<!-- more -->
This blog has been running using a 60~ lines long bash script for a while, but while it worked pretty neatly, it was pretty hard for me to extend it.

files/~blog/17-gitmgr.gmi → content/~blog/

@ -1,4 +1,10 @@
# GitMgr: a tool to manage my bare-bones git repositories
title: 'GitMgr: a tool to manage my bare-bones git repositories'
date: 2021-04-18
So, basically, I got fed up with jumping from git host to git host, and never finding what I searched for, including simple automation and backup/moving stuff around.
<!-- more -->
So, basically, I got fed up with jumping from git host to git host, and never finding what I searched for, including simple automation and backup/moving stuff around.
@ -10,4 +16,4 @@ A few golang files, a bit of coding, and boom, I now have a first version rollin
I've got a few things I'd like to add next, including auto-generation of the clone URL on the page, but that can wait til later.
=> /~notebook/projects/gitmgr.gmi The project's presentation page
[The project's presentation page](/~notebook/projects/gitmgr)

files/~blog/19-self-hosting.gmi → content/~blog/

@ -1,12 +1,16 @@
# Self hosting
title: Self hosting
date: 2021-08-19
I have been bouncing here and there for a while for the hosting of my git repositories.
<!-- more -->
Ultimately, Github's and Atlassian's ethics have been a huge turn off for me, Gitlab's handling of privacy and slowness of UI has made me just stop using it, and alternatives were usually handled and hosted by techbros with... less than nice behaviours and political stances.
Until a few days ago, I hosted everything barebones on a small VPS, using gitweb as public browsing UI, and a software I made named Gitmgr to manage repositories (their names, categories, descriptions, etc).
=> /~notebook/projects/gitmgr.gmi GitMgr project page
[GitMgr project page](/~notebook/projects/gitmgr)
The biggest issue was how restricted it was on CI...
Sadly, I have a fair share of projects that needs CI, so it's been draining me to not have that.

files/~blog/2-madness-that-is-tech.gmi → content/~blog/

@ -1,8 +1,11 @@
# Madness that is tech
title: Madness that is tech
date: 2020-06-20
The tech world is in an awful state, where everything is made for money and no one cares for their job anymore.
This is mostly a rant, as an engineer that still tries to care in the middle of this maelstorm of shit.
<!-- more -->
I'm tired of tech. I feel like we're living in a world where we try to make everything faster, bigger, "more complete", yet I feel like we're failing to do so. But just as fast.

files/~blog/20-once-upon-a-time-a-bank.gmi → content/~blog/

@ -1,8 +1,11 @@
# Once upon a time, a bank...
title: Once upon a time, a bank...
date: 2021-10-02
Artemis needs a bank.
Banks don't like Artemis.
<!-- more -->
I got a new job.
For this job, I needed a bank account.
@ -27,7 +30,7 @@ I started the usual way: by asking around.
A friend of mine provided me with a link that allowed me to see a "moral score" (read "ethical score") of lots of french banks.
This is where I started, trying to get a general idea of all the ones to avoid.
=> [French link] Grading of most france-"compatible" banks based on ethical criteria, obviously almost all banks are shit.
[[French link] Grading of most france-"compatible" banks based on ethical criteria, obviously almost all banks are shit.](
I started going through them, one by one, to try to see if I could get an account going.

files/~blog/21-hexcorp-chair-project.gmi → content/~blog/

@ -1,8 +1,14 @@
# [CW:dronekink] Hexcorp chair decoration project
title: Hexcorp chair decoration project
date: 2021-11-26
- dronekink
I'm an idiot.
A resourceful idiot.
<!-- more -->
I recently changed my chair for a pretty basic ikea one (a Markus one, specifically).
It comes with a mesh-like back that's relatively transparent.
@ -11,12 +17,10 @@ I don't know why, I don't know when, but I suddenly felt compelled to mod it a b
Obviously, this logo has to be lit up in a deep pink-purple color.
I used some purple electro-luminescent light ribbon found on some chinese marketplace (link to it below), some string and hand-sewing, and some black electrical tape to hide the excess.
I used some [purple electro-luminescent light ribbon found on some chinese marketplace]( (EL wire, around 5$ each), some string and hand-sewing, and some black electrical tape to hide the excess.
For reference, I exclusively used a buttonhole stitch for holding the ribbon, as it's been the easiest and sturdiest for me when I needed to stitch something thick on some fabric.
=> EL wire, around 5$ each
I was lucky, since I purchased this EL ribbon to have it under hand for my sewing projects in case I wanted to play with some more... cyber/neon aesthetics, but I didn't yet encounter any idea I wanted to implement, so it was laying around.
I haven't tried it in the dark, but it already shows as a faint but present glow in the light of my room.
@ -29,41 +33,41 @@ This build will be mostly shown in images, with a short description. I won't go
> For those who follow me on Mastodon, yes, this article is pretty much a more detailed thread on the build.
=> /media/21-hexcorp-chair-project/1-web.jpg An ikea chair, with a hexcorp logo blueprint and neon purple EL ribbon sitting on it
![An ikea chair, with a hexcorp logo blueprint and neon purple EL ribbon sitting on it](/media/21-hexcorp-chair-project/1-web.jpg)
I started by unscrewing the back of the chair, which forced me to unscrew the whole plate so I used my drill to quickly remove everything.
Then I unzipped it from the bottom of the chair, and it slid off pretty easily.
=> /media/21-hexcorp-chair-project/2-web.jpg The back of the chair, in the process of having its main plate unscrewed
![The back of the chair, in the process of having its main plate unscrewed](/media/21-hexcorp-chair-project/2-web.jpg)
I struggled a bit with flipping the back up to work on its inside, but managed to make it lay flat after a bit of a fight.
This allowed me to trace the pattern on the fabric using a white drawing chalk I had laying around; this makes for a much easier work than using the paper itself as stencil.
=> /media/21-hexcorp-chair-project/3-web.jpg The hexcorp logo, imprinted on the chair using some white chalk
![The hexcorp logo, imprinted on the chair using some white chalk](/media/21-hexcorp-chair-project/3-web.jpg)
The first stitches were very painful to do due to the width of the wire; I had nothing to hold it in place, so I required a few tries to properly tie it at the end.
I'm also still not used to doing end stitches by hand, so I took some time to properly tie it up.
=> /media/21-hexcorp-chair-project/4-web.jpg Sewing starting, the ribbon is following the chalk pattern
![Sewing starting, the ribbon is following the chalk pattern](/media/21-hexcorp-chair-project/4-web.jpg)
Once I got myself a wooden plank inside, I had a huge boost as it was much more comfortable to work on, especially with my floodlight showing everything clearly.
This has allowed me to progress to around a third of the work before I needed to re-spool it as I didn't have any thread left.
=> /media/21-hexcorp-chair-project/5-web.jpg A more advanced step, showing around two thirds of the logo being sewn
![A more advanced step, showing around two thirds of the logo being sewn](/media/21-hexcorp-chair-project/5-web.jpg)
Once the sewing was done, I plugged in the battery to make sure everything was working fine, I was a bit afraid of putting too much tension on the sharp corners inside the logo, but it appears to work fine.
=> /media/21-hexcorp-chair-project/6-web.jpg Sewing finished, so I did a test light-up to see how it looked like
![Sewing finished, so I did a test light-up to see how it looked like](/media/21-hexcorp-chair-project/6-web.jpg)
Some wet rag and a few swipes later, the back of the chair is now looking pretty clean for the inside.
I also took the time to cover the excess ribbon using some electric tape to hide it.
There is a lot more unused ribbon, which I will probably use to draw my symbol under the logo, but this will be left for another time, as I was really sick, and tired at this point.
=> /media/21-hexcorp-chair-project/7-web.jpg The chalk has been cleaned up, leaving a pretty clean purple ribbon with its extra end taped in black electric tape
![The chalk has been cleaned up, leaving a pretty clean purple ribbon with its extra end taped in black electric tape](/media/21-hexcorp-chair-project/7-web.jpg)
Putting up the back cover on the frame was a real pain, the lower part is stretched very thin and was hard to close by hand, so I had to improvise by using some wire to move the zipper closed.
I screwed everything back using the drill for most of the work, finishing the last efforts using my wrench to properly tighten it, then M helped me with fitting it on the rest of the chair again.
=> /media/21-hexcorp-chair-project/8-web.jpg The finished and lit-up result, my chair resting close to my desk
![The finished and lit-up result, my chair resting close to my desk](/media/21-hexcorp-chair-project/8-web.jpg)
What started as a random dumb project came out great, and even if I've been really sick those past days, I feel pretty proud of this result.

files/~blog/3-so-long.gmi → content/~blog/

@ -1,7 +1,15 @@
# So long
title: So long
date: 2020-06-21
- depression
- kinks
- D/s
Time is slow to pass, that sucks.
<!-- more -->
Sometimes, I wonder why I even try to keep appearances, like talking to people, showing up to work, or finishing my diploma I have no care for anyways.
I've always been good with tech and stuff, maybe because thats the only way I can spend half a day not talking with anyone and be able to create something.

files/~blog/4-drawing-training.gmi → content/~blog/

@ -1,7 +1,10 @@
# Drawing training
title: Drawing training
date: 2020-06-22
Pas motivated me to get back into drawing and gave me a few tips and youtube channels, so here I am, trying to start drawing again, and keeping this as a note on my blog.
<!-- more -->
So uh, I've always loved to get myself into drawing, but drowned by the techniques, styles, tools, and with a sort of lack of ideas, I kinda burned out before having the time to at least get the hang of some tips.
But I chatted a bit with the awesome Pas on their stream today, and they gave me some tips, resources, and encouragement, so I dug out my old drawing tablet from my stuff storage, and decided to try to re-learn the basics.
@ -18,4 +21,4 @@ I got the hang of some of them, but most (especially circles, and hand-eye coord
Edit: finally managed to make a not-so-small decent circle.
=> /media/4-drawing-training/circle.png A drawing of a pretty slick-looking circle
![A drawing of a pretty slick-looking circle](/media/4-drawing-training/circle.png)

files/~blog/5-drawing-aaah.gmi → content/~blog/

@ -1,7 +1,10 @@
# Drawing, aaah
title: Drawing, aaah
date: 2020-06-23
Been sketching some training things for 6h straight help me
<!-- more -->
Someone should've told me about the addictive effect of drawing, guys. I've been drawing for like 5 to 6h straight before noticing time.
@ -9,4 +12,4 @@ On another note, I managed to dig out two tablets I got for free at some point.
For reference, the bamboo tablet is a Bamboo CTL-470, and the huion is H610Pro.
=> /media/5-drawing-aaah/tablets-small.jpg An image displaying the two tablets one above the other one
![An image displaying the two tablets one above the other one](/media/5-drawing-aaah/tablets-small.jpg)

files/~blog/6-drawing-hiatus.gmi → content/~blog/

@ -1,7 +1,10 @@
# On hiatus for drawing
title: On hiatus for drawing
date: 2020-06-25
I've been drawing almost non-stop for the last several days, which might explain my loss of activity in most of the projects I maintain
<!-- more -->
So, I started drawing 4 days ago now, and I must really say that I've fallen in love with that.
I've taken a break for the ever-exhausting world of tech to take care of myself, and spend quite some time (around 25h now) drawing, and learning.
@ -11,6 +14,8 @@ It's pretty peaceful and relaxing compared to tech, I must say. Even mistakes an
Those are a few training sketches I made to get my hand on 1-point, 2-point, and 3-point, perspective.
=> /media/6-drawing-hiatus/1-small.jpg One-point perspective showing a man on a road, under an upper bridge
=> /media/6-drawing-hiatus/2-small.jpg Two-point perspective showing some kind of futurist scenery
=> /media/6-drawing-hiatus/3-small.jpg Three-point perspective of a building, from its base
![One-point perspective showing a man on a road, under an upper bridge](/media/6-drawing-hiatus/1-small.jpg)
![Two-point perspective showing some kind of futurist scenery](/media/6-drawing-hiatus/2-small.jpg)
![Three-point perspective of a building, from its base](/media/6-drawing-hiatus/3-small.jpg)

files/~blog/7-existing.gmi → content/~blog/

@ -1,6 +1,9 @@
# Existing
Content warning: violence.
title: Existing
date: 2020-07-04
- violence
Yet another case of a company banning a user for completely unrelated matters.

files/~blog/8-bdsm-section.gmi → content/~blog/

@ -1,7 +1,10 @@
# New BDSM section
title: New BDSM section
date: 2020-07-06
I created a new section on my blog, feel free to propose contributions.
<!-- more -->
Since starting to transition, I've been able to get myself back to health mentally, which greatly helped me open myself on my own thoughts, persona, needs, and yknow, passions.
One of those developments was into BDSM, which - btw - really helped me with my panic attacks and depression periods.
@ -11,4 +14,4 @@ I decided to create a new section on this blog to document resources, thoughts,
The introduction and index to it is now available from the home page, but here it is, for simplicity's sake.
=> /TODO Index of the BDSM section
[Index of the BDSM section](@/~notebook/

files/~blog/9-updates.gmi → content/~blog/

@ -1,7 +1,10 @@
# Updates
title: Updates
date: 2020-07-14
Some life-related updates.
<!-- more -->
After a month-long coding hiatus, I had to get back into "the zone" because I had two servers to migrate.
All things said and done, I'm quite happy I managed to clear that out of the way, I now have a nicer, cleaner, and much more stable setup, finally publishing the new UI and version for Paste, self-hosting this little blog, among other things.
@ -22,5 +25,6 @@ Two late-night sketches, the first one is a bit fucked up as it was my first-eve
=> /media/9-updates/first.jpg A first drawing, a few eye placement issues and the chest looks a bit off
=> /media/9-updates/second.jpg A second drawing, her left shoulder is a bit too low and dropping, but I'm really proud of the shading
![A first drawing, a few eye placement issues and the chest looks a bit off](/media/9-updates/first.jpg)
![A second drawing, her left shoulder is a bit too low and dropping, but I'm really proud of the shading](/media/9-updates/second.jpg)


@ -0,0 +1,10 @@
title: Blog
template: blog.html
sort_by: date
My personal blog, about my life, and pretty much whichever topic I choose to write on.
Images are served over Gemini with the appropriate mimetype.
* [Blog's RSS feed](/~blog/feed.xml)


@ -0,0 +1,43 @@
title: Notebook
Some personal notes and info documents I wrote.
## Recipes
Some cooking recipes I usually make.
* Thermomix-based recipes
* [Milkshake](@/~notebook/recipes/thermomix/
* [Banana pancakes](@/~notebook/recipes/
* [Chicken cream curry](@/~notebook/recipes/
* [Chocolate fudge](@/~notebook/recipes/
* [Cookies](@/~notebook/recipes/
* [Crepe dough](@/~notebook/recipes/
* [Gyoza wrappers](@/~notebook/recipes/
* [Gyoza](@/~notebook/recipes/
* [Pizza](@/~notebook/recipes/
* [Beignets](@/~notebook/recipes/
* [Sablés](@/~notebook/recipes/
* [Glaçage](@/~notebook/recipes/
* [Crème vanille](@/~notebook/recipes/
## Projects
Project info pages for some of my projects.
* [GitMgr: small task automation and simplification tool for bare-bones git hosting.](@/~notebook/projects/
## Tools
Usage notes for some (mostly) linux-based tools I use.
* [sc: a simple spreadsheet tool](@/~notebook/tech/tools/
* [Wireguard VPN](@/~notebook/tech/tools/
Some BDSM-related resources I chose to collect together.
* [Everything related to rope bondage and shibari](@/~notebook/bdsm/

files/~notebook/bdsm/rope-bondage.gmi → content/~notebook/bdsm/

@ -1,4 +1,6 @@
# Rope bondage-related resources
title: Rope bondage-related resources
Rope bondage is awesome, pretty, and hella relaxing, but it can be dangerous and hard to master.
@ -11,44 +13,45 @@ Have fun and stay safe~
The well-known Two knotty boys have a solid place in this world.
They wrote two books, and produced a lot of videos, available for free on their website.
=> The Two Knotty Boys official website, linking to their two books and videos.
[The Two Knotty Boys official website, linking to their two books and videos.](
I do own the two books, and they are a great companion to have under the hand while playing around!
Crash Restraint is a pretty cool video series touching lots of things in the world of rope bondage, their site is definitely worth checking out.
They produce course videos, performance, demos, and much more!
=> The Crash Restraint official website.
[The Crash Restraint official website.](
Esinem Rope is a rope bondage shop containing some extra resources around rope care and maintenance.
=> Their rope choice and care section.
[Their rope choice and care section.](
I also recently learned about the apparently pretty popular (must be living under a rock) The Duchy, lots of SFW educational material around rope bondage.
=> Their official website
[TheDuchy's official website](
This subreddit seems to contain some decent resources and inspirations, and to be pretty active.
=> r/ShibariTutorials on reddit
[r/ShibariTutorials on reddit](
This website provides a "learning course" planned for around a year of work, going over lots of topics including health-related topics (physical and mental).
=> Rope365
## Artists
Some artists listed here are well-versed in this world and produce some pretty cool content.
=> Cam damage, a pretty cool nude/shibari model
[Cam damage, a very cool nude/shibari model](
## Products
Some products I have personally chosen to buy and test, and approve.
=> Some glow-in-the-dark, because it's always fun to play in the dark~
=> I got some wet-treated jute rope from the Esinem rope website, can only recommend it. Jute is raw but leaves pretty marks on the body.
* [Some glow-in-the-dark, because it's always fun to play in the dark~](
* [I got some wet-treated jute rope from the Esinem rope website, can only recommend it. Jute is raw but leaves pretty marks on the body.](

files/~notebook/projects/gitmgr.gmi → content/~notebook/projects/

@ -1,15 +1,18 @@
# gitmgr
title: gitmgr
> Small task automation and simplification tool for bare-bones git hosting.
This project is made to provide a web-based interface to manage barebones git repositories.
=>;a=summary Source code repository
[Source code repository](;a=summary)
## Screenshots
=> /media/notebook/gitmgr.1.png Main project menu
=> /media/notebook/gitmgr.2.png Project edition page
![Main project menu](/media/notebook/gitmgr.1.png)
![Project edition page](/media/notebook/gitmgr.2.png)
## Configuration
@ -39,7 +42,7 @@ Here are the packaged releases, with their changelogs and archive download links
* Fixed head version selection
=> GitMgr 1.7.1 Linux amd64, stripped (.tar.gz)
[GitMgr 1.7.1 Linux amd64, stripped (.tar.gz)](
### 1.7 (AGPLv3)
@ -51,7 +54,7 @@ Here are the packaged releases, with their changelogs and archive download links
* Added forge title customization
* LGBT+ rights!
=> GitMgr 1.7 Linux amd64, stripped (.tar.gz)
[GitMgr 1.7 Linux amd64, stripped (.tar.gz)](
### 1.6 (AGPLv3)
@ -59,20 +62,20 @@ Here are the packaged releases, with their changelogs and archive download links
* Generating the clone URL on init
* Fixed umask in service file for world-readable clones
=> GitMgr 1.6 Linux amd64, stripped (.tar.gz)
[GitMgr 1.6 Linux amd64, stripped (.tar.gz)](
### 1.5 (AGPLv3)
* Default branch support
* Default branch switching
=> GitMgr 1.5 Linux amd64, stripped (.tar.gz)
[GitMgr 1.5 Linux amd64, stripped (.tar.gz)](
### 1.4 (AGPLv3)
* Url prefix support
=> GitMgr 1.4 Linux amd64, stripped (.tar.gz)
[GitMgr 1.4 Linux amd64, stripped (.tar.gz)](
### 1.3 (AGPLv3)
@ -80,7 +83,7 @@ Here are the packaged releases, with their changelogs and archive download links
* Shutdown error handling fixed
* Ignoring dot dirs (e.g. `.ssh`)
=> GitMgr 1.3 Linux amd64, stripped (.tar.gz)
[GitMgr 1.3 Linux amd64, stripped (.tar.gz)](
### 1.2 (AGPLv3)
@ -89,7 +92,7 @@ Here are the packaged releases, with their changelogs and archive download links
* Proper logging
* Graceful request termination upon shutdown (may not be very graceful if a clone operation is being done during shutdown)
=> GitMgr 1.2 Linux amd64, stripped (.tar.gz)
[GitMgr 1.2 Linux amd64, stripped (.tar.gz)](
### 1.1 (AGPLv3)
@ -99,7 +102,7 @@ Small feature addition + old glib build.
* Changed the default socket file from `/var/run/gitmgr.sock` to `/run/gitmgr.sock`
* Added auto-generation of `cloneurl` files
=> GitMgr 1.1 Linux amd64, stripped (.tar.gz)
[GitMgr 1.1 Linux amd64, stripped (.tar.gz)](
### 1.0 (AGPLv3)
@ -109,4 +112,4 @@ Base release.
* Environment-based configuration
* Example systemd unit file
=> GitMgr 1.0 Linux amd64, stripped (.tar.gz)
[GitMgr 1.0 Linux amd64, stripped (.tar.gz)](

files/~notebook/recipes/banana-pancakes.gmi → content/~notebook/recipes/

@ -1,4 +1,6 @@
# Banana pancakes
title: Banana pancakes
## Ingredients

files/~notebook/recipes/beignets.gmi → content/~notebook/recipes/

@ -1,4 +1,6 @@
# Beignets
title: Beignets
## Ingrédients

files/~notebook/recipes/chicken-cream-curry.gmi → content/~notebook/recipes/

@ -1,4 +1,6 @@
# Chicken-cream curry
title: Chicken-cream curry
## Ingredients and tools

files/~notebook/recipes/chocolate-fudge.gmi → content/~notebook/recipes/

@ -1,4 +1,6 @@
# Chocolate fudge
title: Chocolate fudge
## Ingredients and tools

files/~notebook/recipes/cookies.gmi → content/~notebook/recipes/

@ -1,4 +1,6 @@
# Cookies
title: Cookies
## Ingredients and tools

files/~notebook/recipes/creme-vanille.gmi → content/~notebook/recipes/

@ -1,4 +1,6 @@
# Crème vanille
title: Crème vanille
Pas encore testé, devrait bien accompagner les fruits / glaces / cafés.

files/~notebook/recipes/crepe-dough.gmi → content/~notebook/recipes/

@ -1,4 +1,6 @@
# Crepe dough
title: Crepe dough
## Ingredients

files/~notebook/recipes/glacage.gmi → content/~notebook/recipes/

@ -1,4 +1,6 @@
# Glaçage
title: Glaçage
Je l'utilise pour les sablés et autres biscuits secs.
Pour colorer, il suffit d'ajouter quelques gouttes de colorant alimentaire ou de sirop (attention au goût).

files/~notebook/recipes/gyoza-wrappers.gmi → content/~notebook/recipes/

@ -1,8 +1,10 @@
# Gyoza wrappers
title: Gyoza wrappers
A simple recipe to make gyoza wrappers in a simple and quick way.
=> Recipe source
[Recipe source](
## Ingredients and tools

files/~notebook/recipes/gyoza.gmi → content/~notebook/recipes/

@ -1,9 +1,11 @@
# Gyoza
title: Gyoza
Gyoza based on wrappers and some custom filling.
=> gyoza-wrappers.gmi Gyoza wrappers recipe
=> Recipe source
* [Gyoza wrappers recipe](@/~notebook/recipes/
* [Recipe source](
## Ingredients and tools

files/~notebook/recipes/pizza.gmi → content/~notebook/recipes/

@ -1,4 +1,6 @@
# Homemade pizzas
title: Homemade pizzas
## Preparing the yeast

files/~notebook/recipes/sables.gmi → content/~notebook/recipes/

@ -1,4 +1,6 @@
# Sablés
title: Sablés
## Ingrédients

files/~notebook/recipes/thermomix/fr-fruit-milkshake.gmi → content/~notebook/recipes/thermomix/

@ -1,4 +1,6 @@
# Milkshake
title: Milkshake
## Ingrédients

files/~notebook/tech/cisco-switch-cheatsheet.gmi → content/~notebook/tech/

@ -1,4 +1,6 @@
# Cisco switch cheatsheet
title: Cisco switch cheatsheet
As the owner of a clunky ol' Cisco Catalyst 2950, and as a *DEFINITELY NOT* net admin, I decided to fiddle a bit more, both as a way to learn about networking (and cisco-based management) and as a way to optimize my current home network.
Since the interface has some "strange" (to me) naming conventions and choices, I chose to document "usual" operations here, for later reference.
@ -29,7 +31,7 @@ Once logged in, to `su` to gain elevated privileges, the `enable` command is use
The command `enable secret` allows to set the password of `enable`.
However, type 5 and 7 secrets are broken, and shouldn't be used if possible (replaced by type 8 and 9 if available).
=> Security issues & demo of type 5 and 7 secrets
[Security issues & demo of type 5 and 7 secrets](
### Setting the base network configuration

files/~notebook/tech/ios/development.gmi → content/~notebook/tech/ios/

@ -1,4 +1,6 @@
# iOS app development
title: iOS app development
I'm trying to extend the life of my iPad 1, which means developing some specialized tool sets.
For this purpose, I'm trying to reach one of the following goals.
@ -7,7 +9,7 @@ For this purpose, I'm trying to reach one of the following goals.
* Use the Theos toolchain to build native apps from my Linux environment
* Find some Cydia-installed interpreters and tools that would allow me to build apps using some preinstalled runtime and a scripting language (such as Lua, Ruby, Python, or Javascript)
=> The Theos toolchain project wiki
[The Theos toolchain project wiki](
## Theos on ArchLinux

files/~notebook/tech/tools/sc.gmi → content/~notebook/tech/tools/

@ -1,8 +1,10 @@
# spreadsheets
title: spreadsheets
I use the sc tool for spreadsheets needs.
=>!INDEX.html sc official website
[sc official website](!INDEX.html)
It isn't the most powerful or versatile tool, but it gets the spreadsheets job right.

files/~notebook/tech/tools/wireguard.gmi → content/~notebook/tech/tools/

@ -1,4 +1,6 @@
# Wireguard management
title: Wireguard management
## Foreword
@ -27,7 +29,7 @@ For shell examples, every shell block will start with `# <server>`, where `<serv
From the debian wiki, we have those steps to run to add the wireguard repositories to our cache of available packages, then to install the wireguard dependencies (`wireguard` will install `wireguard-dkms` and `wireguard-tools`).
=> Debian wiki on Wireguard
[Debian wiki on Wireguard](

files/~resources/index.gmi → content/~resources/

@ -1,4 +1,6 @@
# References
title: References
This section documents some resources I found interesting / worth sharing on the web.
@ -8,47 +10,47 @@ This section documents some resources I found interesting / worth sharing on the
A website *filled* with recommendations and resources for all kinds and aspects of transitioning.
=> Official website
[Official website](
### Trans Posé.e.s
A french support group and information center about trans care and laws in France, which greatly helped me with the social aspect of my transition!
They also are a very active developer community, and built the TransPay self-hosted donation service, available for free.
=> https://transposé TransPosé.e.s main website
=> legal help in the workspace
=> travelling in planes
=> TransPay service
* [TransPosé.e.s main website](https://transposé
* [legal help in the workspace](
* [travelling in planes](
* [TransPay service](
### BDDTrans
A public database of French trans-safe healthcare and legal workers, to help you and assist you in your life and your transition.
=> Official website
[Official website](
### Body Feminization Workouts for Trans-Women and Femmes
If we ignore the stingy website look, they actually offer some pretty neat and sound exercises and tips on home workouts for shaping your body; mainly for MTF people.
=> Article's website
[Article's website](
### Chloe Ting - Workout
Another very good and resourceful self-workout-oriented website, for everyone!
=> Official website
[Official website](
### Voice training guide
A pretty complete and cohesive guide to help you train your own voice in a safe way.
=> Link to google docs document
[Link to google docs document](
### [FR] Guide pour la féminisation de la voix
Ce lien contient pas mal d'infos assez sérieuses sur le sujet, et fournit des ressources (notamment sous la forme de guides) pour permettre aux personnes de commencer à travailler ça sans l'assistance d'un personnel médical quelconque.
=> Voix Transfem
[Voix Transfem](
## Bloggers, writers, artists, etc.
@ -56,25 +58,25 @@ Ce lien contient pas mal d'infos assez sérieuses sur le sujet, et fournit des r
A very nice NSFW artist and game developer, with a lot of cute art.
=> Official blog
[Official blog](
### Pas
An awesome digital artist with *a ton* of very cute LGBT-oriented art.
=> Pixiv page
=> Twitter page
* [Pixiv page](
* [Twitter page](
### Vyr
A writer who creates great and well-written stories, and a very nice person to talk with.
Definitely worth the read if you want to dream about a D/s lifestyle.
=> Official blog, containing most stories
=> Mastodon page
* [Official blog, containing most stories](
* [Mastodon page](
### Doll joints dot click
Another ero writer, about robots and hypno.
=> Official blog, containing all stories
[Official blog, containing all stories](


@ -0,0 +1,11 @@
title: Writings
template: writings.html
sort_by: date
I like creating.
One of the mediums I found to fit my tastes and needs is writing.
I'm still new to it, but eager to learn and to get better.
Below are the stories I wrote and chose to share.

files/~writings/daily-works/2021-03-28.gmi → content/~writings/daily_works/

@ -1,10 +1,17 @@
# Outline
date: 2021-03-28
title: Claimed
- d/s
- ownership
- noncon
You got bought by your Mistress more than a week ago.
You're not used to being pampered,
but learn to trust Her more as she explains you your place.
# Writing
<!-- more -->
You took longer than before to notice the low, thumming, tick of the clock.
Still one more hour to fly by before you'll both leave home, going back again to this mall your numerous previous visits have gotten you accoustumed to.

files/~writings/daily-works/2021-03-29.gmi → content/~writings/daily_works/

@ -1,8 +1,14 @@
# Outline
date: 2021-03-29
title: Cuddles under the rain
- d/s
- nonsexual
An afternoon of cuddles under the rain.
# Writing
<!-- more -->

files/~writings/daily-works/2021-03-30.gmi → content/~writings/daily_works/

@ -1,9 +1,14 @@
# Outline
date: 2021-03-30
title: Diving
- anxiety
You come from work, a busy city filled with noise and anxiety.
To not overwhelm yourself, you put your headset on and you dive.
# Writing
<!-- more -->