<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title>General Blog</title><id>https://www.charlotte-thomas.me/blog/</id><updated>2026-01-02T00:00:00+00:00</updated><author><name>Charlotte Thomas</name><uri>https://www.charlotte-thomas.me</uri></author><generator uri="https://github.com/SabrinaJewson/sabrinajewson.github.io">sabrinajewson.github.io</generator><icon>https://www.charlotte-thomas.me/apple-touch-icon.png</icon><link href="https://www.charlotte-thomas.me/blog/feed.xml" rel="self" type="application/atom+xml"/><link href="https://www.charlotte-thomas.me/blog/" rel="alternate" type="text/html"/><entry><title>Happy New Year</title><id>https://www.charlotte-thomas.me/blog/new_year</id><updated>2026-01-02T00:00:00+00:00</updated><link href="https://www.charlotte-thomas.me/blog/new_year" rel="alternate" type="text/html" title="Happy New Year"/><published>2026-01-02T00:00:00+00:00</published><content xml:base="https://www.charlotte-thomas.me/blog/new_year" type="html">&lt;h2 id=&apos;2026&apos;&gt;&lt;a href=&apos;#2026&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;It’s 2026&lt;/h2&gt;&lt;p&gt;The new year is upon us. It’s 2026, it will be an important year for me, a lot will happen health-wise, which I hope will help my chronic pain. &lt;/p&gt;&lt;p&gt;I didn’t explain a lot about my disabilities here, but I have chronic pain and chronic fatigue (CFS). Among other things. &lt;/p&gt;&lt;p&gt;It killed my academic career and forced me to find a job at the end of my bachelor’s degree, but I accepted it and I’m happy with how it turned out. &lt;/p&gt;&lt;h2 id=&apos;health&apos;&gt;&lt;a href=&apos;#health&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Year of Health&lt;/h2&gt;&lt;p&gt;I remember CGP Gray’s videos on new year’s wishes. I kind of agree, and in his spirit I think the main topic of 2026 will be Health.&lt;/p&gt;&lt;p&gt;I need to take care of myself, I learned that the hard way on the past few months. &lt;/p&gt;&lt;h2 id=&apos;goingout&apos;&gt;&lt;a href=&apos;#goingout&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Year of… Going out?&lt;/h2&gt;&lt;p&gt;I don’t want my year to be all about health though, I’m approaching medical burnout. &lt;/p&gt;&lt;p&gt;And for external problems I decided I needed friends, and potentially a partner. Thus I decided to go out more. &lt;/p&gt;&lt;p&gt;Some weeks I’ll go out to a meeting of queer people, some weeks I’ll try to go out in quiet bars, some weeks I’ll just rest at home. &lt;/p&gt;&lt;p&gt;I also want to find a TTRPG group I can join.&lt;/p&gt;&lt;h2 id=&apos;afterwords&apos;&gt;&lt;a href=&apos;#afterwords&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Afterwords&lt;/h2&gt;&lt;p&gt;Happy New Year everyone! May 2026 bring happiness on you. &lt;/p&gt;&lt;p&gt;I hope I’ll have a good year, I think I’m gonna have a good year, well I’m mostly hoping. &lt;/p&gt;&lt;p&gt;Best wishes,  Cheers,&lt;/p&gt;&lt;p&gt;Charlotte Thomas.&lt;/p&gt;</content></entry><entry><title>Services (The Third Time)</title><id>https://www.charlotte-thomas.me/blog/new_server</id><updated>2025-12-14T00:00:00+00:00</updated><link href="https://www.charlotte-thomas.me/blog/new_server" rel="alternate" type="text/html" title="Services (The Third Time)"/><published>2025-12-14T00:00:00+00:00</published><content xml:base="https://www.charlotte-thomas.me/blog/new_server" type="html">&lt;p&gt;This is an update to my &lt;em&gt;services&lt;/em&gt; articles.&lt;/p&gt;&lt;h2 id=&apos;baremetal&apos;&gt;&lt;a href=&apos;#baremetal&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Baremetal infrastructure&lt;/h2&gt;&lt;p&gt;My main infrastructure is now hosted on one small server in my living room, connected to a UPS.&lt;/p&gt;&lt;p&gt;This server (name &lt;em&gt;starbaseone&lt;/em&gt;) is a modified M5 PLUS box, with the following specifications&lt;/p&gt;&lt;ul&gt;&lt;li&gt;AMD Ryzen 7 5825U 8C-16T (4.55GHz)&lt;/li&gt;&lt;li&gt;32 GB of DDR4 RAM&lt;/li&gt;&lt;li&gt;512 GB of NVME SSD storage&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I installed Proxmox VE on it and created two VMs&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Galaxy&lt;/em&gt; which like its namesake is the replacement of &lt;em&gt;Ambassador&lt;/em&gt;&lt;ul&gt;&lt;li&gt;With 8 threads; 16GiB of RAM; and 256GB of storage&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;Daystrom&lt;/em&gt; which is a internal network only VM made to run Home Assistant.&lt;ul&gt;&lt;li&gt;With 2 threads; 4GiB of RAM; and 32GB of storage&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;vps&apos;&gt;&lt;a href=&apos;#vps&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;VPS Infrastructure&lt;/h2&gt;&lt;p&gt;I run on &lt;em&gt;Galaxy&lt;/em&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A &lt;a href=&apos;https://git.charlotte-thomas.me/&apos;&gt;Git Forge&lt;/a&gt; as well as a runner&lt;/li&gt;&lt;li&gt;An instance of &lt;a href=&apos;https://client.faefox.dev&apos;&gt;Cinny (matrix client)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://cloud.faefox.dev&apos;&gt;NextCloud Instance&lt;/a&gt; (you can request an account by email)&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://auth.faefox.dev&apos;&gt;LLDAP Instance&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://meet.tutorat.me&apos;&gt;Jitsi Instance&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://sso.faefox.dev&apos;&gt;Tinyauth server&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://whiteboard.faefox.dev&apos;&gt;Whiteboard&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://xmpp.faefox.dev&apos;&gt;XMPP instance&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://faefox.dev&apos;&gt;Matrix homeserver&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://maloja.faefox.dev&apos;&gt;Maloja instance&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Then on &lt;em&gt;Daystrom&lt;/em&gt; there is the &lt;a href=&apos;https://home-assistant.io&apos;&gt;Home Assistant&lt;/a&gt; instance of the flat.&lt;/p&gt;&lt;h2 id=&apos;backup&apos;&gt;&lt;a href=&apos;#backup&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Backups&lt;/h2&gt;&lt;p&gt;Backups are made each day at T0400 Europe/Paris on a S3-compatible bucket.&lt;/p&gt;&lt;p&gt;For the data to completely disappear it would need an explosion of some sort in Rennes, and a nuke in Europe on the Hetzner glacier.&lt;/p&gt;&lt;p&gt;I thus decided that we were sufficiently secured, of course if a nuke is launched on France, I might very well die, which mean the fact the data is safe is not very important anymore, because I’d be dead. But so is life you know.&lt;/p&gt;&lt;h2 id=&apos;hostnames&apos;&gt;&lt;a href=&apos;#hostnames&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Hostnames&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;My personal laptop is &lt;em&gt;Defiant&lt;/em&gt; (because it’s tough, and little)&lt;/li&gt;&lt;li&gt;My personal phone is &lt;em&gt;Danube-II&lt;/em&gt; (I replaced my trusty &lt;em&gt;S21&lt;/em&gt; by a &lt;em&gt;S24 FE&lt;/em&gt;)&lt;/li&gt;&lt;li&gt;My NAS is &lt;em&gt;Olympic&lt;/em&gt;&lt;/li&gt;&lt;li&gt;My baremetal server is &lt;em&gt;StarbaseOne&lt;/em&gt;&lt;/li&gt;&lt;li&gt;VPSes are:&lt;ul&gt;&lt;li&gt;&lt;em&gt;Galaxy&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;Daystrom&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;future&apos;&gt;&lt;a href=&apos;#future&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Plans for the future&lt;/h2&gt;&lt;p&gt;Now that I have a good server, I might add another node to the PVE, but future money will go towards getting/constructing a modern NAS. With the following specifications&lt;/p&gt;&lt;ul&gt;&lt;li&gt;5 Bays&lt;/li&gt;&lt;li&gt;5x8TB NAS Hard Drive&lt;/li&gt;&lt;li&gt;RAID5&lt;/li&gt;&lt;li&gt;Support for SMB, NFSv4&lt;/li&gt;&lt;li&gt;A good amount of RAM for caching&lt;/li&gt;&lt;li&gt;A SSD for caching too&lt;/li&gt;&lt;/ul&gt;</content></entry><entry><title>So I’m not a lesbian</title><id>https://www.charlotte-thomas.me/blog/realising_bi</id><updated>2025-10-13T00:00:00+00:00</updated><link href="https://www.charlotte-thomas.me/blog/realising_bi" rel="alternate" type="text/html" title="So I’m not a lesbian"/><published>2025-10-13T00:00:00+00:00</published><content xml:base="https://www.charlotte-thomas.me/blog/realising_bi" type="html">&lt;p&gt;If your reaction is “not surprising” know that I’m pouting.&lt;/p&gt;&lt;h2 id=&apos;lesbian&apos;&gt;&lt;a href=&apos;#lesbian&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Being a lesbian&lt;/h2&gt;&lt;p&gt;Immediately after I came out about my gender I thought I was a lesbian, I was a girl (or close to it anyway) and I always liked girls so easy right I’m a lesbian?&lt;/p&gt;&lt;p&gt;So I lived peacefully my life as a lesbian, I rationalised that fem enbies counted as being a lesbian, the label is just that a label right? There’s no rules.&lt;/p&gt;&lt;p&gt;Then six months after I came out I started looking at boys. Maybe I finally felt comfortable enough in my feminity to look at them as being mysterious. &lt;/p&gt;&lt;p&gt;This too I rationalised as me just wanting to feel feminine and liking boys is a thing most girls so I felt nothing of it.&lt;/p&gt;&lt;h2 id=&apos;bicycle&apos;&gt;&lt;a href=&apos;#bicycle&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;The bi-cycle&lt;/h2&gt;&lt;p&gt;As a moment after my transition I thought I was bi or pan because I started looking at boys with more intensity.&lt;/p&gt;&lt;p&gt;This too, later I rationalised as being comp-het or being the hormones acting up.&lt;/p&gt;&lt;p&gt;Let me tell you I had calls with my best friend who weren’t very &lt;em&gt;lesbian&lt;/em&gt; of me.&lt;/p&gt;&lt;p&gt;There’s even a moment in my life, very brief thankfully, where I thought I was straight (homoromantic-heterosexual to be more exact which is an interesting mix).&lt;/p&gt;&lt;h2 id=&apos;me&apos;&gt;&lt;a href=&apos;#me&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Well finally what are you&lt;/h2&gt;&lt;p&gt;Well, to be honest I spent a lot of time wondering what I was, I rationalised everything as being hormonal or just me wanting to feel feminine and hid myself under the guise of lesbianism to be safe.&lt;/p&gt;&lt;p&gt;Even if it didn’t help me at some times in my life.&lt;/p&gt;&lt;p&gt;My preferences change every 6 months to a year, and I finally accepted that. I also think of girls and guys differently (enbies kind of go everywhere).&lt;/p&gt;&lt;p&gt;With girls I enjoy the sense of longing and quietly &lt;em&gt;loving&lt;/em&gt; someone, cuddling, waking up with a girl in my bed smiling at me, these sappy as fuck things because I’m a very sappy person. It’s a very.. well it’s a very poetic stance on loving girls but I like it. At this point in time this never happened, I fell in love once, but it went nowhere.&lt;/p&gt;&lt;p&gt;With guys my thoughts leave the realm of poems quite fast. Which isn’t very ace of me and opened another question - which I did not answer yet. &lt;/p&gt;&lt;p&gt;Everything is very fluid, but I finally accepted that yes, I’m into guys. And I’m also into girls. And I’m also into non binary people. &lt;/p&gt;&lt;p&gt;I don’t think I’m pan, I have a preference on the gender depending on the time of the year. So call me Omni if you want, I settled on demi-biromantic and demisexual. Why demiromantic? Because as much as I’d like to date someone, time and dates taught me I cannot fall in love without a strong platonic relationship being there.&lt;/p&gt;&lt;p&gt;I fell in love once, it wasn’t reciprocal, but bless their heart that was the most adorable rejection of all time. I think they stayed texting with me for one or two hours, and they and I are close friends to this day, I am over it.&lt;/p&gt;&lt;p&gt;I’m looking forward to the future, a future where I accept myself more. &lt;/p&gt;&lt;h2 id=&apos;after&apos;&gt;&lt;a href=&apos;#after&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Afterwords&lt;/h2&gt;&lt;p&gt;It seemed I wasn’t really… subtle at liking guys. About every friend I came out to were not surprised. &lt;/p&gt;&lt;p&gt;I’m not delusional, I know no one reads this blog, and I’m okay with that, it’s my way of crying into the void. My way of expressing myself with words when everything else fails. &lt;/p&gt;&lt;p&gt;But if in the future when I’m famous you happen to read this blog, well I hope I’m doing well in the future. I hope I have a good girlfriend, voidfriend, or boyfriend (or multiple of them). Maybe I’ll even have a husband, a wife or a spouse. I’ll still work my dream job and teach on the side and I’ll be in my lovely apartment, which is &lt;em&gt;mine&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Btw, my micro-blogging is available &lt;a href=&apos;https://woof.tech/@vanilla_extract&apos;&gt;on the fediverse &lt;em&gt;@vanilla_extract@woof.tech&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Thanks for (not) reading,&lt;/p&gt;&lt;p&gt;Cheers,&lt;/p&gt;&lt;p&gt;Charlotte Thomas.&lt;/p&gt;</content></entry><entry><title>Tasks, Agendas, and CalDav.</title><id>https://www.charlotte-thomas.me/blog/my_list_of_tasks</id><updated>2025-10-04T00:00:00+00:00</updated><link href="https://www.charlotte-thomas.me/blog/my_list_of_tasks" rel="alternate" type="text/html" title="Tasks, Agendas, and CalDav."/><published>2025-10-04T00:00:00+00:00</published><content xml:base="https://www.charlotte-thomas.me/blog/my_list_of_tasks" type="html">&lt;h2 id=&apos;introduction&apos;&gt;&lt;a href=&apos;#introduction&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Introduction&lt;/h2&gt;&lt;p&gt;Hello!&lt;/p&gt;&lt;p&gt;Like many people I have a Nextcloud instance running on my main server (&lt;em&gt;Ambassador&lt;/em&gt;). And it stores all my calendars.&lt;/p&gt;&lt;p&gt;You may say &lt;em&gt;all&lt;/em&gt; your calendars Charlotte? How many does a girl need? Well at the moment I have three calendars. My main one is of course the default &lt;em&gt;Personal&lt;/em&gt; equipped by default for any Nextcloud account. I also have a &lt;em&gt;Work&lt;/em&gt; calendar which, you guessed it, stores my work related events that I need to access outside of my employer’s network.&lt;/p&gt;&lt;p&gt;And finally I decided recently to start a private tutoring gig beside my main line of work. I am slowly constructing &lt;a href=&apos;https://tutorat.me&apos;&gt;the website (FR)&lt;/a&gt;, which will be translated for international use, so I need a &lt;em&gt;Teaching&lt;/em&gt; calendar, granted I could have used my &lt;em&gt;Personal&lt;/em&gt; agenda but I wanted a clean one.&lt;/p&gt;&lt;p&gt;And I really wanted to have those events in my &lt;em&gt;waybar&lt;/em&gt; so I can easily see which is my next task/event, and a list of events by hovering.&lt;/p&gt;&lt;h2 id=&apos;sa&apos;&gt;&lt;a href=&apos;#sa&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;State of the art&lt;/h2&gt;&lt;p&gt;Like a good developer, I am lazy, and I (correctly) guessed that someone had previously wanted their calendars in their cli, and I could use that to do a custom module for waybar.&lt;/p&gt;&lt;p&gt;It turns out it was even better than that. Someone had created &lt;a href=&apos;https://github.com/chmouel/nextmeeting&apos;&gt;&lt;em&gt;nextmeeting&lt;/em&gt;&lt;/a&gt; which even arrived with its own waybar config and module.&lt;/p&gt;&lt;p&gt;So great, job done!&lt;/p&gt;&lt;p&gt;…However, at the moment I started this idea &lt;em&gt;nextmeeting&lt;/em&gt; only supported Google Calendar through a CLI API Client. It didn’t support CalDav, now it does, thanks to an issue I posted, and if I had been patient I would have used his way a week ago when I did it.&lt;/p&gt;&lt;p&gt;Next, I saw &lt;a href=&apos;https://github.com/tobixen/plann&apos;&gt;&lt;em&gt;plann&lt;/em&gt;&lt;/a&gt; which is a CLI CalDav client, so I was happy. After reading the documentation I set out to create a script…&lt;/p&gt;&lt;h2 id=&apos;plann&apos;&gt;&lt;a href=&apos;#plann&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;First approach, plann.&lt;/h2&gt;&lt;h3 id=&apos;tool&apos;&gt;&lt;a href=&apos;#tool&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;The tool&lt;/h3&gt;&lt;p&gt;I needed to&lt;/p&gt;&lt;ul&gt;&lt;li&gt;configure &lt;em&gt;plann&lt;/em&gt;&lt;/li&gt;&lt;li&gt;check for the list of events in the next X days (X was to be determined) and limit to 10&lt;/li&gt;&lt;li&gt;somehow displaying the first event in waybar and the remainder in the tooltip.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I use &lt;em&gt;fish&lt;/em&gt; as my daily driver for scripts, the script is probably very easily adaptable to bash, but now for reasons &lt;a href=&apos;#nextmeeting&apos;&gt;that are yet to come&lt;/a&gt; I won’t update the script.&lt;/p&gt;&lt;p&gt;It turned out configuring &lt;em&gt;plann&lt;/em&gt; was really easy you just need to write YAML in &lt;em&gt;calendar.conf&lt;/em&gt; at the root of your &lt;em&gt;XDG_CONFIG&lt;/em&gt; folder. After a bit of a struggle I finally ended up on this configuration for multiple agendas.&lt;/p&gt;&lt;pre class=&apos;scode&apos;&gt;&lt;code&gt;&lt;span class=&quot;ssource syaml&quot;&gt;&lt;span class=&quot;sstring sunquoted splain sout syaml&quot;&gt;&lt;span class=&quot;sentity sname stag syaml&quot;&gt;default&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sseparator skey-value smapping syaml&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;sstring sunquoted splain sout syaml&quot;&gt;&lt;span class=&quot;sentity sname stag syaml&quot;&gt;caldav_url&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sseparator skey-value smapping syaml&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sstring sunquoted splain sout syaml&quot;&gt;https://cloud.faefox.dev/remote.php/dav/&lt;/span&gt;
  &lt;span class=&quot;sstring sunquoted splain sout syaml&quot;&gt;&lt;span class=&quot;sentity sname stag syaml&quot;&gt;caldav_user&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sseparator skey-value smapping syaml&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sstring sunquoted splain sout syaml&quot;&gt;user&lt;/span&gt;
  &lt;span class=&quot;sstring sunquoted splain sout syaml&quot;&gt;&lt;span class=&quot;sentity sname stag syaml&quot;&gt;caldav_pass&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sseparator skey-value smapping syaml&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sstring sunquoted splain sout syaml&quot;&gt;password&lt;/span&gt;
  &lt;span class=&quot;sstring sunquoted splain sout syaml&quot;&gt;&lt;span class=&quot;sentity sname stag syaml&quot;&gt;calendar_url&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sseparator skey-value smapping syaml&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;spunctuation sdefinition sblock ssequence sitem syaml&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;sstring sunquoted splain sout syaml&quot;&gt;personal&lt;/span&gt;
    &lt;span class=&quot;spunctuation sdefinition sblock ssequence sitem syaml&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;sstring sunquoted splain sout syaml&quot;&gt;teaching&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After that I just had to use &lt;em&gt;plann&lt;/em&gt;, some examples of commands include,&lt;/p&gt;&lt;pre class=&apos;scode&apos;&gt;&lt;code&gt;&lt;span class=&quot;ssource sshell sbash&quot;&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;plann&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; select list&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To list every event in your calendars (even past one)&lt;/p&gt;&lt;pre class=&apos;scode&apos;&gt;&lt;code&gt;&lt;span class=&quot;ssource sshell sbash&quot;&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;plann&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; select&lt;span class=&quot;svariable sparameter soption sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sparameter sshell&quot;&gt; --&lt;/span&gt;from&lt;/span&gt; &lt;span class=&quot;smeta sgroup sexpansion scommand sparens sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens sbegin sshell&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;date&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens send sshell&quot;&gt;)&lt;/span&gt;&lt;/span&gt; list&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To list every event &lt;em&gt;from&lt;/em&gt; the current date and time.&lt;/p&gt;&lt;h3 id=&apos;script&apos;&gt;&lt;a href=&apos;#script&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;The Script&lt;/h3&gt;&lt;p&gt;I wanted a script which listed the next ten events from the next 30 days, and returned a json string with the text from the first event, and the remainder in tooltip.&lt;/p&gt;&lt;p&gt;So I started experimenting with &lt;em&gt;plann&lt;/em&gt;. The list of tasks is fairly easy after a bit of practice with this command&lt;/p&gt;&lt;pre class=&apos;scode&apos;&gt;&lt;code&gt;&lt;span class=&quot;ssource sshell sbash&quot;&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;ssupport sfunction sset sshell&quot;&gt;set&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; list_of_tasks &lt;span class=&quot;smeta sgroup sexpansion scommand sparens sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens sbegin sshell&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;plann&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; select&lt;span class=&quot;svariable sparameter soption sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sparameter sshell&quot;&gt; --&lt;/span&gt;from&lt;/span&gt; &lt;span class=&quot;smeta sgroup sexpansion scommand sparens sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens sbegin sshell&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;date&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens send sshell&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;svariable sparameter soption sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sparameter sshell&quot;&gt; --&lt;/span&gt;end&lt;/span&gt; &lt;span class=&quot;smeta sgroup sexpansion scommand sparens sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens sbegin sshell&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;date&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt;&lt;span class=&quot;svariable sparameter soption sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sparameter sshell&quot;&gt; -&lt;/span&gt;d&lt;/span&gt; &lt;span class=&quot;sstring squoted sdouble sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sshell&quot;&gt;&amp;quot;&lt;/span&gt;+30 days&lt;span class=&quot;spunctuation sdefinition sstring send sshell&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens send sshell&quot;&gt;)&lt;/span&gt;&lt;/span&gt; list&lt;/span&gt; &lt;span class=&quot;skeyword soperator slogical spipe sshell&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; collect&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens send sshell&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you see in this command we are selecting everything in the next 30 days (thanks to date and its easy parsing it’s easily done) and we use the fish directive &lt;em&gt;string collect&lt;/em&gt; to collect them into a big string.&lt;/p&gt;&lt;p&gt;With some manipulations we can obtain the first task&lt;/p&gt;&lt;pre class=&apos;scode&apos;&gt;&lt;code&gt;&lt;span class=&quot;ssource sshell sbash&quot;&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;ssupport sfunction sset sshell&quot;&gt;set&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; task &lt;span class=&quot;smeta sgroup sexpansion scommand sparens sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens sbegin sshell&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;ssupport sfunction secho sshell&quot;&gt;echo&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; &lt;span class=&quot;sstring squoted sdouble sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sshell&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;smeta sgroup sexpansion sparameter sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;svariable sother sreadwrite sshell&quot;&gt;list_of_tasks&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sdefinition sstring send sshell&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;skeyword soperator slogical spipe sshell&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;head&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt;&lt;span class=&quot;svariable sparameter soption sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sparameter sshell&quot;&gt; -&lt;/span&gt;n&lt;/span&gt; 1&lt;/span&gt; &lt;span class=&quot;skeyword soperator slogical spipe sshell&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;xargs&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens send sshell&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here we use &lt;em&gt;xargs&lt;/em&gt; to trim the string, according to the &lt;del&gt;bible&lt;/del&gt; Stack Overflow, this is the easiest method to trim a string in shell.&lt;/p&gt;&lt;p&gt;Then we can get the first 10 with this command&lt;/p&gt;&lt;pre class=&apos;scode&apos;&gt;&lt;code&gt;&lt;span class=&quot;ssource sshell sbash&quot;&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;ssupport sfunction sset sshell&quot;&gt;set&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; list &lt;span class=&quot;smeta sgroup sexpansion scommand sparens sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens sbegin sshell&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;ssupport sfunction secho sshell&quot;&gt;echo&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; &lt;span class=&quot;sstring squoted sdouble sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sshell&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;smeta sgroup sexpansion sparameter sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;svariable sother sreadwrite sshell&quot;&gt;list_of_tasks&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sdefinition sstring send sshell&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;skeyword soperator slogical spipe sshell&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;head&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt;&lt;span class=&quot;svariable sparameter soption sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sparameter sshell&quot;&gt; -&lt;/span&gt;n&lt;/span&gt; 10&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens send sshell&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And job done!&lt;/p&gt;&lt;p&gt;…Almost&lt;/p&gt;&lt;p&gt;If we run this command we end up with a nightmare string which is impossible to parse, and can’t be easily put into lines. Thankfully we have the fish directive &lt;em&gt;string join&lt;/em&gt; which allows us to add a simple newline character to every line.&lt;/p&gt;&lt;p&gt;Thus the end script looks like this&lt;/p&gt;&lt;pre class=&apos;scode&apos;&gt;&lt;code&gt;&lt;span class=&quot;ssource sshell sbash&quot;&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; cat nexttask&lt;/span&gt;
