diff --git a/.gitignore b/.gitignore index 485dee6..8daf605 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .idea +result diff --git a/config.toml b/config.toml index 6d43950..20429e2 100644 --- a/config.toml +++ b/config.toml @@ -2,8 +2,6 @@ base_url = "https://cherrykitten.dev" title = "CherryKitten" -theme = "cherrykitten" - compile_sass = true # Whether to build a search index to be used later on by a JavaScript library diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..2c57a69 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1713596654, + "narHash": "sha256-LJbHQQ5aX1LVth2ST+Kkse/DRzgxlVhTL1rxthvyhZc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "fd16bb6d3bcca96039b11aa52038fafeb6e4f4be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index 174f70b..6c3e60f 100644 --- a/flake.nix +++ b/flake.nix @@ -1,12 +1,30 @@ { - description = "Zola based website"; + description = "cherrykitten.dev"; - inputs = { - nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; - }; + inputs.nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + inputs.flake-utils.url = "github:numtide/flake-utils"; - outputs = { self, nixpkgs }: { - - - }; + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in + { + packages.website = pkgs.stdenv.mkDerivation { + pname = "cherrykitten.dev"; + version = "0"; + src = ./.; + nativeBuildInputs = [ pkgs.zola ]; + buildPhase = "zola build"; + installPhase = "cp -r public $out"; + }; + defaultPackage = self.packages.${system}.website; + devShell = pkgs.mkShell { + packages = with pkgs; [ + zola + ]; + }; + } + ); } + diff --git a/public/404.html b/public/404.html deleted file mode 100644 index c17c6e9..0000000 --- a/public/404.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - -404 - - - - - - - - - - - - - - - -
- -
- - - - - - -
- - -
- -
-

Lost?

-

This page does not exist.

-
- -
- - - - - -
- - - diff --git a/public/about/index.html b/public/about/index.html deleted file mode 100644 index 0f032ab..0000000 --- a/public/about/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - About Me | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - -
- - -
- -
- -

About Me

- - - - - -
-

I'm Sammy. A queer catgirl who loves working with computers. -My pronouns are It/Its. Only It/Its. -I love learning new things, trying out new technologies and exploring the unknown.

-

My first little steps into the world of IT already started as a little kitten. -At age 12, I started learning LUA and the basics of server infrastructure -to host Gameservers with custom code for a video game I had been playing.

-

Since then, I have been continuously expanding my knowledge in both programming and administration.

-

The linux command line is my cozy place. I selfhost almost everything. -From cloud storage and media streaming to password management and social media. I also love Open Source. I like -contributing to Open Source-Software and building my own tools to share with the world.

-

I am experienced in Web-Development with HTML, CSS, and JavaScript, including Frameworks like React, Vue.js, and Svelte, -as well as Backend-Development with NodeJS and Rust. I also know Python, and am generally able to learn new programming -languages well and understand them quickly, even if I haven't used them much before. For example, I have also worked -with PHP and Java Code in the past. Like I said, I love learning new things.

-

Besides all that computer stuff, I love sewing, especially making cute plushies. I also try to spend at least as much -time outside in nature as I do inside in front of a computer screen. I love being around water and wild animals, I love -walking through -forests and listening to all the beautiful birdsongs.

-

Sometimes I try to make music and visual arts, it might not be much yet, but it's fun to play around with.

- -
- - -
- -
- - - - - -
- - - diff --git a/public/blog-assets/birds/bill.jpg b/public/blog-assets/birds/bill.jpg deleted file mode 100644 index 160b8c7..0000000 Binary files a/public/blog-assets/birds/bill.jpg and /dev/null differ diff --git a/public/blog-assets/birds/one-pidgey.jpg b/public/blog-assets/birds/one-pidgey.jpg deleted file mode 100644 index 6387ff7..0000000 Binary files a/public/blog-assets/birds/one-pidgey.jpg and /dev/null differ diff --git a/public/blog-assets/birds/swan.png b/public/blog-assets/birds/swan.png deleted file mode 100644 index ae25870..0000000 Binary files a/public/blog-assets/birds/swan.png and /dev/null differ diff --git a/public/blog-assets/birds/two-pidgeys.jpg b/public/blog-assets/birds/two-pidgeys.jpg deleted file mode 100644 index 6ffb5d8..0000000 Binary files a/public/blog-assets/birds/two-pidgeys.jpg and /dev/null differ diff --git a/public/blog/being-queer-and-otherkin/index.html b/public/blog/being-queer-and-otherkin/index.html deleted file mode 100644 index b491c38..0000000 --- a/public/blog/being-queer-and-otherkin/index.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - Being Queer and Otherkin | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - -
- - -
- -
- -

Being Queer and Otherkin

- - - - - - - -
-

This is a bit more of a personal one, some background on me personally and on my identity.

-

As you might have noticed, I am a catgirl. But what does that actually mean? -For some, it might just be a weird cute thing they know from anime, others might think "a girl who likes cats". -For me, it means I am a cat and a girl (kinda). Both are equally important parts of my identity.

-

I am trans, I am nonbinary, and I am otherkin. I am also autistic. All of these are properties of me as a whole. They -add up to create this entity that's writing this post right now. Remove any single one of these properties, and you end -up with a completely different being.

-

What even is this 'otherkin' thing???

-

The Otherkin Wiki describes Otherkin as a subculture of people who don't consider -themselves human, although the specifics of what that means and how exactly it manifests can be very different on a -personal basis, and the term functions as an umbrella term for a lot of different experiences.

-

For me, it means that in every way other than my physical body, I am a cat. I don't identify as a cat, I don't -think that I'm a cat. I don't act like a cat. I am a cat. I did not choose to be a cat, being a cat is simply a -part of me, the same way my gender and my neurodivergencies are.

-

In that way, being otherkin is very similar to being trans. There are trans people who, having no idea how it actually -feels to be otherkin, disagree with this comparison, probably out of some kind of urge to appeal to a wider transmisic -society, hoping for easier acceptance by not associating with "those weird ones". Personally, from my experience of -living as a trans cat, those two things couldn't be any more similar.

-

I get the same kind of euphoria from getting referred to with feline-related terms that I get from being called a girl, -or from being referred to with my correct pronouns. When I look into a mirror, both the cat ears on my head and the -boobs on my body cause a little happy reaction. I love wearing a collar with a cute little bell the same way I love -wearing a skirt or making my dress go spinny. If you refer to me as "not a cat", I will feel a similar kind of hurt -and anger as if you misgender me. I don't need people in my life who can accept one part of me, while not respecting an -equally important part of me.

-

Many of my instinctive and natural behaviours align with the stereotypical cat. I meow at people to get their attention, -I get startled really easily by sudden loud noises and will perk up in alert mode as a reaction. I bump my head against -people to show affection, and I'm always in the way when my girlfriend comes home and I rush over to greet her at the -door while she's trying to unpack. When I feel comfortable, I start kneading with my paws. I love chasing things and -trying to climb up places that are actually too high for me and then being scared of getting back down. The list goes on -and on.

-

And then there is the overlap of being a cat and being autistic. Many autistic traits are similar to animalistic -behaviour - Or the absence of "typical" human behaviour. I feel very uncomfortable around people who I don't know -well, while being very affectionate and active around people I trust and love. I get overstimulated and confused when a -lot of stuff is going on around me. I don't understand most human behaviours, and people think I'm unsociable and mean -when I act distressed or overwhelmed in response to their behaviours and expectations.

-

In the end, all these parts of me affect each other in many ways. My pronouns, It/Its represent my gender, being -distinct from the binaries made up by human society, and actively going against the notion of what pronouns are -acceptable or not. At the same time, they reinforce the non-human part of me. I am a cat, an animal, and thus my gender -expression - including pronouns - explicitly breaks human ideas of gender. While a lot of people also have different -reasoning for similar gender expressions, for me those aspects are deeply interlinked.

-

So.. that was a weird one to write. Writing about personal topics can be so much more complex and hard than writing -about touching computers. I hope this was interesting to read, maybe you even learned something new about people like me -or have gained some kind of new perspective on gender and species. Either way, thank you so much for reading my blog, -remember to stay hydrated, and have a lovely {time of day}!

- -
- - - - -
- -
- - - - - -
- - - diff --git a/public/blog/birds/index.html b/public/blog/birds/index.html deleted file mode 100644 index 6101c5a..0000000 --- a/public/blog/birds/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - Birds. | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - -
- - -
- -
- -

Birds.

- - - - - - - -
-

Birds. They're all around us. They are wonderful beings of pure bliss. I love them all.

-

I've wanted to write about "birds" as a general topic for a long time now. There's a lot to say, I have so many bits and pieces of drafts, ideas, thoughts. On birds themselves, on my personal relationship with them, on their cultural significance and how humanity treats them. This is my attempt at actually putting all of that into a semi-coherent text for you to read, or just to have actually written it all out. I don't know if anyone will get that much out of reading this, but I care about this topic deeply and I need to get these words out.

-

Why I love birds

-

I spend a big portion of my free time watching birds, feeding birds, hanging out with birds, admiring birds.

-

This started in 2022, during a pretty hard time in my life. -My then best friend - now wife! - had recently started carefully feeding the crows that hang out around her favorite spot, and introduced me to her new friends.

-

At first they kept their distance. They watched us throw the peanuts (unsalted!), waited for us to turn away, and then carefully picked them up. -Over time, they started to trust us more. They ate while we were looking, they came closer and closer, they started approaching us before we got any peanuts out. -Weeks and months passed, we visited the crows more regularly, and they noticed. They now come flying straight towards us long before we reach our spot, they jump around next to us, they follow us around, and they look at us with the cutest pleading eyes we've ever seen.

-

The first time I ever paw-fed a crow was a life-changing experience, and I'm not exaggerating. There was one crow that came even closer to us than the others. At some point I just tried holding my paw out for it, not really expecting much. Of course it didn't immediately eat out of my paw, but it did get curious. I repeatedly tried many times over the next weeks, and one day it just clicked. This "wild" animal decided that it now trusts me enough to walk right up to me, and eat peanuts out of my paw. We named that crow Bill. Bill regularly eats out of my paws and out of my wife's hands now. It's just a thing he does. He's a bird, living out in this big world, able to fly wherever he wants to, and he decides to fly up to us and eat directly from us. I appreciate this trust so goddamn much, every single time.

-

Similar relationships of trust have evolved with other birds too. There's a group of seagulls that has us throw food in a high angle and catches it mid-air, with a few of them even flying by close enough to snatch up peanuts that we're holding up towards them.

-

There are ducks and geese that regularly come quacking at us and eat out of our paws/hands. We have pigeons who knock on our window in the morning or when they hear us arrive at home. Even swans, those majestic big birds that everyone always keeps describing as "dangerous" and "aggressive" come walking up to us calmly, nicely ask for some food, and patiently wait for us to give it to them.

-

Birds treat you the same way you treat them. Show them respect and trust, and they'll give you the same.

-

How birds have changed my life

-

Now, in 2024, I basically don't leave the house without at least a pack of peanuts in my bag. These birds have changed how I go through my daily life, how I view the world around me, how I think and feel. -I pay so much more attention to my surroundings, -I notice the pigeons hushing in-between the crowds in the city, -I notice the alarm calls of the crows when they spot a falcon high up in the sky, -I notice the beautiful chattering of the magpies, -I notice the tiniest little bird singing at the top of their lungs, echoing through the neighborhood. -When I feel down, I spend time with birds. I watch them do their thing, I go "nyawwww" at their cute behaviors, and they make me feel better.

-

And I appreciate it all so much. These wonderful beings are all around us, and we don't appreciate them nearly enough.

-

Humans. People. Society.

-

In fact, unfortunately, a significant part of the society we live in, doesn't appreciate them at all. -Pigeons are often considered "dirty", described as "pests" and treated as annoying nuisances by the very same society that bred them for fun and games, brought them into their cities, kept them as pets, and then discarded them.

-

Crows are often described as "bad omens" and "signs of death", or associated with witchcraft and other so-called evils. People hate them for their loud calls, while claiming to enjoy the sounds of other songbirds (which crows also belong to!). Those same songbirds that they most likely can only hear because the nearby crows keep them safe from predators like falcons and hawks.

-

I wish I could claim that everything is always good and nice on my bird-feeding adventures. Sadly, there are negative experiences too. Those are never the birds' fault though. All the bad stories have to do with interactions with other humans.

-

Here's an anecdote from a few months ago: -We're standing outside, off from the main path, and feeding a group of pigeons. A child and their parent approach from afar. -The child sees us, turns to their parent, says "Isn't that forbidden???" and immediately proceeds to chase right through the group of pigeons on the ground, scaring them away.

-

Kids grow up learning that kindness towards "wild" animals is bad, but random acts of violence are okay.

-

Feeding birds, especially pigeons, is in fact illegal in many places. Destroying their habitats is "fine". Violence against them is "fine". But decide to do an objectively good thing, an act of pure kindness, helping some animal out, and suddenly you're a criminal.

-

Another time, a person walked up to us and started rambling:

-

"Hey I live over there in that big building, and the crows that you feed here always shit on our balconies. Can you please stop feeding them here so they stop doing that."