&lt;span class=&quot;scomment sline snumber-sign sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition scomment sbegin sshell&quot;&gt;#&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;scomment sline snumber-sign sshell&quot;&gt;!/usr/bin/fish&lt;/span&gt;&lt;span class=&quot;scomment sline snumber-sign sshell&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;ssupport sfunction sset sshell&quot;&gt;set&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; list_of_tasks &lt;span class=&quot;smeta sgroup sexpansion scommand sparens sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens sbegin sshell&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;plann&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; select&lt;span class=&quot;svariable sparameter soption sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sparameter sshell&quot;&gt; --&lt;/span&gt;from&lt;/span&gt; &lt;span class=&quot;smeta sgroup sexpansion scommand sparens sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens sbegin sshell&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;date&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens send sshell&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;svariable sparameter soption sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sparameter sshell&quot;&gt; --&lt;/span&gt;end&lt;/span&gt; &lt;span class=&quot;smeta sgroup sexpansion scommand sparens sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens sbegin sshell&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;date&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt;&lt;span class=&quot;svariable sparameter soption sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sparameter sshell&quot;&gt; -&lt;/span&gt;d&lt;/span&gt; &lt;span class=&quot;sstring squoted sdouble sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sshell&quot;&gt;&amp;quot;&lt;/span&gt;+30 days&lt;span class=&quot;spunctuation sdefinition sstring send sshell&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens send sshell&quot;&gt;)&lt;/span&gt;&lt;/span&gt; list&lt;/span&gt; &lt;span class=&quot;skeyword soperator slogical spipe sshell&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; collect&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens send sshell&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;ssupport sfunction sset sshell&quot;&gt;set&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; task &lt;span class=&quot;smeta sgroup sexpansion scommand sparens sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens sbegin sshell&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;ssupport sfunction secho sshell&quot;&gt;echo&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; &lt;span class=&quot;sstring squoted sdouble sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sshell&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;smeta sgroup sexpansion sparameter sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;svariable sother sreadwrite sshell&quot;&gt;list_of_tasks&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sdefinition sstring send sshell&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;skeyword soperator slogical spipe sshell&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;head&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt;&lt;span class=&quot;svariable sparameter soption sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sparameter sshell&quot;&gt; -&lt;/span&gt;n&lt;/span&gt; 1&lt;/span&gt; &lt;span class=&quot;skeyword soperator slogical spipe sshell&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;xargs&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens send sshell&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;ssupport sfunction sset sshell&quot;&gt;set&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; list &lt;span class=&quot;smeta sgroup sexpansion scommand sparens sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens sbegin sshell&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;ssupport sfunction secho sshell&quot;&gt;echo&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; &lt;span class=&quot;sstring squoted sdouble sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sshell&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;smeta sgroup sexpansion sparameter sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;svariable sother sreadwrite sshell&quot;&gt;list_of_tasks&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sdefinition sstring send sshell&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;skeyword soperator slogical spipe sshell&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;head&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt;&lt;span class=&quot;svariable sparameter soption sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sparameter sshell&quot;&gt; -&lt;/span&gt;n&lt;/span&gt; 10&lt;/span&gt; &lt;span class=&quot;skeyword soperator slogical spipe sshell&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;svariable sfunction sshell&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; join &lt;span class=&quot;sconstant scharacter sescape sshell&quot;&gt;\\&lt;/span&gt;n &lt;/span&gt;&lt;span class=&quot;spunctuation ssection sparens send sshell&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;smeta sfunction-call sshell&quot;&gt;&lt;span class=&quot;ssupport sfunction secho sshell&quot;&gt;echo&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sfunction-call sarguments sshell&quot;&gt; &lt;span class=&quot;sstring squoted sdouble sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sshell&quot;&gt;&amp;quot;&lt;/span&gt;{&lt;span class=&quot;sconstant scharacter sescape sshell&quot;&gt;\&amp;quot;&lt;/span&gt;text&lt;span class=&quot;sconstant scharacter sescape sshell&quot;&gt;\&amp;quot;&lt;/span&gt;:&lt;span class=&quot;sconstant scharacter sescape sshell&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;smeta sgroup sexpansion sparameter sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;svariable sother sreadwrite sshell&quot;&gt;task&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sconstant scharacter sescape sshell&quot;&gt;\&amp;quot;&lt;/span&gt;,&lt;span class=&quot;sconstant scharacter sescape sshell&quot;&gt;\&amp;quot;&lt;/span&gt;tooltip&lt;span class=&quot;sconstant scharacter sescape sshell&quot;&gt;\&amp;quot;&lt;/span&gt;:&lt;span class=&quot;sconstant scharacter sescape sshell&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;smeta sgroup sexpansion sparameter sshell&quot;&gt;&lt;span class=&quot;spunctuation sdefinition svariable sshell&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;svariable sother sreadwrite sshell&quot;&gt;list&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sconstant scharacter sescape sshell&quot;&gt;\&amp;quot;&lt;/span&gt;}&lt;span class=&quot;spunctuation sdefinition sstring send sshell&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&apos;plann-waybar&apos;&gt;&lt;a href=&apos;#plann-waybar&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;The Waybar module.&lt;/h3&gt;&lt;p&gt;Great! We have a json string ready for Waybar.&lt;/p&gt;&lt;p&gt;Writing a custom waybar module isn’t hard, and it’s not the focus of this article so please refer to the wiki for any information.&lt;/p&gt;&lt;p&gt;The module looked like this&lt;/p&gt;&lt;pre class=&apos;scode&apos;&gt;&lt;code&gt;&lt;span class=&quot;ssource sjson&quot;&gt; &lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;custom/tasks&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;: &lt;span class=&quot;smeta sstructure sdictionary sjson&quot;&gt;&lt;span class=&quot;spunctuation ssection sdictionary sbegin sjson&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;smeta sstructure sdictionary skey sjson&quot;&gt;&lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;format&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sstructure sdictionary svalue sjson&quot;&gt;&lt;span class=&quot;spunctuation sseparator sdictionary skey-value sjson&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;{}&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sseparator sdictionary spair sjson&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;smeta sstructure sdictionary skey sjson&quot;&gt;&lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;interval&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sstructure sdictionary svalue sjson&quot;&gt;&lt;span class=&quot;spunctuation sseparator sdictionary skey-value sjson&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sconstant snumeric sjson&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;spunctuation sseparator sdictionary spair sjson&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;smeta sstructure sdictionary skey sjson&quot;&gt;&lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;exec&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sstructure sdictionary svalue sjson&quot;&gt;&lt;span class=&quot;spunctuation sseparator sdictionary skey-value sjson&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;/usr/bin/nexttask&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sseparator sdictionary spair sjson&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;smeta sstructure sdictionary skey sjson&quot;&gt;&lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;on-click&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sstructure sdictionary svalue sjson&quot;&gt;&lt;span class=&quot;spunctuation sseparator sdictionary skey-value sjson&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;alacritty --class floating -e fish -i -c calcure&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sseparator sdictionary spair sjson&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;smeta sstructure sdictionary skey sjson&quot;&gt;&lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;return-type&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sstructure sdictionary svalue sjson&quot;&gt;&lt;span class=&quot;spunctuation sseparator sdictionary skey-value sjson&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;json&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;spunctuation sseparator sdictionary spair sjson&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;smeta sstructure sdictionary skey sjson&quot;&gt;&lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;class&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;smeta sstructure sdictionary svalue sjson&quot;&gt;&lt;span class=&quot;spunctuation sseparator sdictionary skey-value sjson&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sstring squoted sdouble sjson&quot;&gt;&lt;span class=&quot;spunctuation sdefinition sstring sbegin sjson&quot;&gt;&amp;quot;&lt;/span&gt;tasks&lt;span class=&quot;spunctuation sdefinition sstring send sjson&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  &lt;/span&gt;&lt;span class=&quot;spunctuation ssection sdictionary send sjson&quot;&gt;}&lt;/span&gt;&lt;/span&gt;,
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;Calcure&lt;/em&gt; is a great tool, but not the topic of this article, perhaps I will make an article on this topic one day. If we test it we end up with this&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/waybar_plann.png&apos;&gt;&lt;img src=&apos;/static/waybar_plann.png&apos; alt=&apos;waybar plann&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Which is… okay I guess? If you’re a &lt;em&gt;real&lt;/em&gt; fan of ISO date it’s cool. I like ISO date, it’s my main date format, but it’s not very user friendly.&lt;/p&gt;&lt;h2 id=&apos;nextmeeting&apos;&gt;&lt;a href=&apos;#nextmeeting&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Come nextmeeting&lt;/h2&gt;&lt;p&gt;It turns out in the days which came after my issue to &lt;em&gt;nextmeeting&lt;/em&gt; the author implemented CalDav in his CLI. Which is great, but was a nightmare to configure.&lt;/p&gt;&lt;p&gt;If you’re reading that at a later date, the bug is likely fixed, but as of 2025-10-04 T2000+0200 the author mixed &lt;em&gt;caldav-*&lt;/em&gt; and &lt;em&gt;caldav_*&lt;/em&gt; in the code meaning we need to configure &lt;em&gt;nextmeeting&lt;/em&gt; with the latter, contrary to the README. I’m sure the author will quickly fix this little bug.&lt;/p&gt;&lt;pre class=&apos;scode&apos;&gt;&lt;code&gt;[nextmeeting]
caldav_url = &amp;quot;https://cloud.faefox.dev/remote.php/dav/calendars/charlotte/personal&amp;quot;
caldav_username = &amp;quot;charlotte&amp;quot;
caldav_password = &amp;quot;password&amp;quot;
caldav_lookahead_hours = 720
caldav_calendar=&amp;quot;personal&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And now we know the biggest downside to this approach, it only is possible to sync &lt;em&gt;one&lt;/em&gt; calendar at a time. I opened an issue to ask for multiple calendars support. I’ll update you when that evolves.&lt;/p&gt;&lt;p&gt;But now we can just use &lt;em&gt;nextmeeting&lt;/em&gt; as if we were using a Google Calendar, the documentation is good. The results speak for themselves in term of user friendly-ness&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/waybar_nextmeeting.png&apos;&gt;&lt;img src=&apos;/static/waybar_nextmeeting.png&apos; alt=&apos;waybar nextmeeting&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/tooltip_nextmeeting.png&apos;&gt;&lt;img src=&apos;/static/tooltip_nextmeeting.png&apos; alt=&apos;tooltip nextmeeting&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&apos;after&apos;&gt;&lt;a href=&apos;#after&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Afterwords&lt;/h2&gt;&lt;p&gt;Thank you for reading this (&lt;em&gt;really&lt;/em&gt;) nerdy post on CalDav synchronisation and status bars.&lt;/p&gt;&lt;p&gt;I will profit from this new article to announce that I moved everything writing related to a new domain, &lt;a href=&apos;https://analgesia.icu&apos;&gt;analgesia.icu&lt;/a&gt;, why? Mostly because (Painkillers) (Dot) (Intensive Care Unit) was too much fun to pass.&lt;/p&gt;&lt;p&gt;See you next time,&lt;/p&gt;&lt;p&gt;Cheers,&lt;/p&gt;&lt;p&gt;Charlotte.&lt;/p&gt;</content></entry><entry><title>New home for Poupette</title><id>https://www.charlotte-thomas.me/blog/new_home_for_poupette</id><updated>2025-09-10T00:00:00+00:00</updated><link href="https://www.charlotte-thomas.me/blog/new_home_for_poupette" rel="alternate" type="text/html" title="New home for Poupette"/><published>2025-09-10T00:00:00+00:00</published><content xml:base="https://www.charlotte-thomas.me/blog/new_home_for_poupette" type="html">&lt;h2 id=&apos;poupette&apos;&gt;&lt;a href=&apos;#poupette&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Poupette&lt;/h2&gt;&lt;p&gt;Poupette (in french pronounced like &lt;em&gt;Poo-Pet&lt;/em&gt;) is a one and a half year old (neutered) female cat.&lt;/p&gt;&lt;p&gt;She got into my care after her previous human couldn’t afford two cats anymore. She’s (very) shy but have been warming up to me a lot these past two days. I’m happy to be her new human and will take great care of her. At day she hides under the bed or behind the desk, but at night (or evening) she comes alive and explores my little room, we decided to isolate her for the moment. We’ll introduce her to the apartment (and the other cats) later.&lt;/p&gt;&lt;p&gt;She is very cute, and likes to demand cuddles at 4am, which I’m more than happy to provide.&lt;/p&gt;&lt;h2 id=&apos;photos&apos;&gt;&lt;a href=&apos;#photos&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Photos&lt;/h2&gt;&lt;p&gt;Can’t talk about a cat on the internet without providing photo can I? Well &lt;em&gt;enjoy&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/chat_01.jpg&apos;&gt;&lt;img src=&apos;/static/chat_01.jpg&apos; alt=&apos;&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/chat_02.jpg&apos;&gt;&lt;img src=&apos;/static/chat_02.jpg&apos; alt=&apos;&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/chat_03.jpg&apos;&gt;&lt;img src=&apos;/static/chat_03.jpg&apos; alt=&apos;&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/chat_04.jpg&apos;&gt;&lt;img src=&apos;/static/chat_04.jpg&apos; alt=&apos;&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/chat_05.jpg&apos;&gt;&lt;img src=&apos;/static/chat_05.jpg&apos; alt=&apos;&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/chat_06.jpg&apos;&gt;&lt;img src=&apos;/static/chat_06.jpg&apos; alt=&apos;&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/chat_07.jpg&apos;&gt;&lt;img src=&apos;/static/chat_07.jpg&apos; alt=&apos;&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&apos;products&apos;&gt;&lt;a href=&apos;#products&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Products&lt;/h2&gt;&lt;p&gt;I use &lt;em&gt;la toilette des chats&lt;/em&gt;’s branded non invasive safe litter robot for her (and the other cats who like it too!), her litter is from a French startup named Pacha, it’s silicate crystals and it supposedly have a lot of benefits. I use a generic gravity feeder to deliver her meal six times a day, we have a water fountain out of the room but I’m using a wide bowl while she accommodates to the apartment.&lt;/p&gt;&lt;p&gt;Her food is vet prescribed, it’s from Hill’s.&lt;/p&gt;&lt;p&gt;She likes a lot of toys, generic scratcher, my ergonomic chair (at my own displeasure), balls, stuffed animals.&lt;/p&gt;</content></entry><entry><title>Services</title><id>https://www.charlotte-thomas.me/blog/services_update</id><updated>2025-07-11T00:00:00+00:00</updated><link href="https://www.charlotte-thomas.me/blog/services_update" rel="alternate" type="text/html" title="Services"/><published>2025-07-11T00:00:00+00:00</published><content xml:base="https://www.charlotte-thomas.me/blog/services_update" type="html">&lt;p&gt;This is an update to my &lt;em&gt;services&lt;/em&gt; article I posted a few months ago.&lt;/p&gt;&lt;h2 id=&apos;vps&apos;&gt;&lt;a href=&apos;#vps&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;VPS Infrastructure&lt;/h2&gt;&lt;p&gt;I have a bigger infrastructure nowadays, it is hosted on &lt;a href=&apos;https://mercurycloud.fr/&apos;&gt;mercurycloud&lt;/a&gt; which is a small French cloud provider.&lt;/p&gt;&lt;p&gt;I have multiple servers on mercurycloud.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Ambassador&lt;/em&gt; (8vCPU, 16GB of RAM), named after the &lt;em&gt;Ambassador-class&lt;/em&gt; starships in Star Trek (all my hostnames are Star Trek starship classes).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I have another server on Hetzner, it is only used for its sheer reliance to be online 24/7.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Miranda&lt;/em&gt; (2vCPU (shared), 4GB of RAM)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Ambassador&lt;/em&gt; is hosted in Rennes, France. &lt;em&gt;Yellowstone&lt;/em&gt; and &lt;em&gt;Nova&lt;/em&gt; have been discontinued, and are replaced by a S3 bucket on Hetzner (and nothing for &lt;em&gt;Nova&lt;/em&gt;).&lt;/p&gt;&lt;p&gt;&lt;em&gt;Miranda&lt;/em&gt; is hosted on the Hetzner datacentre in Helsinki, Finland.&lt;/p&gt;&lt;p&gt;I run on &lt;em&gt;Ambassador&lt;/em&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A &lt;a href=&apos;https://git.charlotte-thomas.me/&apos;&gt;Git Forge&lt;/a&gt; as well as a runner&lt;/li&gt;&lt;li&gt;An instance of &lt;a href=&apos;https://client.faefox.dev&apos;&gt;Cinny (matrix client)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://cloud.faefox.dev&apos;&gt;NextCloud Instance&lt;/a&gt; (you can request an account by email)&lt;/li&gt;&lt;li&gt;My &lt;a href=&apos;https://tutorat.me&apos;&gt;Tutoring Website&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And finally on &lt;em&gt;Miranda&lt;/em&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A &lt;a href=&apos;https://github.com/girlbossceo/conduwuit&apos;&gt;conduwuit (matrix server)&lt;/a&gt; instance (faefox.dev)&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://uptime.faefox.dev&apos;&gt;service status page&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;backup&apos;&gt;&lt;a href=&apos;#backup&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Backups&lt;/h2&gt;&lt;p&gt;Backups are made each day at T0400+0200 on a S3-compatible bucket, hosted somewhere in Europe, but not in France, thus the data I put there is quadruple safe, first, it is on my personal computer. Second it is on &lt;em&gt;Ambassador&lt;/em&gt; on nextcloud. Third it is in the backups of my VPS provider, which puts their data in a glacier somewhere in France. And fourth it is on the glacier of the S3-compatible bucket. So for the data to disappear it would need an explosion of some sort in Rennes, a nuke in France, and a nuke in Europe on the second glacier.&lt;/p&gt;&lt;p&gt;I thus decided that we were sufficiently secured, of course if a nuke is launched on France, I might very well die, which mean the fact the data is safe is not very important anymore, because I’d be dead. But so is life you know.&lt;/p&gt;&lt;p&gt;And oh yes, it is &lt;em&gt;also&lt;/em&gt; on my NAS, which will soon have a backup. I’m not paranoid about data retention ;).&lt;/p&gt;&lt;h2 id=&apos;page&apos;&gt;&lt;a href=&apos;#page&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;CloudFare Page&lt;/h2&gt;&lt;p&gt;I use CloudFare Page to run a few static websites.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&apos;https://www.charlotte-thomas.me&apos;&gt;Personal Web, and Blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&apos;https://analgesia.icu&apos;&gt;Writing Web, and Blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&apos;https://calc.charlotte-thomas.me&apos;&gt;Calc Web&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;image&apos;&gt;&lt;a href=&apos;#image&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Migadu&lt;/h2&gt;&lt;p&gt;I use &lt;em&gt;Migadu&lt;/em&gt; as my email provider. I use the micro yearly plan, for only $20 USD a year I have everything I need. I have emails under the following domains.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;charlotte-thomas.me&lt;/em&gt;&lt;ul&gt;&lt;li&gt;me&lt;/li&gt;&lt;li&gt;gc&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;faefox.dev&lt;/em&gt;&lt;ul&gt;&lt;li&gt;me&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;tutorat.me&lt;/em&gt;&lt;ul&gt;&lt;li&gt;charlotte&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;nas&apos;&gt;&lt;a href=&apos;#nas&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;NAS&lt;/h2&gt;&lt;p&gt;I have a NAS (2TB on RAID1) running on my &lt;strong&gt;local&lt;/strong&gt; network. Its name is &lt;em&gt;Olympic&lt;/em&gt; (because it is old, big, and vulnerable)&lt;/p&gt;&lt;p&gt;I have twice daily backups using &lt;em&gt;restic&lt;/em&gt; on it.&lt;/p&gt;&lt;h2 id=&apos;hostnames&apos;&gt;&lt;a href=&apos;#hostnames&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Hostnames&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;My personal laptop is &lt;em&gt;Defiant&lt;/em&gt; (because it’s tough, and little)&lt;/li&gt;&lt;li&gt;My work laptop is &lt;em&gt;Galaxy&lt;/em&gt; (because it’s big)&lt;/li&gt;&lt;li&gt;My personal phone is &lt;em&gt;Danube&lt;/em&gt; (because it’s small)&lt;/li&gt;&lt;li&gt;My NAS is &lt;em&gt;Olympic&lt;/em&gt;&lt;/li&gt;&lt;li&gt;VPSes are:&lt;ul&gt;&lt;li&gt;&lt;em&gt;Ambassador&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;Miranda&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;future&apos;&gt;&lt;a href=&apos;#future&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Plans for the future&lt;/h2&gt;&lt;p&gt;In the future, when I have my own home, with my own Network (because I am moving to a place where I don’t control it for the moment). My plan is to run a Server/NAS where I can store my data and expose it to the web to run my applications and everything I need&lt;/p&gt;&lt;p&gt;In the plans there is:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Everything I run on my VPSes (or maybe I’ll keep the VPS, still unknown.)&lt;/li&gt;&lt;li&gt;A NAS (maybe with TrueNAS?)&lt;/li&gt;&lt;li&gt;A Plex/Jellyfish Server &lt;/li&gt;&lt;li&gt;An OpenStack instance (to do ansible and terraform on) (maybe not in hindsight)&lt;/li&gt;&lt;li&gt;And everything that strike my fancy&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The budget will be around &lt;strong&gt;€2,000&lt;/strong&gt; to build it, and the minimum spec I want are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;CPU: 8C/16T, reasonably recent&lt;/li&gt;&lt;li&gt;GPU: An Intel ARC for transcoding&lt;/li&gt;&lt;li&gt;RAM: 64GB&lt;/li&gt;&lt;li&gt;Storage:&lt;ul&gt;&lt;li&gt;8TB in RAID5 with HDD&lt;/li&gt;&lt;li&gt;512GB in RAID1 on NVMe&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;PSU:&lt;ul&gt;&lt;li&gt;Gold Rated Unit &lt;/li&gt;&lt;li&gt;An UPS&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Silent Fans.&lt;/li&gt;&lt;li&gt;LAN: 2.5 Gbit/s &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I don’t know if I want to run it on a rack or not. I think not.&lt;/p&gt;&lt;p&gt;Everything is &lt;em&gt;very&lt;/em&gt; subject to changes. It’s the early version of what I’m thinking. I may scrap it and run it from an old motherboard because I would have updated my Framework. Maybe. So it can change it’s just what I’m feeling at the moment.&lt;/p&gt;&lt;p&gt;It won’t exists for another year and a half (or more); but it will probably be under some subdomains of &lt;em&gt;charlotte-thomas.me&lt;/em&gt; and/or &lt;em&gt;faefox.dev&lt;/em&gt;. Probably more &lt;em&gt;faefox.dev&lt;/em&gt; as we can all agree, it is the funnier one.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;EDIT: Add miranda in the servers, 2025-07-28.&lt;/li&gt;&lt;li&gt;EDIT: Remove yellowstone from the servers, 2025-07-29.&lt;/li&gt;&lt;li&gt;EDIT: Moved status page to miranda, 2025-07-30.&lt;/li&gt;&lt;li&gt;EDIT: Added backup on S3 bucket, 2025-07-31.&lt;/li&gt;&lt;li&gt;EDIT: Remove Nova, 2025-10-03.&lt;/li&gt;&lt;/ul&gt;</content></entry><entry><title>Work, Life.</title><id>https://www.charlotte-thomas.me/blog/work_life_live</id><updated>2025-05-19T00:00:00+00:00</updated><link href="https://www.charlotte-thomas.me/blog/work_life_live" rel="alternate" type="text/html" title="Work, Life."/><published>2025-05-19T00:00:00+00:00</published><content xml:base="https://www.charlotte-thomas.me/blog/work_life_live" type="html">&lt;h2 id=&apos;work&apos;&gt;&lt;a href=&apos;#work&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Work&lt;/h2&gt;&lt;p&gt;This is it, after 8 months of ‘initial training’ I’m starting work for real. I’m taking off the training wheels and diving into the adults’ pool.&lt;/p&gt;&lt;p&gt;This will impact my project.&lt;/p&gt;&lt;h2 id=&apos;rly&apos;&gt;&lt;a href=&apos;#rly&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;What have you been up to&lt;/h2&gt;&lt;p&gt;Well, a lot of things.&lt;/p&gt;&lt;p&gt;If you look at my &lt;a href=&apos;https://github.com/vanilla-extracts&apos;&gt;GitHub activity&lt;/a&gt; you will see I was &lt;em&gt;busy&lt;/em&gt; this past four weeks. &lt;/p&gt;&lt;p&gt;I have been developing my latest project, if you haven’t seen it it’s normal it’s in private on GitHub. It’s an agenda in the cloud called SharedAgenda.&lt;/p&gt;&lt;p&gt;It’s in public on my &lt;a href=&apos;https://git.charlotte-thomas.me/vanilla-extracts/SharedAgenda&apos;&gt;own forge&lt;/a&gt; it was intended to be my end-of initial training project but it grew a lot.&lt;/p&gt;&lt;p&gt;The API is live at &lt;code class=&apos;scode&apos;&gt;https://api.sharedagenda.faefox.dev&lt;/code&gt; and I’m hard at work on the TUI. There is a CLI as a client and I may do a Web UI one day.&lt;/p&gt;&lt;h2 id=&apos;writing&apos;&gt;&lt;a href=&apos;#writing&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;What about writing&lt;/h2&gt;&lt;p&gt;Go check my &lt;a href=&apos;https:/analgesia.icu/blog&apos;&gt;writing blog&lt;/a&gt; to see!&lt;/p&gt;</content></entry><entry><title>DIY Android Auto Infotainment Screen</title><id>https://www.charlotte-thomas.me/blog/diy_infotainment</id><updated>2025-04-19T00:00:00+00:00</updated><link href="https://www.charlotte-thomas.me/blog/diy_infotainment" rel="alternate" type="text/html" title="DIY Android Auto Infotainment Screen"/><published>2025-04-19T00:00:00+00:00</published><content xml:base="https://www.charlotte-thomas.me/blog/diy_infotainment" type="html">&lt;h2 id=&apos;goal&apos;&gt;&lt;a href=&apos;#goal&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Goal and motivation&lt;/h2&gt;&lt;p&gt;My father had two old netbooks with barely enough RAM and storage to be useful (and which could absolutely not run modern Window.)&lt;/p&gt;&lt;p&gt;We thought about upcycling them, install a modern linux distribution, and giving them to someone who could use a small and not very powerful computer. &lt;/p&gt;&lt;p&gt;But then we had another idea, see, my parents have two cars:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;A beautiful 2020 Hybrid Toyota Corolla Break in a colour my parents insist is &lt;em&gt;ebene&lt;/em&gt; which is a woody dark brown; &lt;del&gt;don’t tell them but it looks black from afar&lt;/del&gt;. With a decent Android Auto experience, and overall is a pleasure to ride, I am sure it is a pleasure to drive too, but I don’t drive and even if I did I am not sure my dad would trust me with this car.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;An old red Fiat Panda. Which to be fair is fairly fun when the person who is driving it has confidence in their skills. &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Well, the Corolla is mostly used by my mum, for reasons she prefers the automatic transmission (we live in France, most of our cars are still using manual transmissions).&lt;/p&gt;&lt;p&gt;The Panda does not have any infotainment – being old and all – and my dad sometimes uses it to go pick mushrooms (a important hobby of his, he blogs his mushroom adventures on his &lt;a href=&apos;https://mastoot.fr/@atheach&apos;&gt;mastodon profile (in french)&lt;/a&gt; – as well as saying a “good morning” &lt;em&gt;every&lt;/em&gt; morning.)&lt;/p&gt;&lt;p&gt;So a thought came to us in a discussion on a morning.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Why not turn one of the computers into an infotainment system for the Panda?&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&apos;ingredients&apos;&gt;&lt;a href=&apos;#ingredients&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Ingredients&lt;/h2&gt;&lt;p&gt;For this recipe you will need:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Any old netbook (here is an old laptop with an 11“ screen, 2 GB of RAM, and 32 GB of RAM, an &lt;em&gt;Asus X205TA&lt;/em&gt;)&lt;/li&gt;&lt;li&gt;A compatible touch-screen for the laptop (&lt;a href=&apos;https://www.ebay.fr/itm/363419205899&apos;&gt;this one on ebay&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;A way of drawing power from the car to the laptop&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&apos;ingredients-photo&apos;&gt;&lt;a href=&apos;#ingredients-photo&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Photos&lt;/h3&gt;&lt;h4 id=&apos;laptop&apos;&gt;&lt;a href=&apos;#laptop&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Laptop&lt;/h4&gt;&lt;p&gt;&lt;a href=&apos;/static/start.jpg&apos;&gt;&lt;img src=&apos;/static/start.jpg&apos; alt=&apos;Laptop&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h4 id=&apos;power&apos;&gt;&lt;a href=&apos;#power&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Power&lt;/h4&gt;&lt;p&gt;&lt;a href=&apos;/static/power.jpg&apos;&gt;&lt;img src=&apos;/static/power.jpg&apos; alt=&apos;Power&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&apos;os&apos;&gt;&lt;a href=&apos;#os&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Step 1: OS&lt;/h2&gt;&lt;p&gt;We obviously decided to install a linux distro on the netbook. &lt;/p&gt;&lt;p&gt;First, the computer was running a really old version of Window – 8.1 if I remember correctly – and of course with its 2 GB of RAM and 32 GB of &lt;em&gt;eMMC&lt;/em&gt; it wasn’t going to run Window 10, or worse Windows 11.&lt;/p&gt;&lt;p&gt;After some considerations, particularly about the bluetooth/wifi card, we decided to wing it and install Debian 12 vanilla on it.&lt;/p&gt;&lt;p&gt;–&lt;/p&gt;&lt;p&gt;And it worked like a charm!&lt;/p&gt;&lt;p&gt;&lt;em&gt;Except for the Wifi&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Fortunately we found a tutorial for &lt;em&gt;this&lt;/em&gt; particular machine, the &lt;em&gt;Asus X205TA&lt;/em&gt;, and sure enough we were successful in making wifi work. &lt;/p&gt;&lt;p&gt;Now we needed to modify the hardware!&lt;/p&gt;&lt;h2 id=&apos;hardware&apos;&gt;&lt;a href=&apos;#hardware&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Step 2: Hardware modifications&lt;/h2&gt;&lt;p&gt;Hardware was &lt;em&gt;exclusively&lt;/em&gt; done by my dad, I am not &lt;em&gt;at all&lt;/em&gt; good with hardware. I know how to build a server/computer. And that’s it. &lt;/p&gt;&lt;p&gt;So I’ll not go into details here.&lt;/p&gt;&lt;p&gt;Fortunately this step is actually pretty easy you only need to perform a couple steps&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Remove the closing-detection magnet.&lt;/li&gt;&lt;li&gt;Install the touchscreen.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&apos;disassembled&apos;&gt;&lt;a href=&apos;#disassembled&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Computer Disassembled&lt;/h3&gt;&lt;p&gt;&lt;a href=&apos;/static/disassembled.jpg&apos;&gt;&lt;img src=&apos;/static/disassembled.jpg&apos; alt=&apos;Disassembled&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This is the computer fully disassembled. The keyboard is off-screen.&lt;/p&gt;&lt;h3 id=&apos;kb&apos;&gt;&lt;a href=&apos;#kb&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Keyboard cable&lt;/h3&gt;&lt;p&gt;&lt;a href=&apos;/static/kb.jpg&apos;&gt;&lt;img src=&apos;/static/kb.jpg&apos; alt=&apos;Keyboard disassembled&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This is what the keyboard ribbon cable looks like. We decided to keep the keyboard connected, just completely folded.&lt;/p&gt;&lt;h3 id=&apos;folded&apos;&gt;&lt;a href=&apos;#folded&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Computer folded&lt;/h3&gt;&lt;p&gt;&lt;a href=&apos;/static/folded.jpg&apos;&gt;&lt;img src=&apos;/static/folded.jpg&apos; alt=&apos;Folded&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The computer is then folded to look like a Tablet.&lt;/p&gt;&lt;h2 id=&apos;software&apos;&gt;&lt;a href=&apos;#software&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Step 3: Necessary Softwares&lt;/h2&gt;&lt;p&gt;This is the part where I am the most capable in, and the part where I really helped.&lt;/p&gt;&lt;p&gt;We started to scoure the World Wide Web to find something to be a good infotainment system.&lt;/p&gt;&lt;h3 id=&apos;agl&apos;&gt;&lt;a href=&apos;#agl&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;AGL: Automotive Grade Linux.&lt;/h3&gt;&lt;p&gt;The first thing which came up in my research was &lt;em&gt;Automotive Grade Linux (AGL)&lt;/em&gt;. This is a bunch of softwares which build a custom kernel and one can use the library to create an interface.&lt;/p&gt;&lt;p&gt;To test it, I compiled the “sample”. And launched it in &lt;em&gt;QEMU&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;It was both cool and underwhelming. The base interface made it &lt;em&gt;really&lt;/em&gt; clear that using this library to construct a fully custom interface was &lt;strong&gt;definitely not&lt;/strong&gt; a one-day thing. More like a months long adventure in multiple programming language from &lt;em&gt;C&lt;/em&gt; to &lt;em&gt;Python&lt;/em&gt; and promised a &lt;strong&gt;lot&lt;/strong&gt; of recompiling kernels. &lt;/p&gt;&lt;p&gt;Which even with my decent laptop, would be long, &lt;em&gt;very&lt;/em&gt; long.&lt;/p&gt;&lt;p&gt;So even if it looked good I decided to give up on it.&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;https://docs.automotivelinux.org/en/salmon/&apos;&gt;Source: Automative Grade Linux Documentation&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&apos;aa&apos;&gt;&lt;a href=&apos;#aa&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Android Auto.&lt;/h3&gt;&lt;p&gt;While my dad was thinking and still searching on the web I decided to search for something very particular.&lt;/p&gt;&lt;p&gt;Surely, someone, somewhere, would have managed to run &lt;a href=&apos;https://www.android.com/intl/en_gb/auto/&apos;&gt;&lt;em&gt;Android Auto&lt;/em&gt;&lt;/a&gt; on a good old x86_64 computer right?&lt;/p&gt;&lt;p&gt;It turns out that &lt;em&gt;yes&lt;/em&gt; someone did. And that someone, is &lt;a href=&apos;https://developer.android.com/training/cars/testing/dhu&apos;&gt;Google itself&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;So the last link open to the “Test” page. It was &lt;em&gt;originally&lt;/em&gt; made to test Android Auto applications in the development/integration phase.&lt;/p&gt;&lt;p&gt;But it turns out you can just connect it to a phone and using it like regular old android auto. It works just like the real thing. Just need a couple &lt;em&gt;adb&lt;/em&gt; commands as well as a manipulation on the phone.&lt;/p&gt;&lt;h3 id=&apos;aadhu&apos;&gt;&lt;a href=&apos;#aadhu&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Get the Android Auto Desktop Head Unit.&lt;/h3&gt;&lt;p&gt;There is only one way to get the Android Auto Desktop Head Unit, you need to download the &lt;em&gt;whole&lt;/em&gt; Android SDK, through &lt;em&gt;Android Studio&lt;/em&gt;. And then you need to pick to download the &lt;em&gt;Desktop Head Unit (DHU)&lt;/em&gt;. &lt;/p&gt;&lt;p&gt;Once you do that, you get the DHU binary and one shared library in the following path:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;$SDK_LOCATION/extras/google/auto/&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;You need both the &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;desktop_head_unit&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Binary, as well as the &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;libusb.so &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Shared library.&lt;/p&gt;&lt;h3 id=&apos;dhuphone&apos;&gt;&lt;a href=&apos;#dhuphone&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Run and connect the DHU to a Phone&lt;/h3&gt;&lt;p&gt;You need to prepare the phone you’re connecting to.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;First, you need to activate the &lt;em&gt;Android’s Developer Settings&lt;/em&gt; on your phone.&lt;/li&gt;&lt;li&gt;Then, you need to install &lt;em&gt;Android Auto&lt;/em&gt; if it’s not already installed.&lt;/li&gt;&lt;li&gt;Finally, you need to activate the &lt;em&gt;Android Auto’s Developer Settings&lt;/em&gt; on the app.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you follow all the steps from the Google Developer page you will have everything you need to start the DHU.&lt;/p&gt;&lt;p&gt;Connect your phone via USB and just run&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;./desktop_head_unit --usb&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;And… it didn’t work for us. We tried multiple phones but it didn’t work.&lt;/p&gt;&lt;p&gt;We needed to follow the rest of the page.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You need to start the &lt;em&gt;Head Unit Server&lt;/em&gt; on your phone&lt;/li&gt;&lt;li&gt;And you need to run a few commands on the computer host.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;adb forward tcp:5277 tcp:5277&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;./desktop_head_unit&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Then you connect your phone on USB to the Computer.&lt;/p&gt;&lt;p&gt;And &lt;strong&gt;~~ Voilà ~~&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;It works! You have a fully functional Android Auto experience on a laptop.&lt;/p&gt;&lt;h2 id=&apos;extras&apos;&gt;&lt;a href=&apos;#extras&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Extras&lt;/h2&gt;&lt;p&gt;Technically you could stop there. But it wouldn’t work very well.&lt;/p&gt;&lt;p&gt;We performed a few more steps in order to improve the experience.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;First, we modified the authentificator to auto-log.&lt;/li&gt;&lt;li&gt;Then, we modified the Xorg start script to automatically forward the ports, and launch the DHU.&lt;/li&gt;&lt;li&gt;Finally, we made a MACRO on my dad’s phone, to automatically start the &lt;em&gt;Head Unit Server&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;enjoy&apos;&gt;&lt;a href=&apos;#enjoy&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Enjoy&lt;/h2&gt;&lt;h3 id=&apos;build&apos;&gt;&lt;a href=&apos;#build&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;End of the build&lt;/h3&gt;&lt;p&gt;&lt;a href=&apos;/static/before_mounting.jpg&apos;&gt;&lt;img src=&apos;/static/before_mounting.jpg&apos; alt=&apos;End&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The build at the end of the steps, the keyboard is folded behind the screen.&lt;/p&gt;&lt;h3 id=&apos;installation&apos;&gt;&lt;a href=&apos;#installation&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Installation&lt;/h3&gt;&lt;p&gt;&lt;a href=&apos;/static/mounted_one.jpg&apos;&gt;&lt;img src=&apos;/static/mounted_one.jpg&apos; alt=&apos;Installation&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This is what it looks installed inside of our Panda.&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/finished.jpg&apos;&gt;&lt;img src=&apos;/static/finished.jpg&apos; alt=&apos;Finished&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&apos;/static/finished_online.jpg&apos;&gt;&lt;img src=&apos;/static/finished_online.jpg&apos; alt=&apos;Finished Online&apos;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It looks like that installed and online aboard the vehicle, ain’t it cute?&lt;/p&gt;</content></entry><entry><title>BR# DevLog 0: Announcing BaguetteSharp… Oxidised</title><id>https://www.charlotte-thomas.me/blog/baguette_sharp_oxidised</id><updated>2025-03-30T00:00:00+00:00</updated><link href="https://www.charlotte-thomas.me/blog/baguette_sharp_oxidised" rel="alternate" type="text/html" title="BR# DevLog 0: Announcing BaguetteSharp… Oxidised"/><published>2025-03-30T00:00:00+00:00</published><content xml:base="https://www.charlotte-thomas.me/blog/baguette_sharp_oxidised" type="html">&lt;h2 id=&apos;what&apos;&gt;&lt;a href=&apos;#what&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;BaguetteWhat?&lt;/h2&gt;&lt;p&gt;Baguette# or BaguetteSharp or Baguette, is my &lt;a href=&apos;https://esolangs.org/wiki/Baguette&apos;&gt;joke programming language&lt;/a&gt; I made for the kicks, for the joke, for my TIPE, everything.&lt;/p&gt;&lt;p&gt;I liked it but the &lt;a href=&apos;https://ocaml.org&apos;&gt;OCaml&lt;/a&gt; code is &lt;em&gt;horrible&lt;/em&gt;. The Lexer and Parser are easy enough to understand, but the code of the &lt;a href=&apos;https://github.com/vanilla-extracts/ocaml-baguettesharp-interpreter/blob/master/src/interpreter.ml#L39&apos;&gt;interpreter&lt;/a&gt; is absolutely unreadable.&lt;/p&gt;&lt;p&gt;There is many reasons of &lt;em&gt;why&lt;/em&gt; this code is so unreadable. First, I coded this interpreter under &lt;em&gt;IV morphine&lt;/em&gt; at the &lt;em&gt;hospital&lt;/em&gt;. Which is not a very good moment to code something. Like not at all. Second, I was pretty new at the whole interpreting stuff.&lt;/p&gt;&lt;h2 id=&apos;rust&apos;&gt;&lt;a href=&apos;#rust&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Rust Edition&lt;/h2&gt;&lt;p&gt;Yes oxidised like rust like Rust as in the language I know I’m really funny.&lt;/p&gt;&lt;p&gt;It’s not just a stylistic project as well, it’s important to properly implement LLVM to make a functional compiler from a &lt;em&gt;strong&lt;/em&gt; codebase instead of bodged one.&lt;/p&gt;&lt;p&gt;It will also allow me to make a LSP implementation.&lt;/p&gt;&lt;h2 id=&apos;follow&apos;&gt;&lt;a href=&apos;#follow&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Where can we follow&lt;/h2&gt;&lt;p&gt;There is three git repos:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The &lt;a href=&apos;https://git.charlotte-thomas.me/vanilla-extracts/baguette_sharp_oxidised&apos;&gt;main repo&lt;/a&gt; in my own forge&lt;/li&gt;&lt;li&gt;The &lt;a href=&apos;https://codeberg.org/vanilla-extracts/baguette_sharp_oxidised&apos;&gt;codeberg nightly mirror&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The &lt;a href=&apos;https://github.com/vanilla-extracts/baguette_sharp_oxidised&apos;&gt;GitHub stable mirror&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;words&apos;&gt;&lt;a href=&apos;#words&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Closing words&lt;/h2&gt;&lt;p&gt;See you next DevLog entry :)&lt;/p&gt;</content></entry><entry><title>Services</title><id>https://www.charlotte-thomas.me/blog/services</id><updated>2025-03-24T00:00:00+00:00</updated><link href="https://www.charlotte-thomas.me/blog/services" rel="alternate" type="text/html" title="Services"/><published>2025-03-24T00:00:00+00:00</published><content xml:base="https://www.charlotte-thomas.me/blog/services" type="html">&lt;h2 id=&apos;ambassador&apos;&gt;&lt;a href=&apos;#ambassador&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Ambassador&lt;/h2&gt;&lt;p&gt;I have a few services on my Hetzner VPS/Cloud, its hostname is &lt;em&gt;ambassador&lt;/em&gt; after the &lt;em&gt;Ambassador-class&lt;/em&gt; starships in Star Trek (all my hostnames are Star Trek starship classes).&lt;/p&gt;&lt;p&gt;I run on this server:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A &lt;a href=&apos;https://git.charlotte-thomas.me/&apos;&gt;Git Forge&lt;/a&gt; as well as a runner&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://github.com/girlbossceo/conduwuit&apos;&gt;conduwuit (matrix server)&lt;/a&gt; instance (faefox.dev)&lt;/li&gt;&lt;li&gt;An instance of &lt;a href=&apos;https://client.faefox.dev&apos;&gt;Cinny (matrix client)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href=&apos;https://uptime.faefox.dev&apos;&gt;service status page&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;page&apos;&gt;&lt;a href=&apos;#page&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;CloudFare Page&lt;/h2&gt;&lt;p&gt;I use CloudFare Page to run a few static websites.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&apos;https://www.charlotte-thomas.me&apos;&gt;Personal Web and Blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&apos;https://writing.charlotte-thomas.me&apos;&gt;Writing Web, Blog, and Online Reader (SOON)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&apos;https://calc.charlotte-thomas.me&apos;&gt;Calc Web&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;image&apos;&gt;&lt;a href=&apos;#image&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Migadu&lt;/h2&gt;&lt;p&gt;I use &lt;em&gt;Migadu&lt;/em&gt; as my email provider. I use the micro yearly plan, for only $20 USD a year I have everything I need. I have emails under the following domains.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;charlotte-thomas.me&lt;/em&gt;&lt;ul&gt;&lt;li&gt;me&lt;/li&gt;&lt;li&gt;gc&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;faefox.dev&lt;/em&gt;&lt;ul&gt;&lt;li&gt;me&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;nwa2coco.fr&lt;/em&gt; (to be deleted on May 2025)&lt;ul&gt;&lt;li&gt;charlotte&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;nas&apos;&gt;&lt;a href=&apos;#nas&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;NAS&lt;/h2&gt;&lt;p&gt;I have a NAS (2TB on RAID1) running on my &lt;strong&gt;local&lt;/strong&gt; network. Its name is &lt;em&gt;Olympic&lt;/em&gt; (because it is old, big, and vulnerable)&lt;/p&gt;&lt;p&gt;I have twice daily backups using &lt;em&gt;restic&lt;/em&gt; on it.&lt;/p&gt;&lt;h2 id=&apos;hostnames&apos;&gt;&lt;a href=&apos;#hostnames&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Hostnames&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;My personal laptop is &lt;em&gt;Defiant&lt;/em&gt; (because it’s tough, and little)&lt;/li&gt;&lt;li&gt;My work laptop is &lt;em&gt;Galaxy&lt;/em&gt; (because it’s big)&lt;/li&gt;&lt;li&gt;My personal phone is &lt;em&gt;Danube&lt;/em&gt; (because it’s small)&lt;/li&gt;&lt;li&gt;My NAS is &lt;em&gt;Olympic&lt;/em&gt;&lt;/li&gt;&lt;li&gt;My VPS is &lt;em&gt;Ambassador&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&apos;future&apos;&gt;&lt;a href=&apos;#future&apos; class=&apos;anchor&apos;&gt;&lt;/a&gt;Plans for the future&lt;/h2&gt;&lt;p&gt;In the future, when I have my own home, with my own Network (because I am moving to a place where I don’t control it for the moment), my plan is to run a Server/NAS where I can store my data and expose it to the web to run my applications and everything I need&lt;/p&gt;&lt;p&gt;In the plans there is:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Everything I run on my VPS&lt;/li&gt;&lt;li&gt;A NAS (maybe with TrueNAS?)&lt;/li&gt;&lt;li&gt;A NextCloud&lt;/li&gt;&lt;li&gt;A web equivalent to Google Docs/Google Sheets&lt;/li&gt;&lt;li&gt;A Plex Server &lt;/li&gt;&lt;li&gt;An OpenStack instance (to do ansible and terraform on)&lt;/li&gt;&lt;li&gt;And everything that strike my fancy&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The budget will be around &lt;strong&gt;€1,500&lt;/strong&gt; to build it, and the minimum spec I want are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;CPU: 8C/16T, reasonably recent&lt;/li&gt;&lt;li&gt;GPU: An Intel ARC for transcoding&lt;/li&gt;&lt;li&gt;RAM: 64GB&lt;ul&gt;&lt;li&gt;32GB for the NAS&lt;/li&gt;&lt;li&gt;32GB for the VMs&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Storage:&lt;ul&gt;&lt;li&gt;8TB in RAID5 with HDD&lt;/li&gt;&lt;li&gt;512GB in RAID1 on NVMe&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;PSU:&lt;ul&gt;&lt;li&gt;Gold Rated Unit &lt;/li&gt;&lt;li&gt;An UPS&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Silent Fans.&lt;/li&gt;&lt;li&gt;LAN: 2.5 Gbit/s &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I don’t know if I want to run it on a rack or not. I think not.&lt;/p&gt;&lt;p&gt;Everything is &lt;em&gt;very&lt;/em&gt; subject to changes. It’s the early version of what I’m thinking. I may scrap it and run it from an old motherboard because I would have updated my Framework. Maybe. So it can change it’s just what I’m feeling at the moment.&lt;/p&gt;&lt;p&gt;It won’t exists for another year and a half (or more); but it will probably be under some subdomains of &lt;code class=&apos;scode&apos;&gt;charlotte-thomas.me&lt;/code&gt; and/or &lt;code class=&apos;scode&apos;&gt;faefox.dev&lt;/code&gt;&lt;/p&gt;</content></entry></feed>