-

I was baffled at first, replying only with a "no?". Apparently they didn't like that answer, so they kept going on about how these disgusting animals are creating so much dirt they have to clean up and how that is our fault for feeding the crows right here, and how we should just feed them somewhere else so they stop shitting on their balcony. I tried calmly explaining to them that those crows have been here long before us or them, that the ancestors of those same crows have probably been shitting on trees where that house now stands centuries ago, and that crows are highly territorial animals that won't just leave the area they live in, but they didn't seem to care. They got angry at my oh-so-rude language (I basically said "crows just shit wherever the fuck they want") and walked away at some point.

-

It's a common occurrence that I'd talk about one kind of bird on social media, and then get comments like "Oh yeah I love crows too, but we should really get rid of pigeons!!!" and the cognitive dissonance of these kinds of disgustingly hateful comments fills me with so much anger. Just because I was talking only about crows in one post, someone deems it appropriate to approach me and tell me about how they want to destroy the lives of another bird species I hold dearly? -Hell, I made a post recently being upset at exactly that behavior, and shortly after someone replied with weird conspiracy-theory-adjacent explanations of why pigeons are supposedly evil.

-

I don't think I will ever be able to understand the way people think about the animals we share this world with, and frankly, I don't want to understand such a bleak and hateful view of the world. -Most of them were here long before humans, and they will probably still be here long after them. People destroyed their natural habitats, forced them to adapt to urban architecture, unleashed sickness and violence on them, and now they literally can't even shit anymore without being shunned for it. All they want to do is live their life, have a nice time, eat and shit and breed and sleep in peace, and apparently that's already too much.

-

The parallels here are hard to miss. Many people look at wild birds, and feel the same way as when they look at other people they deem inferior. When I see someone mistreating a wild pigeon, I know they'd probably treat a disabled queer person of color like me the same way if nobody was looking. -The only difference is that mistreating wild animals is even more socially accepted than transmisia, ableism, and racism are. Cowardly fascists can play out their violent fantasies on defenseless birds because they might be too scared to target another human that might be able to fight back, or is more likely to have someone come to their defense.

-

So, I consider open hatred and mistreatment of wild birds as a gigantic red flag. If I see you talking shit about pigeons, you're just as bad as if you were talking shit about me and my queer siblings, and I will unleash my army of birds on you.

-

A caw to action

-

Go out, feed some birds.

-

Make some avian dinosaur friends.

-

Break the laws prohibiting acts of kindness.

-

Do something nice for yourself and the wildlife around you.

-

And remember, All Crows Are Beautiful, All Cops Are Bastards, and if you see a Seagull stealing food from a restaurant table, no you didn't.

-

Thank you for reading through all this. As a "thank you"-treat, here are some photos of my beautiful bird friends :3

-

Bill, a black crow, sitting on top of a railing with water in the background.

-

A pigeon sitting on top of my paw, with a peanut in its beak.

-

Two pigeons sitting on top of my paws, held in a small cup shape, and eating.

-

A majestic swan in water, glistening in the sun.

- -
- - - - -
- -
- - - - - -
- - - diff --git a/public/blog/fediverse-isnt-just-mastodon/index.html b/public/blog/fediverse-isnt-just-mastodon/index.html deleted file mode 100644 index b406db0..0000000 --- a/public/blog/fediverse-isnt-just-mastodon/index.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - The Fediverse is more than just Mastodon | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - -
- - -
- -
- -

The Fediverse is more than just Mastodon

- - - - - - - -
-

With Twitter in a downwards spiral thanks to some rich guy whose name escapes me breaking everything, the Fediverse has been getting the biggest influx of new users in a very long time. -People have been recommending "Mastodon" as a Twitter alternative for a while now, causing #Mastodon to be the top trending Hashtag on many days.

-

Browsing that hashtag one can find a lot of misconceptions about what Mastodon is, how it works, and what its limitations are. These misconceptions are not just spread by people who dislike Mastodon and try to convince others not to use it, though. They are also perpetuated by people who seem to want to increase the userbase at all cost, regardless of whom it attracts to the Fediverse.

-

Mastodon, the "Twitter Alternative"

-

The biggest misconception already starts with the recommendation itself. "You should switch to Mastodon", "Mastodon is a great Twitter alternative", "on Mastodon you can do x and y and z". -"Mastodon" is just one small piece of a bigger puzzle. When you sign up on a Mastodon instance, you're not joining just Mastodon. -You are using Mastodon to join the so-called "Fediverse", a network of all kinds of different services that can all communicate with each other using a Protocol called ActivityPub.

-

Now, because so many people on sites like Twitter frame Mastodon as its own separate thing, new users who try out a big Mastodon instance and can't deal with its flaws, don't know better than to just write it off as bad and never look back. -Nobody told them that all their friends on Mastodon would also be reachable from a plethora of different platforms that they might be more comfortable with using. -That's the beauty of a federated web, there are always alternatives, always different ways of interacting with the same people over the same protocols and on the same network.

-

I'm imagining a world where the Top Trending Hashtag on Twitter is #Fediverse, with everyone talking about their favourite features of different platforms and explaining why it is not a Twitter alternative.

-

Wait, so it's not a Twitter Alternative?

-

No. It isn't. And anyone who is telling you that it is, is either doing so in bad faith, or has no idea what they're talking about. -Twitter is corporate social media, that's why it's full of ads and corporate accounts. It is designed to get its users addicted to the platform, to maximize engagement, drive up ad impressions and profit. To twitter you are just a collection of numbers, costs and profits. Nothing else.

-

The Fediverse exists to build communities. It is created by people, for people. Most contributors and server admins don't make any money from it. They work on everything in their free time, fund it out of their own pockets or through donations, and don't expect much in return.

-

'Most'?

-

Of course, like with every rule, there are exceptions. The above framing of Mastodon as the one special ActivityPub implementation that everyone constantly talks about, brought in lots of financial support for "Mastodon gGmbH", the "non-profit organization" founded by Mastodon maintainer Eugen Rochko. As of writing of this post, the organization earns about 30.000€ a month through patreon and has 52 corporate sponsors, including sketchy gambling sites and cryptocurrency firms. -None of this money is of any use for the wider Fediverse community. It goes towards the hosting of the "flagship instances" and the development of the version of the Mastodon code that very often gets changed in ways the wider community disapproves of, or refuses to implement features that would be useful or even neccessary for the process of building safe, inclusive communities.

-

The thousands of instance admins and developers of other Fediverse software, be it forks of Mastodon or completely different platforms, don't see a single cent of that money. -Instead, they have to deal with the increase in moderation effort due to millions of users suddenly flooding the Fediverse with demands of a second Twitter.

-

How moderation works

-

Moderation on the Fediverse is done manually by individuals. This is a feature, not a bug. Automated content moderation leads to many errors and intransparent policy enforcement. It is also very prone to abuse. -Every report is read by an actual person. Most platforms implement reports in a way that the moderators of the reporter's instance can see it, with an optional possibility to forward it to the instance of the reported user.

-

There are different tools moderators/admins can use to deal with problematic content/users. -Remote users can be individually silenced, meaning they don't show up in the federated timeline, but can still be followed, or they can be fully blocked from interacting with the instance at all. -The same actions can also be applied to whole instances. This is called "defederating", because the instances are no longer federating with each other. Some people are framing this as a bad thing, claiming it would be wrong for instance admins to decide who their users can follow and interact with. This is where the importance of instance choice comes in.

-

"It doesn't matter what instance you're on, just pick one!!!"

-

Ugh. If I had a penny for every time I saw someone make this claim, I'd have to never work a day in my life again.

-

It's wrong. It's so damn wrong that I honestly can't believe anyone has ever made this claim in good faith.

-

The instance you choose is probably the most important factor to determine how much you will enjoy your time on the Fediverse. -Your instance choice decides what cool features you have access to (because different instances can use different software), it decides who can interact with you, who you can follow, who you see on the different timelines, and how safe you are from seeing things you definitely do not want to see.

-

Instances all have their own moderation team, rules, and code of conduct. Before you sign up for an instance, you should read their about page and rules, to determine if their views align with yours. That's right, instances have explicit values! If you want to be on an instance that doesn't moderate at all, you're free to choose one. You'll just have to deal with the fact that a lot of people will block you instead. -If you care about community and friendly, respectful interactions, a well-moderated instance that has a code of conduct you agree with is the right place for you. There your reports will actually be read and acted upon. -Please remember that the moderators are just people doing it in their free-time though. They can't react to everything instantly, and they might be overwhelmed sometimes. Be nice to them and don't abuse the report systems, work together to build a nice and friendly community.

-

"But the official instance is probably a good place to start, right? ...right?"

-

First of all, there is no "official" instance. The Fediverse is an open-source community project. There is no authority to claim anything as official. -There are two big instances run by Eugen Rochko, which often are falsely described as official Mastodon instances, mastodon.social and mastodon.online. -Those instances have 250.000 and 87.000 users respectively, and until recently were "moderated" by a single person, Eugen himself. -I'm putting "moderated" in quotes for a reason. There is barely any moderation going on there. Lots of harassment originates from there. But unfortunately, since so many new users get tricked into signing up for them it's not as easy to just block them the way you would smaller instances that become problematic. -Recently a lot of instances have started to block .social and .online anyways, because they just can not deal with the huge increase in moderation effort. There have been PSAs going around for people to please switch to smaller instances if they want to continue to interact with their friends, but it's sadly impossible to reach everyone.

-

Some more resources

-

Now you're probably asking yourself "okay, but how do I find a good instance? It's all so overwhelming and complicated!!" and like with most problems, the community has already created the resources you need.

-
    -
  • Fedi.tips has a lot of explanations and information for newer users.
  • -
  • Fediverse.party shows off all of the different software that exists to interact with the Fediverse and makes it easy to find instances running on those different platforms. I would really strongly suggest trying out something different from Mastodon. It'll be worth it.
  • -
  • Fediverse.info has a tool to dicsover users to follow. It is opt-in, meaning everyone on the list consented to be findable through it.
  • -
  • f00fc7c8@kind.social wrote a thread about the history of federated social media and the Fediverse.
  • -
-

Welcome to the Fediverse!

-

There are still a lot of things I haven't directly adressed in this post. It would be impossible for one on its own to think of everything. -So once you've signed up on a small cozy Fediverse instance, look through the Hashtag #FediTips, write and #Introduction post, ask whatever questions you might still have and start making lots of new friends. -Welcome to the Fediverse 💜.

- -
- - -
- -
- - - - - -
- - - diff --git a/public/blog/index.html b/public/blog/index.html deleted file mode 100644 index c006693..0000000 --- a/public/blog/index.html +++ /dev/null @@ -1,275 +0,0 @@ - - - - - CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - -
- - -
- -
-
- -

Birds.

- - - - - - - -
-

Birds. They're all around us. They are wonderful beings of pure bliss. I love them all.

-

I've wanted to write about "birds" as a general topic for a long time now. There's a lot to say, I have so many bits and pieces of drafts, ideas, thoughts. On birds themselves, on my personal relationship with them, on their cultural significance and how humanity treats them. This is my attempt at actually putting all of that into a semi-coherent text for you to read, or just to have actually written it all out. I don't know if anyone will get that much out of reading this, but I care about this topic deeply and I need to get these words out.

- -
-
- - - Read more  - ↩︎ - -
- - -
- -
- -

Being Queer and Otherkin

- - - - - - - -
-

This is a bit more of a personal one, some background on me personally and on my identity.

-

As you might have noticed, I am a catgirl. But what does that actually mean? -For some, it might just be a weird cute thing they know from anime, others might think "a girl who likes cats". -For me, it means I am a cat and a girl (kinda). Both are equally important parts of my identity.

-

I am trans, I am nonbinary, and I am otherkin. I am also autistic. All of these are properties of me as a whole. They -add up to create this entity that's writing this post right now. Remove any single one of these properties, and you end -up with a completely different being.

- -
-
- - - Read more  - ↩︎ - -
- - -
- -
- -

Learning Rust: A kitten's guide to Options and Results

- - - - - - - -
-

To unwrap() or not to unwrap(), that is the question:

-

So I've finally given in and started to learn Rust last month. It's a really cool programming language, -with some interesting differences to what I've used before. (JavaScript and Python, mostly)

-

There are some really pawesome guides out there, "The Rust programming language" is -definitely a must-read in my opinion, and Rustlings is nyamazing for -anyone who likes to learn by actively working through interactive problems.

-

After reading through a lot of those big thorough guides by experienced Rust developers, I've started working on -my first actual Project. I approached the development of this project by just trying to get small parts of it -working in any way I can manage, and then build upon this. In that process, I learned a lot of small subtilties that -guides like the ones named above just can't really cover. This post is for sharing those things, those cool little -tips to make your first Rust project just a little cleaner and more Rust-y. Originally I wanted to make this about a lot -of different topics, but then I've realized that my notes already contain so many things about just one part of Rust: -The Enums Option and Result. So this post will be about those, and hopefully will mark the start of a series on this blog.

-

While reading through this, you might think that the things I'm mentioning are obvious. That's okay, and that's the point. -Nothing is ever completely obvious to everyone, and this is for those like me, who often don't immediately recognize -the "obvious". And, to be honest, I am writing this just as much for myself, writing all of that stuff down to aid me in my -own ongoing learning process.

-

So, let's start!

- -
-
- - - Read more  - ↩︎ - -
- - -
- -
- -

The Fediverse is more than just Mastodon

- - - - - - - -
-

With Twitter in a downwards spiral thanks to some rich guy whose name escapes me breaking everything, the Fediverse has been getting the biggest influx of new users in a very long time. -People have been recommending "Mastodon" as a Twitter alternative for a while now, causing #Mastodon to be the top trending Hashtag on many days.

-

Browsing that hashtag one can find a lot of misconceptions about what Mastodon is, how it works, and what its limitations are. These misconceptions are not just spread by people who dislike Mastodon and try to convince others not to use it, though. They are also perpetuated by people who seem to want to increase the userbase at all cost, regardless of whom it attracts to the Fediverse.

- -
-
- - - Read more  - ↩︎ - -
- - -
- -
- -
- - - - - -
- - - diff --git a/public/blog/page/1/index.html b/public/blog/page/1/index.html deleted file mode 100644 index a4564a1..0000000 --- a/public/blog/page/1/index.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - -Redirect -

Click here to be redirected.

diff --git a/public/blog/rust-options-results/index.html b/public/blog/rust-options-results/index.html deleted file mode 100644 index 953f45c..0000000 --- a/public/blog/rust-options-results/index.html +++ /dev/null @@ -1,348 +0,0 @@ - - - - - Learning Rust: A kitten's guide to Options and Results | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - -
- - -
- -
- -

Learning Rust: A kitten's guide to Options and Results

- - - - - - - -
-

To unwrap() or not to unwrap(), that is the question:

-

So I've finally given in and started to learn Rust last month. It's a really cool programming language, -with some interesting differences to what I've used before. (JavaScript and Python, mostly)

-

There are some really pawesome guides out there, "The Rust programming language" is -definitely a must-read in my opinion, and Rustlings is nyamazing for -anyone who likes to learn by actively working through interactive problems.

-

After reading through a lot of those big thorough guides by experienced Rust developers, I've started working on -my first actual Project. I approached the development of this project by just trying to get small parts of it -working in any way I can manage, and then build upon this. In that process, I learned a lot of small subtilties that -guides like the ones named above just can't really cover. This post is for sharing those things, those cool little -tips to make your first Rust project just a little cleaner and more Rust-y. Originally I wanted to make this about a lot -of different topics, but then I've realized that my notes already contain so many things about just one part of Rust: -The Enums Option and Result. So this post will be about those, and hopefully will mark the start of a series on this blog.

-

While reading through this, you might think that the things I'm mentioning are obvious. That's okay, and that's the point. -Nothing is ever completely obvious to everyone, and this is for those like me, who often don't immediately recognize -the "obvious". And, to be honest, I am writing this just as much for myself, writing all of that stuff down to aid me in my -own ongoing learning process.

-

So, let's start!

- -

Firstly, a very quick introduction. Option and Result are part of the Rust standard library. Quoting the official documentation -is probably the easiest way to summarize their purpose:

-
-

Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not. Option types are very common in Rust code, as they have a number of uses:

-
    -
  • Initial values
  • -
  • Return values for functions that are not defined over their entire input range (partial functions)
  • -
  • Return value for otherwise reporting simple errors, where None is returned on error
  • -
  • Optional struct fields
  • -
  • Struct fields that can be loaned or “taken”
  • -
  • Optional function arguments
  • -
  • Nullable pointers
  • -
  • Swapping things out of difficult situations
  • -
-
-

and

-
-

Result<T, E> is the type used for returning and propagating errors. It is an enum with the variants, Ok(T), representing success and containing a value, and Err(E), representing error and containing an error value.

-
-

At first, it seems so easy to just add a quick .unwrap() after every Option or Result, but this comes with -the disadvantage of your code panicking if it fails to unwrap. -Sometimes, this can be useful during development, to discover potential error cases you might not have thought about, but -is usually not what you want to happen.

-

So, what can you do instead?

-

First of all, don't use unwrap() unless you are completely sure that the value will never panic. Sometimes that is the -case, because an earlier part of your code already made sure that it is Ok or Some.

-

In some cases, you actually want the program to panic. But even then, there is a slightly better way. You can use expect("foo") -to add a message to the panic, so the user actually knows what went wrong. That message should be worded in a specific way, -basically telling the user what you expected to happen.

-
fn main() {
-    let x = Some("Hello, World");
-    // There is no actual "None" type/value in Rust,
-    // this "None" is more specifically Option::None
-    let y: Option<String> = None;
-
-    let z = x.unwrap(); // We explicitly set this to Some, so we can safely unwrap it
-    let rip = y.expect("expected y to not be None");
-
-    println!("{}, {} will never print because it panics above", z, rip);
-}
-
-

There are also the non-panicking siblings of unwrap(), like unwrap_or(), unwrap_or_else() and unwrap_or_default().

-
fn main() {
-    let a: Option<String> = None;
-    let b: Option<i32> = None;
-    let c: Option<bool> = None;
-
-    // unwrap_or() lets you supply a specific value to use if the Option is None
-    let x = a.unwrap_or("Hello there".to_owned());
-
-    // unwrap_or_default() uses the types default value if the Option is None
-    let y = b.unwrap_or_default();
-
-    // unwrap_or_else() lets you specify a closure to run if the Option is None
-    let z = c.unwrap_or_else(|| if 1 + 1 == 2 { true} else { false });
-
-    assert_eq!(x, "Hello there".to_owned());
-    assert_eq!(y, 0);
-    assert_eq!(z, true);
-}
-
-

And then there is this really cool question-mark operator, which comes in very handy once you go multiple functions deep -and keep having to work with more and more Results and Options. The way it works is that, if you have a None or an Error, -it passes up the handling of this one level higher, by returning out of the function early with a None or Error value itself.

-

Of course, since return types of functions have to be known at compile time, the question-mark operator only works inside -functions that already return Result or Option.

-
fn main() {
-    let x = 5;
-    let y = 10;
-    let z = 20;
-
-    match do_something(x, y, z) {
-        Some(result) => println!("Happy noises, {}", result),
-        None => println!("Sad noises"),
-    }
-}
-
-fn do_something(x: i32, y: i32, z: i32) -> Option<i32> {
-    let first_result = do_something_more(x, y)?;
-    let second_result = do_something_more(first_result, z)?;
-
-    Some(second_result)
-}
-
-fn do_something_more(x: i32, y: i32) -> Option<i32> {
-    Some(x + y)
-}
-
-

The advantage of this is that you only have to handle your None case exactly once. You don't have to add pattern matching, or -conditionals, or unwrap()s all over the place, just a cute little question mark that delegates the handling to some logic -higher up.

-

"But sammy!" you say, "the compiler keeps shouting at me when I use the question mark on Options when my function -returns Result `<-._.->´"

-

Don't worry my frien! Even this has been considered!

-

First of all, why does the compiler get upset? It's because the question-mark operator returns the same type that it's used on, -and Result and Option are different types. Because of that, I thought I'd have to manually handle None cases in all -of my Result-returning functions. Until one day, I was reading through some documentation (I know, I know, I'm a nerd who reads -through documentation for fun and not just to find specific things) and discovered Option::Ok_or().

-
-

Transforms the Option<T> into a Result<T, E>, mapping Some(v) to Ok(v) and None to Err(err).

-
-

This was a life-changer to me, and it was just hiding right there in plain sight. Now I can easily turn a None where there shouldn't -be a None into an Error to pass up with my pawesome question-mark operator!

-
fn main() -> Result<(), String> {
-    let x = function_that_returns_option().ok_or("error message".to_owned())?;
-    // Instead of:
-    // let x = function_that_returns_option().unwrap();
-    // or any of the other ways to handle None
-
-    assert_eq!(x, ());
-    Ok(x)
-}
-
-fn function_that_returns_option() -> Option<()> {
-    return Some(());
-}
-
-

The last thing I want to mention is both an example specific to Options, and a more general tip about how I discovered this one. -There is this wonderful friend for all Rust developers, called Clippy. No, not the Paperclip from Microsoft Word, but -A collection of lints to catch common mistakes and improve your Rust code. -Clippy is automatically installed when you install Rust via rustup, and it runs a whole lot of checks against your code -to tell you what you can improve.

-

In my case, I had the following piece of code:

-
let insert = (
-            tracks::title.eq(match tag.title() {
-                Some(title) => Some(title.to_string()),
-                None => None,
-            }),
-            tracks::track_number.eq(match tag.track() {
-                Some(track) => Some(track as i32),
-                None => None,
-            }),
-            tracks::disc_number.eq(match tag.disk() {
-                Some(track) => Some(track as i32),
-                None => None,
-            }),
-            tracks::path.eq(match path.to_str() {
-                None => return Err(Error::msg("Could not get path")),
-                Some(path) => path.to_string(),
-            }),
-            tracks::year.eq(match tag.year() {
-                Some(year) => Some(year as i32),
-                None => None,
-            }),
-            tracks::album_id.eq(match album {
-                Some(album) => Some(album.id),
-                None => None,
-            }),
-        );
-
-

This code builds an insert statement for the database holding my music metadata, getting the values from the tags of a file. -The tag fields are all Options, since the tags might be empty. The databse entries are also all Options, (at least on the Rust side, -on the database they are just values marked as possibly being Null). So my intuitive idea to build this was to just go through all the entries, -match the tag, put in Some(value) if there is a value, and Noneif there is none.

-

It works, it's not wrong, but there is a cleaner and more readable way to do this. And clippy told me right away, I ran it -from my IDE, and it told me:

-
-

Manual implementation of Option::map

-
-

Huh, okay. Let's check the documentation

-
-

Maps an Option<T> to Option<U> by applying a function to a contained value.

-
-

So basically exactly what I did with those match statements! -My IDE even had a button to just easily fix this automatically with one click:

-
let insert = (
-            tracks::title.eq(tag.title().map(|title| title.to_string())),
-            tracks::track_number.eq(tag.track().map(|track| track as i32)),
-            tracks::disc_number.eq(tag.disk().map(|track| track as i32)),
-            tracks::path.eq(match path.to_str() {
-                None => return Err(Error::msg("Could not get path")),
-                Some(path) => path.to_string(),
-            }),
-            tracks::year.eq(tag.year().map(|year| year as i32)),
-            tracks::album_id.eq(album.map(|album| album.id)),
-        );
-
-

Great, that looks a lot cleaner immediately! -Note how one of the lines was not changed, that's because that one sets a DB value which is NOT NULL, thus if the original Option is -a None it means something went wrong, and we should abort this insert and return with an Error.

-

And with that, we're done with my first blogpost about Rust, with hopefully many more to come! -As I said, I am still learning, and writing this is part of my learning process. That being said, if you find this interesting, -learned something from it, etc., feel free to leave me some feedback! I'd love to hear what you think! -And if I made mistakes, please also tell me. I'm always happy to learn more and to fix those mistakes so others can learn from them too.

-

Thank you so much for reading 💜

- -
- - - - -
- -
- - - - - -
- - - diff --git a/public/buttons.css b/public/buttons.css deleted file mode 100644 index 462f45e..0000000 --- a/public/buttons.css +++ /dev/null @@ -1 +0,0 @@ -.button-container{display:table;margin-left:auto;margin-right:auto}button,.button,a.button{position:relative;display:flex;align-items:center;justify-content:center;padding:8px 18px;margin-bottom:5px;text-align:center;border-radius:8px;border:1px solid rgba(0,0,0,0);appearance:none;cursor:pointer;outline:none;}button.outline,.button.outline,a.button.outline{background:rgba(0,0,0,0);box-shadow:none;padding:8px 18px}button.outline :hover,.button.outline :hover,a.button.outline :hover{transform:none;box-shadow:none}button.primary,.button.primary,a.button.primary{box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08)}button.primary:hover,.button.primary:hover,a.button.primary:hover{box-shadow:0 2px 6px rgba(50,50,93,.21),0 1px 3px rgba(0,0,0,.08)}button.link,.button.link,a.button.link{background:none;font-size:1rem}button.small,.button.small,a.button.small{font-size:.8rem}button.wide,.button.wide,a.button.wide{min-width:200px;padding:14px 24px}a.read-more,a.read-more:hover,a.read-more:active{display:inline-flex;background:none;box-shadow:none;padding:0;margin:20px 0;max-width:100%}.code-toolbar{margin-bottom:20px}.code-toolbar .toolbar-item a{position:relative;display:inline-flex;align-items:center;justify-content:center;padding:3px 8px;margin-bottom:5px;text-align:center;font-size:13px;font-weight:500;border-radius:8px;border:1px solid rgba(0,0,0,0);appearance:none;cursor:pointer;outline:none} \ No newline at end of file diff --git a/public/buttons/acab.gif b/public/buttons/acab.gif deleted file mode 100644 index c86ff0e..0000000 Binary files a/public/buttons/acab.gif and /dev/null differ diff --git a/public/buttons/antinft.gif b/public/buttons/antinft.gif deleted file mode 100644 index 1a4caf0..0000000 Binary files a/public/buttons/antinft.gif and /dev/null differ diff --git a/public/buttons/transnow2.gif b/public/buttons/transnow2.gif deleted file mode 100644 index 7f705aa..0000000 Binary files a/public/buttons/transnow2.gif and /dev/null differ diff --git a/public/cherrykitten.pgp b/public/cherrykitten.pgp deleted file mode 100644 index efd90ac..0000000 --- a/public/cherrykitten.pgp +++ /dev/null @@ -1,42 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -mDMEZWCNkhYJKwYBBAHaRw8BAQdAC699jm1epF8FAU+q3YYZEqTmxvAD6BwcRYIe -Bsilwmu0I0NoZXJyeUtpdHRlbiA8bnlhQGNoZXJyeWtpdHRlbi5kZXY+iI4EExYK -ADYWIQQmTPoaGUxYXfgi9nPAGny7phe9XwUCZWCO+AIbAQQLCQgHBBUKCQgFFgID -AQACHgUCF4AACgkQwBp8u6YXvV8pzwD+LlLMVybr6ErgfG+H9pDo3sd9UUis10OE -zT0Ma17ET9UA/ArXHSngCjGOpq+XHzrGNYIyTAmOHJ9Ggbt5fB7Lg1YPtCdDaGVy -cnlLaXR0ZW4gPGNvbnRhY3RAY2hlcnJ5a2l0dGVuLmRldj6IjgQTFgoANhYhBCZM -+hoZTFhd+CL2c8AafLumF71fBQJlYI2SAhsBBAsJCAcEFQoJCAUWAgMBAAIeBQIX -gAAKCRDAGny7phe9X9LiAPsFLg1iasafK+umRwxFQx7awO81PX9KQaTYTO7mEHdI -wwEA8ozJqIsAC7D/DFzB5qBK5ckquDYWmmBnPcc/YlEgZgS0HlNhbW15IDxzYW1t -eUBjaGVycnlraXR0ZW4uZGV2PoiRBBMWCgA5AhsBBAsJCAcEFQoJCAUWAgMBAAIe -BQIXgBYhBCZM+hoZTFhd+CL2c8AafLumF71fBQJlYI8hAhkBAAoJEMAafLumF71f -Sx0A/iqyNOTB9s/NDujTO37PAFPg0buWzbXJsSQycKfeYCRkAP4vlI7sXmHsk5Xn -Zp3svsgcbYH5gT1LUiKWVhPQKGQ8BLQqU2FtYW50aGEgWWlsbWF6IDxzeWlsbWF6 -QGNoZXJyeWtpdHRlbi5kZXY+iI4EExYKADYWIQQmTPoaGUxYXfgi9nPAGny7phe9 -XwUCZWCOhgIbAQQLCQgHBBUKCQgFFgIDAQACHgUCF4AACgkQwBp8u6YXvV8hJAD/ -eXnqKMtRYLrA3Ef0rIBOqcM2C0qF58qesaxAOEYpHQIA/0+3Zje5rV4LQbvjHBFY -Zg8TvRr0dD6y2Z8TV7Rp5swBtBdTYW1teSA8c2FtbXlAc2FtbXkubW9lPoiOBBMW -CgA2FiEEJkz6GhlMWF34IvZzwBp8u6YXvV8FAmVgjp0CGwEECwkIBwQVCgkIBRYC -AwEAAh4FAheAAAoJEMAafLumF71fdZ8A/19wgRYgzdxzbysUvoYJFI9aw38fLAUr -7ZJkv9I9iR2oAP4zSybBNw8/HXvjNoXgXIcgAONvsRHetWViQUjX7If7D7QjQ2hl -cnJ5S2l0dGVuIDxzZWNAY2hlcnJ5a2l0dGVuLmRldj6IjgQTFgoANhYhBCZM+hoZ -TFhd+CL2c8AafLumF71fBQJlYI7IAhsBBAsJCAcEFQoJCAUWAgMBAAIeBQIXgAAK -CRDAGny7phe9X8uYAQD8EjOKuyd/bJ8ekkOspYPqgevaJseevKCO97mzISt9JwEA -1jrZKHY74HBAie+LMc350vQtVQJj1hyQCFTOVq2fbwu4MwRlYI36FgkrBgEEAdpH -DwEBB0C+HXmMasXkPy+bjp6MZKXm4nsptoSluRPNlEtPpgXYOYj1BBgWCgAmFiEE -Jkz6GhlMWF34IvZzwBp8u6YXvV8FAmVgjfoCGwIFCQPCZwAAgQkQwBp8u6YXvV92 -IAQZFgoAHRYhBLklSZyBwUPH10/dPJjY91+wZYJ2BQJlYI36AAoJEJjY91+wZYJ2 -Oe0BAIU+S7AUfarDkqzs71+xrux3jskTeIQty0d0D2M1yFE/APsGfmtnEyIR8mwA -7tr3ocP09XopZawORsI8S18d7kSNBvDQAP95FD+AIhd0nyIWiyRX2cXjNBuff0lV -p3vA6FDTJ0hhKAEAnK4OFIRMhqQxBr/DPSALKeudyvt96DT2nNqALtMJlgG4OARl -YI4gEgorBgEEAZdVAQUBAQdAg56+jgA6++o+vu9Bdnjf/7oGmVYL0UN2DzxYYPQH -TyEDAQgHiH4EGBYKACYWIQQmTPoaGUxYXfgi9nPAGny7phe9XwUCZWCOIAIbDAUJ -A8JnAAAKCRDAGny7phe9X/Y0AQDsgwjJtxeXJ19rpKrltH25kljWnP3UaVwpWfN4 -QyYmYgEAhAvcNn6Hws2EX0ngaWGhEV9jw/lQjRWT04fGzEurKgy4MwRlYI43Fgkr -BgEEAdpHDwEBB0CWckEmcPqRMbMdkVwfssW2iRgfZrb7nW0PwT+xNcir64h+BBgW -CgAmFiEEJkz6GhlMWF34IvZzwBp8u6YXvV8FAmVgjjcCGyAFCQPCZwAACgkQwBp8 -u6YXvV9idgD/a8/VFSL6o6HlhuLMWBS3EhlsMnrZJpXIrYxEFoWcHe0BAPjhnpFB -wv+ibcJ44mu+QLb9rYECbLmkkST2m4z2L1kK -=6FuB ------END PGP PUBLIC KEY BLOCK----- diff --git a/public/color.css b/public/color.css deleted file mode 100644 index 70414ef..0000000 --- a/public/color.css +++ /dev/null @@ -1 +0,0 @@ -:root{--accent: rgb(235, 111, 146);--accent2: rgb(246, 193, 119);--accent3: rgb(62, 143, 176);--accent-alpha-70: rgba(235, 111, 146,.7);--accent-alpha-20: rgba(235, 111, 146,.2);--background: #232136;--color: #e0def4;--border-color: rgba(246, 193, 119, .1)} \ No newline at end of file diff --git a/public/contact/index.html b/public/contact/index.html deleted file mode 100644 index f0b5c80..0000000 --- a/public/contact/index.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - Contact | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - -
- - -
- -
- -

Contact

- - - - - -
-

You can find me in the following places:

- - -
- - -
- -
- - - - - -
- - - diff --git a/public/cv/index.html b/public/cv/index.html deleted file mode 100644 index 0d86e58..0000000 --- a/public/cv/index.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - CV | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - -
- - -
- -
- -

CV

- - - - - -
-
-

Technical Skills

- - - - - - - - -
LinuxNixOS, Arch Linux, Debian, RHEL
MonitoringGrafana + (Prometheus, Telegraf, InfluxDB), VictoraMetrics, Zabbix
DevOps / AutomationAnsible, Terraform, Vagrant, Git, Jenkins
NetworkingVPN (Wireguard, OpenVPN), Routing (RIP, OSPF, BGP)
VirtualizationKVM/QEMU, Proxmox, Docker
SecurityServer-Hardening, Security Best Practices, Vulnerability Assessment, Encryption, GPG, LUKS, TLS
Scripting & ProgrammingRust, Python, JavaScript, Shell, HTML, CSS, Nix
-
-
-

Certifications

-

Linux Professional Institute

-
    -
  • LPIC-1 (valid until 2028-02-13)
  • -
-

FreeCodeCamp.org

-
    -
  • Data Analysis with Python
  • -
  • Scientific Computing with Python
  • -
  • Quality Assurance
  • -
  • Data Visualization
  • -
  • Back End Development and APIs
  • -
  • Front End Development Libraries
  • -
  • JavaScript Algorithms and Data Structures
  • -
  • Responsive Web Design
  • -
-
-
-

Work Experience

-

Linux System Administrator

-

Famedly GmbH

-

06/2023-current

-

Management of Infrastructure for a Matrix-based messenger for providers of medical services, both cloud-based and on-premise, using Ansible. -Software-Development in Rust and Python.

-
    -
  • Ansible
  • -
  • Rust
  • -
  • Python
  • -
-
-
-

Linux & DevOps Engineer

-

netpengo GmbH

-

01/2023-06/2023

-

Infrastructure-Management, Development of Infrastructure-as-code using Ansible and Jenkins. -Automating administration tasks. -Monitoring and Incidence Management. Administration of various Web-Applications.

-
    -
  • Ansible
  • -
  • Jenkins
  • -
  • Grafana
  • -
  • Zabbix
  • -
  • Hetzner Cloud
  • -
  • GitLab
  • -
  • Terraform
  • -
-
-
-

Continuing Education / Open-Source-Work

-

11/2020-12/2022

-

Work on various Open-Source-Projects, various FreeCodeCamp.org courses, and personal infrastructure.

-
    -
  • Ansible
  • -
  • JavaScript
  • -
  • Python
  • -
  • Rust
  • -
-
-
-

Linux Engineer

-

Lacewing Tech GbR

-

05/2020-10/2020

-

Automation of server management, administrating LEMP Stack and FOSS-Software Hosting. Organisation of workshops.

-
    -
  • Ansible
  • -
  • Nginx
  • -
  • Nextcloud
  • -
  • Bitwarden
  • -
  • Jitsi
  • -
-
-
-

Linux Administrator

-

UCware GmbH

-

07/2019-11/2019

-

Linux-administration, Virtualization of servers and desktops; administration of GitLab, Ruby Applications, and Docker -Containers

-
    -
  • Ansible
  • -
  • Docker
  • -
  • KVM
  • -
  • Proxmox
  • -
  • GitLab
  • -
  • Redmine
  • -
-
- -
- - -
- -
- - - - - -
- - - diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index f261aef..0000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/public/footer.css b/public/footer.css deleted file mode 100644 index 9266452..0000000 --- a/public/footer.css +++ /dev/null @@ -1 +0,0 @@ -.footer{padding:40px 0;flex-grow:0;opacity:.5}.footer__inner{display:flex;align-items:center;justify-content:space-between;margin:0;width:760px;max-width:100%}@media (max-width: 899px){.footer__inner{flex-direction:column}}.footer a{color:inherit}.footer .copyright{display:flex;flex-direction:row;align-items:center;font-size:1rem;color:var(--light-color-secondary)}.footer .copyright--user{margin:auto;text-align:center}.footer .copyright>*:first-child:not(:only-child){margin-right:10px}@media (max-width: 899px){.footer .copyright>*:first-child:not(:only-child){border:none;padding:0;margin:0}}@media (max-width: 899px){.footer .copyright{flex-direction:column;margin-top:10px}} \ No newline at end of file diff --git a/public/header.css b/public/header.css deleted file mode 100644 index 660ecf2..0000000 --- a/public/header.css +++ /dev/null @@ -1 +0,0 @@ -.header{display:flex;flex-direction:column;position:relative}.header__inner{display:flex;align-items:center;justify-content:space-between}.header__logo{display:flex;flex:1}.header__logo:after{content:"";background:repeating-linear-gradient(90deg, var(--accent) 0%, rgba(0,0,0,0) 8%, var(--accent2) 50%, var(--accent3) 100%);display:block;width:100%;right:10px;border-radius:0 20px 20px 0}.header__logo a{flex:0 0 auto;max-width:100%}.header .menu{margin:20px 0}.header .menu__inner{display:flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.header .menu__inner li{color:var(--accent3)}.header .menu__inner li.active{color:var(--accent-alpha-70)}.header .menu__inner li:not(:last-of-type){margin-right:20px;margin-bottom:10px;flex:0 0 auto}.header .menu__sub-inner{position:relative;list-style:none;padding:0;margin:0}.header .menu__sub-inner:not(:only-child){margin-left:20px}.header .menu__sub-inner-more{position:absolute;background:var(--background);box-shadow:var(--shadow);color:#fff;border:2px solid;margin:0;padding:10px;list-style:none;z-index:99;top:35px;left:0}.header .menu__sub-inner-more-trigger{color:var(--accent);user-select:none;cursor:pointer}.header .menu__sub-inner-more li{margin:0;padding:5px;white-space:nowrap} \ No newline at end of file diff --git a/public/home/index.html b/public/home/index.html deleted file mode 100644 index c550ddd..0000000 --- a/public/home/index.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - Hello there! | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
- -

Hello there!

- - - - - -
- - Profile picture - -
-

Hi, I'm Sammy.

-

Welcome to my little website :3

-
-
///I like to meow
-fn main() {
-    loop {
-        println!("Meow!");
-    }
-}
-
-
-// Honestly I just wanted to have some kind of code block somewhere to see how pretty the syntax highlighting is
-
- -
- - -
- -
- - - - - -
- - - diff --git a/public/impressum/index.html b/public/impressum/index.html deleted file mode 100644 index f1eb4ff..0000000 --- a/public/impressum/index.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - Impressum | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
- -

Impressum

- - - - - -
-

Because I live in germany, I'm legally obligated to have this on here 🙄

-

Angaben gemäß § 5 TMG

-
Samantha Yilmaz
-c/o Postflex #3050
-Emsdettener Str. 10
-48268 Greven
-
-

Vertreten durch: Samantha Yilmaz

-

E-Mail: contact[at]cherrykitten[dot]dev

-

Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV: Samantha Yilmaz

- -
- - -
- -
- - - - - -
- - - diff --git a/public/index.html b/public/index.html deleted file mode 100644 index 856ab94..0000000 --- a/public/index.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-
- -

Hello there!

- - - - - -
- - Profile picture - -
-

Hi, I'm Sammy.

-

Welcome to my little website :3

-
-
///I like to meow
-fn main() {
-    loop {
-        println!("Meow!");
-    }
-}
-
-
-// Honestly I just wanted to have some kind of code block somewhere to see how pretty the syntax highlighting is
-
- -
- -
- -
- -
- - - - - -
- - - diff --git a/public/logo.css b/public/logo.css deleted file mode 100644 index ee0bd07..0000000 --- a/public/logo.css +++ /dev/null @@ -1 +0,0 @@ -.logo{display:flex;align-items:center;text-decoration:none;background:var(--accent);color:#000;padding:5px 10px;border-radius:20px 0 0 20px} \ No newline at end of file diff --git a/public/main.css b/public/main.css deleted file mode 100644 index f4a54ab..0000000 --- a/public/main.css +++ /dev/null @@ -1 +0,0 @@ -html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}body{margin:0;padding:0;font-family:Monaco,Consolas,Ubuntu Mono,monospace;font-size:1rem;line-height:1.54;background-color:var(--background);color:var(--color);text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-webkit-overflow-scrolling:touch;-webkit-text-size-adjust:100%}@media (max-width: 683px){body{font-size:1rem}}h1,h2{display:flex;align-items:center;font-weight:500;line-height:1.3;color:var(--accent2)}h3,h4,h5,h6{display:flex;align-items:center;font-weight:400;line-height:.8;color:var(--accent3)}h1{font-size:1.4rem}h2{font-size:1.3rem;padding-top:1rem;border-bottom:1px dashed var(--accent);padding-bottom:7px}h3{font-size:1.2rem;font-weight:bolder}h4,h5,h6{font-size:1.15rem}a{color:inherit}img{display:block;max-width:100%}img.left{margin-right:auto}img.center{margin-left:auto;margin-right:auto}img.right{margin-left:auto}p{margin-bottom:20px}figure{display:table;max-width:100%;margin:25px 0}figure.left img{margin-right:auto}figure.center img{margin-left:auto;margin-right:auto}figure.right img{margin-left:auto}figure figcaption{font-size:14px;padding:5px 10px;margin-top:5px;background:var(--accent);color:var(--background)}figure figcaption.left{text-align:left}figure figcaption.center{text-align:center}figure figcaption.right{text-align:right}code{font-family:monospace;font-feature-settings:normal;background:var(--accent-alpha-20);padding:1px 6px;margin:0 2px;font-size:.95rem}pre{font-family:monospace;padding:20px;font-size:.95rem;overflow:auto;border-top:1px solid rgba(255,255,255,.1);border-bottom:1px solid rgba(255,255,255,.1)}@media (max-width: 683px){pre{white-space:pre-wrap;word-wrap:break-word}}pre code{padding:0;margin:0;background:none}blockquote{border-top:1px solid var(--accent);border-bottom:1px solid var(--accent);margin:40px 0;padding:25px}@media (max-width: 683px){blockquote{padding-right:0}}blockquote:before{content:"”";font-family:Georgia,serif;font-size:3.875rem;position:absolute;left:-40px;top:-20px}blockquote p:first-of-type{margin-top:0}blockquote p:last-of-type{margin-bottom:0}blockquote p{position:relative}blockquote p:before{content:">";display:block;position:absolute;left:-25px;color:var(--accent)}table{table-layout:fixed;border-collapse:collapse;width:100%;margin:40px 0}table,th,td{border:none;padding:10px}th{color:var(--accent)}td{border-bottom:1px dotted var(--accent)}ul,ol{margin-left:30px;padding:0}ul li,ol li{position:relative}@media (max-width: 683px){ul,ol{margin-left:20px}}ol ol{list-style-type:lower-alpha}.container{display:flex;flex-direction:column;padding:40px;max-width:864px;min-height:100vh;margin:0 auto}@media (max-width: 683px){.container{padding:20px}}.content{display:flex}hr{width:100%;border:none;background:var(--border-color);height:1px}.hidden{display:none}@media print{.section{break-inside:avoid-page;padding-top:1rem}p,table{break-inside:avoid-page}} \ No newline at end of file diff --git a/public/pagination.css b/public/pagination.css deleted file mode 100644 index defd6c0..0000000 --- a/public/pagination.css +++ /dev/null @@ -1 +0,0 @@ -.pagination{margin-top:50px}.pagination__title{display:flex;text-align:center;position:relative;margin:100px 0 20px}.pagination__title-h{text-align:center;margin:0 auto;padding:5px 10px;background:var(--background);font-size:.8rem;text-transform:uppercase;letter-spacing:.1em;z-index:1}.pagination__title hr{position:absolute;left:0;right:0;width:100%;margin-top:15px;z-index:0}.pagination__buttons{display:flex;align-items:center;justify-content:center}@media (max-width: 683px){.pagination__buttons{flex-direction:column}}.button{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:1rem;border-radius:8px;max-width:40%;padding:0;cursor:pointer;appearance:none}@media (max-width: 683px){.button{max-width:80%}}.button+.button{margin-left:10px}.button a{display:flex;padding:8px 16px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden} \ No newline at end of file diff --git a/public/post.css b/public/post.css deleted file mode 100644 index 9676e2b..0000000 --- a/public/post.css +++ /dev/null @@ -1 +0,0 @@ -.posts{width:100%;margin:0 auto}.post{width:100%;text-align:left;margin:20px auto;padding:20px 0}@media (max-width: 899px){.post{max-width:660px}}.post:not(:last-of-type){border-bottom:1px solid var(--border-color)}.post .post-meta-inline,.post .post-meta{font-size:1rem;margin-bottom:10px;color:var(--accent-alpha-70)}.post-meta-inline{display:inline}.post-title{--border: 2px dashed var(--accent);position:relative;color:var(--accent2);margin:0 0 15px;padding-bottom:15px;border-bottom:var(--border);font-weight:normal}.post-title a{text-decoration:none}.post .post-tags-inline,.post .post-tags{margin-bottom:20px;font-size:1rem;opacity:.5}.post-tags{display:block}.post-tags-inline{display:inline}@media (max-width: 683px){.post-tags-inline{display:block}}.post-content{margin-top:30px}.post-cover{border:20px solid var(--accent);background:rgba(0,0,0,0);margin:40px 0;padding:20px}@media (max-width: 683px){.post-cover{padding:10px;border-width:10px}}.post ul{list-style:none}.post ul li:before{content:"►";position:absolute;left:-20px;color:var(--accent)}.post--regulation h1{justify-content:center}.post--regulation h2{justify-content:center;margin-bottom:10px}.post--regulation h2+h2{margin-top:-10px;margin-bottom:20px}.post-list .post-date{color:var(--accent3);text-decoration:none}.post-list a{text-decoration:none}.post-list .post-list-title{text-decoration:underline}.post-list .post-tag{text-decoration:underline} \ No newline at end of file diff --git a/public/profile.jpeg b/public/profile.jpeg deleted file mode 100644 index 09f2e4d..0000000 Binary files a/public/profile.jpeg and /dev/null differ diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index e511bfd..0000000 --- a/public/robots.txt +++ /dev/null @@ -1,4 +0,0 @@ -User-agent: * -Disallow: -Allow: / -Sitemap: https://cherrykitten.dev/sitemap.xml diff --git a/public/rss.xml b/public/rss.xml deleted file mode 100644 index 9408972..0000000 --- a/public/rss.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - CherryKitten - https://cherrykitten.dev - - Zola - en - - Tue, 26 Mar 2024 00:00:00 +0000 - - Birds. - Tue, 26 Mar 2024 00:00:00 +0000 - Unknown - https://cherrykitten.dev/blog/birds/ - https://cherrykitten.dev/blog/birds/ - <p>Birds. They're all around us. They are wonderful beings of pure bliss. I love them all.</p> -<p>I've wanted to write about &quot;birds&quot; as a general topic for a long time now. There's a lot to say, I have so many bits and pieces of drafts, ideas, thoughts. On birds themselves, on my personal relationship with them, on their cultural significance and how humanity treats them. This is my attempt at actually putting all of that into a semi-coherent text for you to read, or just to have actually written it all out. I don't know if anyone will get that much out of reading this, but I care about this topic deeply and I need to get these words out.</p> - - - - Being Queer and Otherkin - Fri, 09 Jun 2023 00:00:00 +0000 - Unknown - https://cherrykitten.dev/blog/being-queer-and-otherkin/ - https://cherrykitten.dev/blog/being-queer-and-otherkin/ - <p>This is a bit more of a personal one, some background on me personally and on my identity.</p> -<p>As you might have noticed, I am a catgirl. But what does that actually mean? -For some, it might just be a weird cute thing they know from anime, others might think &quot;a girl who likes cats&quot;. -For me, it means I am a cat and a girl (<a href="https://nonbinary.wiki/wiki/Demigender#Demigirl">kinda</a>). Both are equally important parts of my identity.</p> -<p>I am trans, I am nonbinary, and I am otherkin. I am also autistic. All of these are properties of me as a whole. They -add up to create this entity that's writing this post right now. Remove any single one of these properties, and you end -up with a completely different being.</p> - - - - Learning Rust: A kitten's guide to Options and Results - Sat, 25 Feb 2023 00:00:00 +0000 - Unknown - https://cherrykitten.dev/blog/rust-options-results/ - https://cherrykitten.dev/blog/rust-options-results/ - <h3 id="to-unwrap-or-not-to-unwrap-that-is-the-question">To unwrap() or not to unwrap(), that is the question:</h3> -<p>So I've finally given in and started to learn Rust last month. It's a really cool programming language, -with some interesting differences to what I've used before. (JavaScript and Python, mostly)</p> -<p>There are some really pawesome guides out there, <a href="https://doc.rust-lang.org/book/">&quot;The Rust programming language&quot;</a> is -definitely a <strong>must-read</strong> in my opinion, and <a href="https://github.com/rust-lang/rustlings">Rustlings</a> is nyamazing for -anyone who likes to learn by actively working through interactive problems.</p> -<p>After reading through a lot of those big thorough guides by experienced Rust developers, I've started working on -my first actual Project. I approached the development of this project by just trying to get small parts of it -working in any way I can manage, and then build upon this. In that process, I learned a lot of small subtilties that -guides like the ones named above just can't really cover. This post is for sharing those things, those cool little -tips to make your first Rust project just a little cleaner and more Rust-y. Originally I wanted to make this about a lot -of different topics, but then I've realized that my notes already contain so many things about just one part of Rust: -The Enums <code>Option</code> and <code>Result</code>. So this post will be about those, and hopefully will mark the start of a series on this blog.</p> -<p>While reading through this, you might think that the things I'm mentioning are obvious. That's okay, and that's the point. -Nothing is ever completely obvious to everyone, and this is for those like me, who often don't immediately recognize -the &quot;obvious&quot;. And, to be honest, I am writing this just as much for myself, writing all of that stuff down to aid me in my -own ongoing learning process.</p> -<p>So, let's start!</p> - - - - The Fediverse is more than just Mastodon - Sat, 26 Nov 2022 00:00:00 +0000 - Unknown - https://cherrykitten.dev/blog/fediverse-isnt-just-mastodon/ - https://cherrykitten.dev/blog/fediverse-isnt-just-mastodon/ - <p>With Twitter in a downwards spiral thanks to some rich guy whose name escapes me breaking everything, the Fediverse has been getting the biggest influx of new users in a very long time. -People have been recommending &quot;Mastodon&quot; as a Twitter alternative for a while now, causing #Mastodon to be the top trending Hashtag on many days.</p> -<p>Browsing that hashtag one can find a lot of misconceptions about what Mastodon is, how it works, and what its limitations are. These misconceptions are not just spread by people who dislike Mastodon and try to convince others not to use it, though. They are also perpetuated by people who seem to want to increase the userbase at all cost, regardless of whom it attracts to the Fediverse.</p> - - - - diff --git a/public/sitemap.xml b/public/sitemap.xml deleted file mode 100644 index fcd57b3..0000000 --- a/public/sitemap.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - https://cherrykitten.dev/ - - - https://cherrykitten.dev/about/ - - - https://cherrykitten.dev/blog/ - - - https://cherrykitten.dev/blog/being-queer-and-otherkin/ - 2023-06-09 - - - https://cherrykitten.dev/blog/birds/ - 2024-03-26 - - - https://cherrykitten.dev/blog/fediverse-isnt-just-mastodon/ - 2022-11-26 - - - https://cherrykitten.dev/blog/page/1/ - - - https://cherrykitten.dev/blog/rust-options-results/ - 2023-02-25 - - - https://cherrykitten.dev/contact/ - - - https://cherrykitten.dev/cv/ - - - https://cherrykitten.dev/home/ - - - https://cherrykitten.dev/impressum/ - - - https://cherrykitten.dev/tags/ - - - https://cherrykitten.dev/tags/activitypub/ - - - https://cherrykitten.dev/tags/animals/ - - - https://cherrykitten.dev/tags/autism/ - - - https://cherrykitten.dev/tags/birds/ - - - https://cherrykitten.dev/tags/calckey/ - - - https://cherrykitten.dev/tags/cat/ - - - https://cherrykitten.dev/tags/code/ - - - https://cherrykitten.dev/tags/fediverse/ - - - https://cherrykitten.dev/tags/gender/ - - - https://cherrykitten.dev/tags/learning/ - - - https://cherrykitten.dev/tags/mastodon/ - - - https://cherrykitten.dev/tags/meow/ - - - https://cherrykitten.dev/tags/misskey/ - - - https://cherrykitten.dev/tags/nature/ - - - https://cherrykitten.dev/tags/neurodivergency/ - - - https://cherrykitten.dev/tags/nya/ - - - https://cherrykitten.dev/tags/otherkin/ - - - https://cherrykitten.dev/tags/personal/ - - - https://cherrykitten.dev/tags/politics/ - - - https://cherrykitten.dev/tags/programming/ - - - https://cherrykitten.dev/tags/queerness/ - - - https://cherrykitten.dev/tags/rust/ - - - https://cherrykitten.dev/tags/society/ - - diff --git a/public/style.css b/public/style.css deleted file mode 100644 index 570a1b8..0000000 --- a/public/style.css +++ /dev/null @@ -1 +0,0 @@ -.button-container{display:table;margin-left:auto;margin-right:auto}button,.button,a.button{position:relative;display:flex;align-items:center;justify-content:center;padding:8px 18px;margin-bottom:5px;text-align:center;border-radius:8px;border:1px solid rgba(0,0,0,0);appearance:none;cursor:pointer;outline:none;}button.outline,.button.outline,a.button.outline{background:rgba(0,0,0,0);box-shadow:none;padding:8px 18px}button.outline :hover,.button.outline :hover,a.button.outline :hover{transform:none;box-shadow:none}button.primary,.button.primary,a.button.primary{box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08)}button.primary:hover,.button.primary:hover,a.button.primary:hover{box-shadow:0 2px 6px rgba(50,50,93,.21),0 1px 3px rgba(0,0,0,.08)}button.link,.button.link,a.button.link{background:none;font-size:1rem}button.small,.button.small,a.button.small{font-size:.8rem}button.wide,.button.wide,a.button.wide{min-width:200px;padding:14px 24px}a.read-more,a.read-more:hover,a.read-more:active{display:inline-flex;background:none;box-shadow:none;padding:0;margin:20px 0;max-width:100%}.code-toolbar{margin-bottom:20px}.code-toolbar .toolbar-item a{position:relative;display:inline-flex;align-items:center;justify-content:center;padding:3px 8px;margin-bottom:5px;text-align:center;font-size:13px;font-weight:500;border-radius:8px;border:1px solid rgba(0,0,0,0);appearance:none;cursor:pointer;outline:none}.header{display:flex;flex-direction:column;position:relative}.header__inner{display:flex;align-items:center;justify-content:space-between}.header__logo{display:flex;flex:1}.header__logo:after{content:"";background:repeating-linear-gradient(90deg, var(--accent) 0%, rgba(0,0,0,0) 8%, var(--accent2) 50%, var(--accent3) 100%);display:block;width:100%;right:10px;border-radius:0 20px 20px 0}.header__logo a{flex:0 0 auto;max-width:100%}.header .menu{margin:20px 0}.header .menu__inner{display:flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.header .menu__inner li{color:var(--accent3)}.header .menu__inner li.active{color:var(--accent-alpha-70)}.header .menu__inner li:not(:last-of-type){margin-right:20px;margin-bottom:10px;flex:0 0 auto}.header .menu__sub-inner{position:relative;list-style:none;padding:0;margin:0}.header .menu__sub-inner:not(:only-child){margin-left:20px}.header .menu__sub-inner-more{position:absolute;background:var(--background);box-shadow:var(--shadow);color:#fff;border:2px solid;margin:0;padding:10px;list-style:none;z-index:99;top:35px;left:0}.header .menu__sub-inner-more-trigger{color:var(--accent);user-select:none;cursor:pointer}.header .menu__sub-inner-more li{margin:0;padding:5px;white-space:nowrap}.logo{display:flex;align-items:center;text-decoration:none;background:var(--accent);color:#000;padding:5px 10px;border-radius:20px 0 0 20px}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}body{margin:0;padding:0;font-family:Monaco,Consolas,Ubuntu Mono,monospace;font-size:1rem;line-height:1.54;background-color:var(--background);color:var(--color);text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-webkit-overflow-scrolling:touch;-webkit-text-size-adjust:100%}@media (max-width: 683px){body{font-size:1rem}}h1,h2{display:flex;align-items:center;font-weight:500;line-height:1.3;color:var(--accent2)}h3,h4,h5,h6{display:flex;align-items:center;font-weight:400;line-height:.8;color:var(--accent3)}h1{font-size:1.4rem}h2{font-size:1.3rem;padding-top:1rem;border-bottom:1px dashed var(--accent);padding-bottom:7px}h3{font-size:1.2rem;font-weight:bolder}h4,h5,h6{font-size:1.15rem}a{color:inherit}img{display:block;max-width:100%}img.left{margin-right:auto}img.center{margin-left:auto;margin-right:auto}img.right{margin-left:auto}p{margin-bottom:20px}figure{display:table;max-width:100%;margin:25px 0}figure.left img{margin-right:auto}figure.center img{margin-left:auto;margin-right:auto}figure.right img{margin-left:auto}figure figcaption{font-size:14px;padding:5px 10px;margin-top:5px;background:var(--accent);color:var(--background)}figure figcaption.left{text-align:left}figure figcaption.center{text-align:center}figure figcaption.right{text-align:right}code{font-family:monospace;font-feature-settings:normal;background:var(--accent-alpha-20);padding:1px 6px;margin:0 2px;font-size:.95rem}pre{font-family:monospace;padding:20px;font-size:.95rem;overflow:auto;border-top:1px solid rgba(255,255,255,.1);border-bottom:1px solid rgba(255,255,255,.1)}@media (max-width: 683px){pre{white-space:pre-wrap;word-wrap:break-word}}pre code{padding:0;margin:0;background:none}blockquote{border-top:1px solid var(--accent);border-bottom:1px solid var(--accent);margin:40px 0;padding:25px}@media (max-width: 683px){blockquote{padding-right:0}}blockquote:before{content:"”";font-family:Georgia,serif;font-size:3.875rem;position:absolute;left:-40px;top:-20px}blockquote p:first-of-type{margin-top:0}blockquote p:last-of-type{margin-bottom:0}blockquote p{position:relative}blockquote p:before{content:">";display:block;position:absolute;left:-25px;color:var(--accent)}table{table-layout:fixed;border-collapse:collapse;width:100%;margin:40px 0}table,th,td{border:none;padding:10px}th{color:var(--accent)}td{border-bottom:1px dotted var(--accent)}ul,ol{margin-left:30px;padding:0}ul li,ol li{position:relative}@media (max-width: 683px){ul,ol{margin-left:20px}}ol ol{list-style-type:lower-alpha}.container{display:flex;flex-direction:column;padding:40px;max-width:864px;min-height:100vh;margin:0 auto}@media (max-width: 683px){.container{padding:20px}}.content{display:flex}hr{width:100%;border:none;background:var(--border-color);height:1px}.hidden{display:none}@media print{.section{break-inside:avoid-page;padding-top:1rem}p,table{break-inside:avoid-page}}.posts{width:100%;margin:0 auto}.post{width:100%;text-align:left;margin:20px auto;padding:20px 0}@media (max-width: 899px){.post{max-width:660px}}.post:not(:last-of-type){border-bottom:1px solid var(--border-color)}.post .post-meta-inline,.post .post-meta{font-size:1rem;margin-bottom:10px;color:var(--accent-alpha-70)}.post-meta-inline{display:inline}.post-title{--border: 2px dashed var(--accent);position:relative;color:var(--accent2);margin:0 0 15px;padding-bottom:15px;border-bottom:var(--border);font-weight:normal}.post-title a{text-decoration:none}.post .post-tags-inline,.post .post-tags{margin-bottom:20px;font-size:1rem;opacity:.5}.post-tags{display:block}.post-tags-inline{display:inline}@media (max-width: 683px){.post-tags-inline{display:block}}.post-content{margin-top:30px}.post-cover{border:20px solid var(--accent);background:rgba(0,0,0,0);margin:40px 0;padding:20px}@media (max-width: 683px){.post-cover{padding:10px;border-width:10px}}.post ul{list-style:none}.post ul li:before{content:"►";position:absolute;left:-20px;color:var(--accent)}.post--regulation h1{justify-content:center}.post--regulation h2{justify-content:center;margin-bottom:10px}.post--regulation h2+h2{margin-top:-10px;margin-bottom:20px}.post-list .post-date{color:var(--accent3);text-decoration:none}.post-list a{text-decoration:none}.post-list .post-list-title{text-decoration:underline}.post-list .post-tag{text-decoration:underline}.pagination{margin-top:50px}.pagination__title{display:flex;text-align:center;position:relative;margin:100px 0 20px}.pagination__title-h{text-align:center;margin:0 auto;padding:5px 10px;background:var(--background);font-size:.8rem;text-transform:uppercase;letter-spacing:.1em;z-index:1}.pagination__title hr{position:absolute;left:0;right:0;width:100%;margin-top:15px;z-index:0}.pagination__buttons{display:flex;align-items:center;justify-content:center}@media (max-width: 683px){.pagination__buttons{flex-direction:column}}.button{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:1rem;border-radius:8px;max-width:40%;padding:0;cursor:pointer;appearance:none}@media (max-width: 683px){.button{max-width:80%}}.button+.button{margin-left:10px}.button a{display:flex;padding:8px 16px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.footer{padding:40px 0;flex-grow:0;opacity:.5}.footer__inner{display:flex;align-items:center;justify-content:space-between;margin:0;width:760px;max-width:100%}@media (max-width: 899px){.footer__inner{flex-direction:column}}.footer a{color:inherit}.footer .copyright{display:flex;flex-direction:row;align-items:center;font-size:1rem;color:var(--light-color-secondary)}.footer .copyright--user{margin:auto;text-align:center}.footer .copyright>*:first-child:not(:only-child){margin-right:10px}@media (max-width: 899px){.footer .copyright>*:first-child:not(:only-child){border:none;padding:0;margin:0}}@media (max-width: 899px){.footer .copyright{flex-direction:column;margin-top:10px}} \ No newline at end of file diff --git a/public/tags/activitypub/index.html b/public/tags/activitypub/index.html deleted file mode 100644 index 4bb38e2..0000000 --- a/public/tags/activitypub/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - -Tag: ActivityPub | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #ActivityPub - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/animals/index.html b/public/tags/animals/index.html deleted file mode 100644 index 720b58d..0000000 --- a/public/tags/animals/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - -Tag: animals | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #animals - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/autism/index.html b/public/tags/autism/index.html deleted file mode 100644 index 1bc6bff..0000000 --- a/public/tags/autism/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -Tag: autism | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #autism - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/birds/index.html b/public/tags/birds/index.html deleted file mode 100644 index ba2eff1..0000000 --- a/public/tags/birds/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - -Tag: birds | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #birds - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/calckey/index.html b/public/tags/calckey/index.html deleted file mode 100644 index f2b8d68..0000000 --- a/public/tags/calckey/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - -Tag: Calckey | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #Calckey - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/cat/index.html b/public/tags/cat/index.html deleted file mode 100644 index d64f08c..0000000 --- a/public/tags/cat/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -Tag: cat | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #cat - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/code/index.html b/public/tags/code/index.html deleted file mode 100644 index f21b699..0000000 --- a/public/tags/code/index.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - -Tag: code | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #code - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/fediverse/index.html b/public/tags/fediverse/index.html deleted file mode 100644 index 0169af7..0000000 --- a/public/tags/fediverse/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - -Tag: Fediverse | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #Fediverse - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/gender/index.html b/public/tags/gender/index.html deleted file mode 100644 index fa837ac..0000000 --- a/public/tags/gender/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -Tag: gender | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #gender - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/index.html b/public/tags/index.html deleted file mode 100644 index 5b71bde..0000000 --- a/public/tags/index.html +++ /dev/null @@ -1,240 +0,0 @@ - - - - - Tags | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

all tags

- - -
- -
- - - - - -
- - - diff --git a/public/tags/learning/index.html b/public/tags/learning/index.html deleted file mode 100644 index 7c2dac9..0000000 --- a/public/tags/learning/index.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - -Tag: learning | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #learning - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/mastodon/index.html b/public/tags/mastodon/index.html deleted file mode 100644 index 3a4c79e..0000000 --- a/public/tags/mastodon/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - -Tag: Mastodon | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #Mastodon - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/meow/index.html b/public/tags/meow/index.html deleted file mode 100644 index 614fdef..0000000 --- a/public/tags/meow/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -Tag: meow | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #meow - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/misskey/index.html b/public/tags/misskey/index.html deleted file mode 100644 index 5b02777..0000000 --- a/public/tags/misskey/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - -Tag: Misskey | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #Misskey - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/nature/index.html b/public/tags/nature/index.html deleted file mode 100644 index bc6d725..0000000 --- a/public/tags/nature/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - -Tag: nature | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #nature - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/neurodivergency/index.html b/public/tags/neurodivergency/index.html deleted file mode 100644 index bd533da..0000000 --- a/public/tags/neurodivergency/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -Tag: neurodivergency | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #neurodivergency - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/nya/index.html b/public/tags/nya/index.html deleted file mode 100644 index 0d2562e..0000000 --- a/public/tags/nya/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -Tag: nya | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #nya - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/otherkin/index.html b/public/tags/otherkin/index.html deleted file mode 100644 index e177dd0..0000000 --- a/public/tags/otherkin/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -Tag: otherkin | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #otherkin - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/personal/index.html b/public/tags/personal/index.html deleted file mode 100644 index 6922a4e..0000000 --- a/public/tags/personal/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -Tag: personal | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #personal - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/politics/index.html b/public/tags/politics/index.html deleted file mode 100644 index 049e1af..0000000 --- a/public/tags/politics/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - -Tag: politics | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #politics - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/programming/index.html b/public/tags/programming/index.html deleted file mode 100644 index 9ac7f92..0000000 --- a/public/tags/programming/index.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - -Tag: programming | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #programming - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/queerness/index.html b/public/tags/queerness/index.html deleted file mode 100644 index ff523dc..0000000 --- a/public/tags/queerness/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -Tag: queerness | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #queerness - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/rust/index.html b/public/tags/rust/index.html deleted file mode 100644 index 34e7e0c..0000000 --- a/public/tags/rust/index.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - -Tag: Rust | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #Rust - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/tags/society/index.html b/public/tags/society/index.html deleted file mode 100644 index bdfc602..0000000 --- a/public/tags/society/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - -Tag: society | CherryKitten - - - - - - - - - - - - - - -
- -
- - - - - - - - -
- - -
- -
-

- tag: #society - (1 post) -

- - - Show all tags - - - - - -
- -
- - - - - -
- - - diff --git a/public/variables.css b/public/variables.css deleted file mode 100644 index e69de29..0000000 diff --git a/sass/buttons.scss b/sass/buttons.scss new file mode 100644 index 0000000..7a864b0 --- /dev/null +++ b/sass/buttons.scss @@ -0,0 +1,92 @@ +.button-container { + display: table; + margin-left: auto; + margin-right: auto; +} + +button, +.button, +a.button { + position: relative; + display: flex; + align-items: center; + justify-content: center; + padding: 8px 18px; + margin-bottom: 5px; + text-align: center; + border-radius: 8px; + border: 1px solid transparent; + appearance: none; + cursor: pointer; + outline: none; + + /* variants */ + + &.outline { + background: transparent; + box-shadow: none; + padding: 8px 18px; + + :hover { + transform: none; + box-shadow: none; + } + } + + &.primary { + box-shadow: 0 4px 6px rgba(50, 50, 93, .11), 0 1px 3px rgba(0, 0, 0, .08); + + &:hover { + box-shadow: 0 2px 6px rgba(50, 50, 93, .21), 0 1px 3px rgba(0, 0, 0, .08); + } + } + + &.link { + background: none; + font-size: 1rem; + } + + + /* sizes */ + + &.small { + font-size: .8rem; + } + + &.wide { + min-width: 200px; + padding: 14px 24px; + } +} + +a.read-more, +a.read-more:hover, +a.read-more:active { + display: inline-flex; + background: none; + box-shadow: none; + padding: 0; + margin: 20px 0; + max-width: 100%; +} + +.code-toolbar { + margin-bottom: 20px; + + .toolbar-item a { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 3px 8px; + margin-bottom: 5px; + text-align: center; + font-size: 13px; + font-weight: 500; + border-radius: 8px; + border: 1px solid transparent; + appearance: none; + cursor: pointer; + outline: none; + } +} diff --git a/sass/color.scss b/sass/color.scss new file mode 100644 index 0000000..4fd0318 --- /dev/null +++ b/sass/color.scss @@ -0,0 +1,11 @@ +:root { + --accent: rgb(235, 111, 146); + --accent2: rgb(246, 193, 119); + --accent3: rgb(62, 143, 176); + --accent-alpha-70: rgba(235, 111, 146,.7); + --accent-alpha-20: rgba(235, 111, 146,.2); + + --background: #232136; + --color: #e0def4; + --border-color: rgba(246, 193, 119, .1); +} diff --git a/sass/footer.scss b/sass/footer.scss new file mode 100644 index 0000000..529200d --- /dev/null +++ b/sass/footer.scss @@ -0,0 +1,52 @@ +@import "variables"; + +.footer { + padding: 40px 0; + flex-grow: 0; + opacity: .5; + + &__inner { + display: flex; + align-items: center; + justify-content: space-between; + margin: 0; + width: 760px; + max-width: 100%; + + @media (max-width: $tablet-max-width) { + flex-direction: column; + } + } + + a { + color: inherit; + } + + .copyright { + display: flex; + flex-direction: row; + align-items: center; + font-size: 1rem; + color: var(--light-color-secondary); + + &--user { + margin: auto; + text-align: center; + } + + & > *:first-child:not(:only-child) { + margin-right: 10px; + + @media (max-width: $tablet-max-width) { + border: none; + padding: 0; + margin: 0; + } + } + + @media (max-width: $tablet-max-width) { + flex-direction: column; + margin-top: 10px; + } + } +} diff --git a/sass/header.scss b/sass/header.scss new file mode 100644 index 0000000..6d64f7d --- /dev/null +++ b/sass/header.scss @@ -0,0 +1,98 @@ +@import "variables"; + +@mixin menu { + position: absolute; + background: var(--background); + box-shadow: var(--shadow); + color: white; + border: 2px solid; + margin: 0; + padding: 10px; + list-style: none; + z-index: 99; +} + +.header { + display: flex; + flex-direction: column; + position: relative; + + &__inner { + display: flex; + align-items: center; + justify-content: space-between; + } + + &__logo { + display: flex; + flex: 1; + + &:after { + content: ''; + background: repeating-linear-gradient(90deg,var(--accent) 0%, transparent 8%, var(--accent2) 50%,var(--accent3) 100% ); + display: block; + width: 100%; + right: 10px; + border-radius: 0 20px 20px 0; + } + + a { + flex: 0 0 auto; + max-width: 100%; + } + } + + .menu { + margin: 20px 0; + + &__inner { + display: flex; + flex-wrap: wrap; + list-style: none; + margin: 0; + padding: 0; + + li { + color: var(--accent3); + &.active { + color: var(--accent-alpha-70); + } + + &:not(:last-of-type) { + margin-right: 20px; + margin-bottom: 10px; + flex: 0 0 auto; + } + } + } + + &__sub-inner { + position: relative; + list-style: none; + padding: 0; + margin: 0; + + &:not(:only-child) { + margin-left: 20px; + } + + &-more { + @include menu; + top: 35px; + left: 0; + + &-trigger { + color: var(--accent); + user-select: none; + cursor: pointer; + } + + li { + margin: 0; + padding: 5px; + white-space: nowrap; + } + } + } + } +} diff --git a/sass/logo.scss b/sass/logo.scss new file mode 100644 index 0000000..b1248e8 --- /dev/null +++ b/sass/logo.scss @@ -0,0 +1,9 @@ +.logo { + display: flex; + align-items: center; + text-decoration: none; + background: var(--accent); + color: black; + padding: 5px 10px; + border-radius: 20px 0 0 20px; +} diff --git a/sass/main.scss b/sass/main.scss new file mode 100644 index 0000000..2b13455 --- /dev/null +++ b/sass/main.scss @@ -0,0 +1,283 @@ +@import "variables"; + +html { + box-sizing: border-box; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +body { + margin: 0; + padding: 0; + font-family: Monaco, Consolas, Ubuntu Mono, monospace; + font-size: 1rem; + line-height: 1.54; + background-color: var(--background); + color: var(--color); + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -webkit-overflow-scrolling: touch; + -webkit-text-size-adjust: 100%; + + @media (max-width: $phone-max-width) { + font-size: 1rem; + } +} +h1, h2 { + display: flex; + align-items: center; + font-weight: 500; + line-height: 1.3; + color: var(--accent2); +} + +h3, h4, h5, h6 { + display: flex; + align-items: center; + font-weight: 400; + line-height: 0.8; + color: var(--accent3); +} + +h1 { + font-size: 1.4rem; +} + +h2 { + font-size: 1.3rem; + padding-top: 1rem; + border-bottom: 1px dashed var(--accent); + padding-bottom: 7px; +} + + +h3 { + font-size: 1.2rem; + font-weight: bolder; +} + +h4, h5, h6 { + font-size: 1.15rem; +} + + +a { + color: inherit; +} + +img { + display: block; + max-width: 100%; + + &.left { + margin-right: auto; + } + + &.center { + margin-left: auto; + margin-right: auto; + } + + &.right { + margin-left: auto; + } +} + +p { + margin-bottom: 20px; +} + +figure { + display: table; + max-width: 100%; + margin: 25px 0; + + &.left { + img { + margin-right: auto; + } + } + + &.center { + img { + margin-left: auto; + margin-right: auto; + } + } + + &.right { + img { + margin-left: auto; + } + } + + figcaption { + font-size: 14px; + padding: 5px 10px; + margin-top: 5px; + background: var(--accent); + color: var(--background); + + &.left { + text-align: left; + } + + &.center { + text-align: center; + } + + &.right { + text-align: right; + } + } +} + +code { + font-family: monospace; + font-feature-settings: normal; + background: var(--accent-alpha-20); + padding: 1px 6px; + margin: 0 2px; + font-size: .95rem; +} + +pre { + font-family: monospace; + padding: 20px; + font-size: .95rem; + overflow: auto; + border-top: 1px solid rgba(255, 255, 255, .1); + border-bottom: 1px solid rgba(255, 255, 255, .1); + + @media (max-width: $phone-max-width) { + white-space: pre-wrap; + word-wrap: break-word; + } + + code { + padding: 0; + margin: 0; + background: none; + } +} + +blockquote { + border-top: 1px solid var(--accent); + border-bottom: 1px solid var(--accent); + margin: 40px 0; + padding: 25px; + + @media (max-width: $phone-max-width) { + padding-right: 0; + } + + &:before { + content: '”'; + font-family: Georgia, serif; + font-size: 3.875rem; + position: absolute; + left: -40px; + top: -20px; + } + + p:first-of-type { + margin-top: 0; + } + + p:last-of-type { + margin-bottom: 0; + } + + p { + position: relative; + } + + p:before { + content: '>'; + display: block; + position: absolute; + left: -25px; + color: var(--accent); + } +} + +table { + table-layout: fixed; + border-collapse: collapse; + width: 100%; + margin: 40px 0; +} + +table, th, td { + border: none; + padding: 10px; +} + +th { + color: var(--accent); +} + +td { + border-bottom: 1px dotted var(--accent); + } + + +ul, ol { + margin-left: 30px; + padding: 0; + + li { + position: relative; + } + + @media (max-width: $phone-max-width) { + margin-left: 20px; + } +} + +ol ol { + list-style-type: lower-alpha; +} + +.container { + display: flex; + flex-direction: column; + padding: 40px; + max-width: 864px; + min-height: 100vh; + margin: 0 auto; + + @media (max-width: $phone-max-width) { + padding: 20px; + } +} + +.content { + display: flex; +} + +hr { + width: 100%; + border: none; + background: var(--border-color); + height: 1px; +} + +.hidden { + display: none; +} + +@media print { + .section { + break-inside: avoid-page; + padding-top: 1rem; + } + p, table { + break-inside: avoid-page; + } +} + diff --git a/sass/pagination.scss b/sass/pagination.scss new file mode 100644 index 0000000..566005b --- /dev/null +++ b/sass/pagination.scss @@ -0,0 +1,77 @@ +@import 'variables'; + +.pagination { + margin-top: 50px; + + &__title { + display: flex; + text-align: center; + position: relative; + margin: 100px 0 20px; + + &-h { + text-align: center; + margin: 0 auto; + padding: 5px 10px; + background: var(--background); + font-size: .8rem; + text-transform: uppercase; + letter-spacing: .1em; + z-index: 1; + } + + hr { + position: absolute; + left: 0; + right: 0; + width: 100%; + margin-top: 15px; + z-index: 0; + } + } + + &__buttons { + display: flex; + align-items: center; + justify-content: center; + + @media (max-width: $phone-max-width) { + flex-direction: column; + } + } +} + +.button { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 1rem; + border-radius: 8px; + max-width: 40%; + padding: 0; + cursor: pointer; + appearance: none; + + @media (max-width: $phone-max-width) { + max-width: 80%; + } + + + .button { + margin-left: 10px; + } + + a { + display: flex; + padding: 8px 16px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + &__text { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } +} diff --git a/sass/post.scss b/sass/post.scss new file mode 100644 index 0000000..a59a28e --- /dev/null +++ b/sass/post.scss @@ -0,0 +1,135 @@ +@import "variables"; + +.posts { + width: 100%; + margin: 0 auto; +} + +.post { + width: 100%; + text-align: left; + margin: 20px auto; + padding: 20px 0; + + @media (max-width: $tablet-max-width) { + max-width: 660px; + } + + &:not(:last-of-type) { + border-bottom: 1px solid var(--border-color); + } + + %meta { + font-size: 1rem; + margin-bottom: 10px; + color: var(--accent-alpha-70); + } + + &-meta { + @extend %meta; + } + + &-meta-inline { + @extend %meta; + + display: inline; + } + + &-title { + --border: 2px dashed var(--accent); + position: relative; + color: var(--accent2); + margin: 0 0 15px; + padding-bottom: 15px; + border-bottom: var(--border); + font-weight: normal; + + a { + text-decoration: none; + } + } + + %tags { + margin-bottom: 20px; + font-size: 1rem; + opacity: .5; + } + + &-tags { + @extend %tags; + + display: block; + } + + &-tags-inline { + @extend %tags; + + display: inline; + + @media (max-width: $phone-max-width) { + display: block; + } + } + + &-content { + margin-top: 30px; + } + + &-cover { + border: 20px solid var(--accent); + background: transparent; + margin: 40px 0; + padding: 20px; + + @media (max-width: $phone-max-width) { + padding: 10px; + border-width: 10px; + } + } + + ul { + list-style: none; + + li:before { + content: '►'; + position: absolute; + left: -20px; + color: var(--accent); + } + } +} + +.post--regulation { + h1 { + justify-content: center; + } + + h2 { + justify-content: center; + margin-bottom: 10px; + + &+ h2 { + margin-top: -10px; + margin-bottom: 20px; + } + } +} + +.post-list { + .post-date { + color: var(--accent3); + text-decoration: none; + } + + a { + text-decoration: none; + } + + .post-list-title { + text-decoration: underline; + } + + .post-tag { + text-decoration: underline; + } +} diff --git a/sass/style.scss b/sass/style.scss new file mode 100644 index 0000000..3a289d7 --- /dev/null +++ b/sass/style.scss @@ -0,0 +1,8 @@ +@import 'buttons'; + +@import 'header'; +@import 'logo'; +@import 'main'; +@import 'post'; +@import 'pagination'; +@import 'footer'; diff --git a/sass/variables.scss b/sass/variables.scss new file mode 100644 index 0000000..3b95a9c --- /dev/null +++ b/sass/variables.scss @@ -0,0 +1,2 @@ +$phone-max-width: 683px; +$tablet-max-width: 899px; diff --git a/templates/404.html b/templates/404.html new file mode 100644 index 0000000..b081fbc --- /dev/null +++ b/templates/404.html @@ -0,0 +1,16 @@ +{% extends "index.html" %} + +{% block title %} +404 +{% endblock title %} + +{% block header_menu %} +{{ menu_macros::menu_for(config=config, current_item="") }} +{% endblock header_menu %} + +{% block content %} +
+

{% block heading %}Lost?{% endblock heading %}

+

{% block message %}This page does not exist.{% endblock message %}

+
+{% endblock content %} diff --git a/templates/archive.html b/templates/archive.html new file mode 100644 index 0000000..af9df6e --- /dev/null +++ b/templates/archive.html @@ -0,0 +1,15 @@ +{% extends "index.html" %} + +{%- block title -%} +{{ title_macros::title(page_title=page.title, main_title=config.title) }} +{%- endblock -%} + +{% block content %} +
+

{{ page.title }}

+ + {% set section = get_section(path="_index.md") %} + + {{ post_macros::list_posts(pages=section.pages) }} +
+{% endblock content %} diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..8d45a38 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,126 @@ +{% import "macros/date.html" as date_macros -%} +{% import "macros/head.html" as head_macros -%} +{% import "macros/menu.html" as menu_macros -%} +{% import "macros/post.html" as post_macros -%} +{% import "macros/title.html" as title_macros -%} + + + + + + {%- block title %}{{ config.title }}{% endblock title -%} + {{ head_macros::head(config=config) }} + + {%- if config.generate_feed %} + + {% endif -%} + + {%- if config.extra.favicon %} + + {% endif -%} + + {%- block extra_head %} + {% endblock extra_head -%} + + + +
+ {% block header %} +
+
+ +
+ + {% block header_menu %} + {{ menu_macros::menu(config=config, current_path=current_path) }} + {% endblock header_menu %} +
+ {% endblock header %} + +
+ {% block content %} +
+ {%- if paginator %} + {%- set show_pages = paginator.pages -%} + {% else %} + {%- set show_pages = section.pages -%} + {% endif -%} + + {%- for page in show_pages %} +
+ {{ post_macros::header(page=page) }} + {{ post_macros::content(page=page, summary=true) }} +
+ {% endfor -%} + +
+ {% endblock content %} +
+ + {% block footer %} + + {% endblock footer %} + +
+{%- block extra_body %} +{% endblock extra_body -%} + + + diff --git a/templates/macros/date.html b/templates/macros/date.html new file mode 100644 index 0000000..e793735 --- /dev/null +++ b/templates/macros/date.html @@ -0,0 +1,3 @@ +{% macro now_year() %} + {{ now() | date(format="%Y") }} +{% endmacro %} diff --git a/templates/macros/head.html b/templates/macros/head.html new file mode 100644 index 0000000..596a3e2 --- /dev/null +++ b/templates/macros/head.html @@ -0,0 +1,9 @@ +{% macro head(config) %} + + + + + + + +{% endmacro head %} diff --git a/templates/macros/menu.html b/templates/macros/menu.html new file mode 100644 index 0000000..090388f --- /dev/null +++ b/templates/macros/menu.html @@ -0,0 +1,52 @@ +{% macro menu(config, current_path) %} + {%- set current_item = false -%} + {%- if config.extra.menu_items %} + {%- set menu_items = config.extra.menu_items -%} + + {%- for item in menu_items %} + {%- set abs_item_url = item.url | replace(from="$BASE_URL", to=config.base_url) -%} + {%- set is_current = current_url == abs_item_url ~ "/" + or current_url is starting_with(abs_item_url) + -%} + {%- set is_base = abs_item_url == config.base_url + or abs_item_url == config.base_url ~ "/" + -%} + + {%- if is_base %} + {%- set_global base_item = item -%} + {% endif -%} + + {%- if is_current and not is_base %} + {%- set_global current_item = item -%} + {% endif -%} + {% endfor -%} + + {%- if not current_item and base_item %} + {# Did not match any menu URLs -- assume it's a blog post #} + {%- set current_item = base_item -%} + {% endif -%} + + {{ menu_macros::menu_for(config=config, current_item=current_item) }} + {% endif -%} +{% endmacro menu %} + +{% macro menu_for(config, current_item) %} + {%- if config.extra.menu_items %} + {%- set menu_items = config.extra.menu_items -%} + + + {% endif -%} +{% endmacro menu %} + diff --git a/templates/macros/post.html b/templates/macros/post.html new file mode 100644 index 0000000..f760d48 --- /dev/null +++ b/templates/macros/post.html @@ -0,0 +1,103 @@ +{% macro content(page, summary) %} + {%- if summary and page.summary %} +
+ {{ page.summary | safe }} +
+
+ + + Read more  + ↩︎ + +
+ {% else %} +
+ {{ page.content | safe }} +
+ {%- endif %} +{% endmacro content %} + + +{% macro date(page) %} + + {%- if page.date %} + {{ page.date | date(format="%Y-%m-%d") }} + {% endif -%} + +{% endmacro post_date %} + + +{% macro earlier_later(page) %} + {%- if config.extra.enable_post_view_navigation and page.lower or page.higher %} + + {% endif -%} +{% endmacro earlier_later %} + + +{% macro header(page) %} +

{{ page.title }}

+
+ {{ post_macros::date(page=page) }} +
+ + {{ post_macros::tags(page=page) }} +{% endmacro header %} + + +{% macro list_posts(pages) %} + +{% endmacro list_posts %} + + +{% macro tags(page, short=false) %} + {%- if page.taxonomies and page.taxonomies.tags %} + + {%- if short %} + :: + {%- set sep = "," -%} + {% else %} + :: tags:  + {%- set sep = " " -%} + {% endif -%} + {%- for tag in page.taxonomies.tags %} + #{{ tag }} + {%- if not loop.last %}{{ sep | safe }}{% endif -%} + {% endfor -%} + + {% endif -%} +{% endmacro tags %} diff --git a/templates/macros/title.html b/templates/macros/title.html new file mode 100644 index 0000000..a8575de --- /dev/null +++ b/templates/macros/title.html @@ -0,0 +1,17 @@ +{% macro title(page_title, main_title) %} + {%- if config.extra.page_titles == "combined" -%} + {%- if page_title -%} + {{ page_title }} | {{ main_title }} + {%- else -%} + {{ main_title }} + {%- endif -%} + {%- elif config.extra.page_titles == "page_only" -%} + {%- if page_title -%} + {{ page_title }} + {%- else -%} + {{ main_title }} + {%- endif -%} + {%- else -%} + {{ main_title }} + {%- endif -%} +{% endmacro title %} diff --git a/templates/page.html b/templates/page.html new file mode 100644 index 0000000..f59d965 --- /dev/null +++ b/templates/page.html @@ -0,0 +1,13 @@ +{% extends "index.html" %} + +{%- block title -%} +{{ title_macros::title(page_title=page.title, main_title=config.title) }} +{%- endblock -%} + +{% block content %} +
+ {{ post_macros::header(page=page) }} + {{ post_macros::content(page=page, summary=false) }} + {{ post_macros::earlier_later(page=page) }} +
+{% endblock content %} diff --git a/templates/shortcodes/figure.html b/templates/shortcodes/figure.html new file mode 100644 index 0000000..b9de271 --- /dev/null +++ b/templates/shortcodes/figure.html @@ -0,0 +1,8 @@ +{% if src %} +
+ + {% if caption %} +
{{ caption }}
+ {% endif %} +
+{% endif %} diff --git a/templates/shortcodes/image.html b/templates/shortcodes/image.html new file mode 100644 index 0000000..410be76 --- /dev/null +++ b/templates/shortcodes/image.html @@ -0,0 +1,3 @@ +{% if src %} + +{% endif %} diff --git a/templates/shortcodes/section.md b/templates/shortcodes/section.md new file mode 100644 index 0000000..8a78049 --- /dev/null +++ b/templates/shortcodes/section.md @@ -0,0 +1,5 @@ +
+ +{{ body }} + +
diff --git a/templates/tags/list.html b/templates/tags/list.html new file mode 100644 index 0000000..98cd693 --- /dev/null +++ b/templates/tags/list.html @@ -0,0 +1,21 @@ +{% extends "index.html" %} + +{%- block title -%} +{{ title_macros::title(page_title="Tags", main_title=config.title) }} +{%- endblock -%} + +{% block content %} +
+

all tags

+ + +
+{% endblock content %} diff --git a/templates/tags/single.html b/templates/tags/single.html new file mode 100644 index 0000000..92183b6 --- /dev/null +++ b/templates/tags/single.html @@ -0,0 +1,21 @@ +{% extends "index.html" %} + +{%- block title -%} +{% set title = "Tag: " ~ term.name %} +{{ title_macros::title(page_title=title, main_title=config.title) }} +{%- endblock -%} + +{% block content %} +
+

+ tag: #{{ term.name }} + ({{ term.pages | length }} post{{ term.pages | length | pluralize }}) +

+ + + Show all tags + + + {{ post_macros::list_posts(pages=term.pages) }} +
+{% endblock content %} diff --git a/themes/cherrykitten b/themes/cherrykitten deleted file mode 160000 index b5f869f..0000000 --- a/themes/cherrykitten +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b5f869f21a23b265b443ecdedc056e1a339dab50