···11+# only run some commands if nix is installed
22+nix="$(command -v nix)"
33+44+if ! has nix_direnv_version || ! nix_direnv_version 2.2.1 && [ -n "$nix" ] ; then
55+ source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs="
66+fi
77+88+[ -n "$nix" ] && use flake
···11----
22-title: Heya~
33-description: I'm Leah, also known as pluie or pluiedev!
44-55-date: Git Last Modified
66-doNotRenderTitle: true
77-opengraph:
88- og:type: profile
99- profile:first_name: Leah
1010- profile:last_name: Chen
1111- profile:username: pluie
1212- profile:gender: female
1313----
1414-1515-include _includes/comps/devicon.pug
1616-1717-.grid.gap-20.mb-16(class="grid-cols-[20rem_auto_20rem] grid-rows-[calc(100vh-3*4rem)]")
1818- figure.place-self-center
1919- img.rounded-full.border-2.border-brand(src="/img/avatar.webp" alt="Avatar" width="320")
2020- .col-span-2.place-self-center
2121- h1.text-5xl.font-bold.mt-4
2222- | Heya~ I’m #[span.text-brand Leah]!
2323- span.text-xl
2424- span.mx-2 ·
2525- a(href="https://pronouns.page/@pluiedev") she/her 🏳️⚧️
2626-2727- p.text-2xl.mt-4.
2828- You may know me by my online aliases,
2929- #[span.text-brand pluie] or #[span.text-brand pluiedev].
3030-3131- .prose.text-justify.col-span-2(class="dark:prose-invert"): :md
3232- I'm a Chinese open-source developer 👩🏼💻,
3333- community manager 🔨👷🏼♀️,
3434- graphics designer and artist 👩🏼🎨,
3535- dedicated to making the world of digital technology and design accessible and
3636- inclusive for everyone.
3737-3838- I love coding, drawing, painting, discovering more about myself, and helping others discover and express themselves.
3939- Funnily enough, I do most of my productive work in my spare time when I'm supposed to relax—apparently,
4040- once I get fixated on something, I can't stop. Not sure if that's a good quality or not! ;)
4141-4242- More things I like include dogs, traffic cones, history, politics and linguistics.
4343- Especially <abbr title="constructed languages, or languages intentionally created by people">conlangs</abbr>.
4444- They're _very_ cool.
4545-4646- I also often think way too hard about narrative video games, to the point
4747- I write full articles and reviews about them. I'm not exactly professional,
4848- but I still try my best to figure out what does and doesn't tick!
4949-5050- div
5151-5252- .text-centered.w-full(class="sm:text-left")
5353- h2.text-2xl.font-bold Technologies that...
5454-5555- .flex.divide-y.gap-4(class="sm:flex-col")
5656- each techs in technologies
5757- div
5858- h3.text-xl.my-3= techs.title
5959- +devicons(techs.icons)
6060-6161- .prose.text-justify.col-span-2(class="dark:prose-invert")
6262- h2(class="!mb-0") Current endeavors
6363- p Up-to-date as of: #[em= filters.date(date, "HUMAN_DATE")]
6464-6565- :md
6666- Currently, I spend most of my attention and energy on two things:
6767- community management and moderation, and contributing to and creating various
6868- open-source projects.
6969-7070- As one of the [community managers](https://quiltmc.org/about/teams/#community-managers)
7171- of [the Quilt Project](https://quiltmc.org), a modding toolchain project primarily designed for Minecraft,
7272- I work on policies, guidelines and tooling that drives Quilt towards its goal of creating
7373- a healthy, diverse, multicultural community striving to accomodate all sorts of minorities,
7474- be they ethnic or racial minorities, sexual and/or gender-nonconfirming minorities, neurodivergent minorities,
7575- or any other group of people facing various challenges and adversities in world society.
7676-7777- My unique identity as a queer, lesbian Chinese trans woman with an international,
7878- multicultural mindset provides me with ample amounts of lived experience with
7979- diversifying communities beyond the dominant Western, mostly Anglophone,
8080- predominantly white, cis- and heteronormative culture,
8181- which is unfortunately still the sole major cultural environment in most tech-focused communities.
8282- I hope that, through my efforts, heterogeneous people from diverse backgrounds can find
8383- communities that I manage comfortable, and be free from having to mask their cultural heritage,
8484- like when I first ventured into international technical communities.
8585-8686- As an open-source contributor, I occasionally submit patches and pull requests to
8787- projects I find interesting, mostly in Rust, TypeScript and Kotlin.
8888- I also maintain Quilt's community tooling, mainly [its official website](https://quiltmc.org)
8989- and its [Developer Wiki](https://modder.wiki.quiltmc.org/), and sometimes its own
9090- Discord bot called [Cozy](https://github.com/QuiltMC/cozy-discord).
9191- I also started some other random projects, one of which is a
9292- [Rust rewrite of the `alien` tool](https://github.com/pluiedev/alien),
9393- originally a Perl utility script that converts Linux software packages between various formats
9494- (e.g.: `.deb`, `.rpm`, `.tgz`, ...) for different package managers (e.g.: `dpkg`/`apt`, `rpm`/`dnf`, ...)
9595-9696- I'm almost always coding something new, for existing projects or otherwise,
9797- and I can't wait to show you more! For now, you'll just have to wait for me to update this
9898- portfolio again sometime in the future...
9999-
+177
src/index.vto
···11+---
22+layout: layouts/base.vto
33+title: Heya~
44+description: I'm Leah, also known as pluie or pluiedev!
55+66+date: Git Last Modified
77+doNotRenderTitle: true
88+opengraph:
99+ og:type: profile
1010+ profile:first_name: Leah
1111+ profile:last_name: Chen
1212+ profile:username: pluie
1313+ profile:gender: female
1414+---
1515+{{ import { icon_grid } from "comps/icon-grid.vto" }}
1616+1717+<link rel="stylesheet" href="main.css" />
1818+1919+<div class="top-detector"></div>
2020+<main class="grid splash justify-items-center gap-x-16 gap-y-10 mx-auto max-w-screen-lg mb-16 grid-cols-main-screen">
2121+ <figure class="intro place-self-center">
2222+ <img class="rounded-full border-2 border-brand" src="/img/avatar.webp" alt="Avatar" width="320" height="320" />
2323+ </figure>
2424+2525+ <div class="intro col-span-2 place-self-center flex flex-col gap-y-4">
2626+ <h1 class="text-5xl font-bold">
2727+ Heya~ I’m <span class="text-brand">Leah</span>!
2828+ <span class="text-xl">
2929+ <span class="mx-2">·</span>
3030+ <a href="https://pronouns.page/@pluiedev">she/her 🏳️⚧️</a>
3131+ </span>
3232+ </h1>
3333+3434+ <p class="text-2xl">
3535+ You may know me by my online aliases,
3636+ <span class="text-brand">pluie</span> or
3737+ <span class="text-brand">pluiedev</span>.
3838+ </p>
3939+ <p class="text-xl">
4040+ I'm a Chinese open-source <span class="text-brand">developer 👩🏼💻</span>,
4141+ community <span class="text-brand">manager 🔨👷🏼♀️</span>,
4242+ graphics designer and <span class="text-brand">artist 👩🏼🎨</span>,
4343+ dedicated to making the world of technology and design accessible and
4444+ inclusive for <span class="text-brand">everyone</span>.
4545+ </p>
4646+ </div>
4747+4848+ <div class="scroll-down">
4949+ Scroll down
5050+ <div class="bottom-detector"></div>
5151+ </div>
5252+5353+ <div id="scroll-indicator-vanish-point" class="prose text-justify col-span-2 dark:prose-invert">
5454+ {{ filter strip_indent |> md }}
5555+ I love coding, drawing, painting, discovering more about myself, and helping others discover and express themselves.
5656+ Funnily enough, I do most of my productive work in my spare time when I'm supposed to relax—apparently,
5757+ once I get fixated on something, I can't stop. Not sure if that's a good quality or not! ;)
5858+5959+ More things I like include dogs, traffic cones, history, politics and linguistics.
6060+ Especially <abbr title="constructed languages, or languages intentionally created by people">conlangs</abbr>.
6161+ They're _very_ cool.
6262+6363+ I also often think way too hard about narrative video games, to the point
6464+ I write full articles and reviews about them. I'm not exactly professional,
6565+ but I still try my best to figure out what does and doesn't tick!
6666+ {{ /filter }}
6767+ </div>
6868+6969+ <div class="flex flex-col w-full place-content-center gap-2">
7070+ {{ for link of links }}
7171+ {{ set fg = link.fg ?? "white" }}
7272+ {{ if link.icon.startsWith("si-") }}
7373+ {{ set icon = `https://cdn.simpleicons.org/${link.icon.substring(3)}/${fg}` }}
7474+ {{ else }}
7575+ {{ set icon = link.icon }}
7676+ {{ /if }}
7777+7878+ <a
7979+ href={{ link.link }}
8080+ class="button arrow-button has-icon bg-{{ link.color }} py-2 px-3 text-{{ fg }}"
8181+ style="--icon: url({{ icon }})"
8282+ >
8383+ {{ link.text }}
8484+ </a>
8585+ {{ /for }}
8686+ </div>
8787+8888+ <div class="text-centered w-full sm:text-left">
8989+ <h2 class="text-2xl font-bold">Technologies that...</h2>
9090+9191+ <div class="flex divide-y gap-4 sm:flex-col">
9292+ {{ for techs of technologies }}
9393+ <div>
9494+ <h3 class="text-xl my-3">{{ techs.title }}</h3>
9595+ {{ icon_grid(techs.icons) }}
9696+ </div>
9797+ {{ /for }}
9898+ </div>
9999+ </div>
100100+101101+ <div class="prose text-justify col-span-2 dark:prose-invert">
102102+ <h2 class="!mb-0">Current endeavors</h2>
103103+ <p>Up-to-date as of: <em>{{ it.date |> date("HUMAN_DATE") }}</em></p>
104104+105105+ {{ filter strip_indent |> md }}
106106+ Currently, I spend most of my attention and energy on two things:
107107+ community management and moderation, and contributing to and creating various
108108+ open-source projects.
109109+110110+ As one of the [community managers](https://quiltmc.org/about/teams/#community-managers)
111111+ of [the Quilt Project](https://quiltmc.org), a modding toolchain project primarily designed for Minecraft,
112112+ I work on policies, guidelines and tooling that drives Quilt towards its goal of creating
113113+ a healthy, diverse, multicultural community striving to accomodate all sorts of minorities,
114114+ be they ethnic or racial minorities, sexual and/or gender-nonconfirming minorities, neurodivergent minorities,
115115+ or any other group of people facing various challenges and adversities in world society.
116116+117117+ My unique identity as a queer, lesbian Chinese trans woman with an international,
118118+ multicultural mindset provides me with ample amounts of lived experience with
119119+ diversifying communities beyond the dominant Western, mostly Anglophone,
120120+ predominantly white, cis- and heteronormative culture,
121121+ which is unfortunately still the sole major cultural environment in most tech-focused communities.
122122+ I hope that, through my efforts, heterogeneous people from diverse backgrounds can find
123123+ communities that I manage comfortable, and be free from having to mask their cultural heritage,
124124+ like when I first ventured into international technical communities.
125125+126126+ As an open-source contributor, I occasionally submit patches and pull requests to
127127+ projects I find interesting, mostly in Rust, TypeScript and Kotlin.
128128+ I also maintain Quilt's community tooling, mainly [its official website](https://quiltmc.org)
129129+ and its [Developer Wiki](https://modder.wiki.quiltmc.org/), and sometimes its own
130130+ Discord bot called [Cozy](https://github.com/QuiltMC/cozy-discord).
131131+ I also started some other random projects, one of which is a
132132+ [Rust rewrite of the \`alien\` tool](https://github.com/pluiedev/alien),
133133+ originally a Perl utility script that converts Linux software packages between various formats
134134+ (e.g.: \`.deb\`, \`.rpm\`, \`.tgz\`, ...) for different package managers (e.g.: \`dpkg\`/\`apt\`, \`rpm\`/\`dnf\`, ...)
135135+136136+ I'm almost always coding something new, for existing projects or otherwise,
137137+ and I can't wait to show you more! For now, you'll just have to wait for me to update this
138138+ portfolio again sometime in the future...
139139+ {{ /filter }}
140140+ </div>
141141+</main>
142142+143143+<script>
144144+ const scroll = document.querySelector('.scroll-down');
145145+ const intro = document.querySelector('main');
146146+147147+ const t = new IntersectionObserver(entries => {
148148+ entries.forEach(entry => {
149149+ if (entry.isIntersecting) {
150150+ scroll.classList.remove('opacity-0');
151151+ intro.classList.remove('compact');
152152+ }
153153+ });
154154+ });
155155+ const b = new IntersectionObserver(entries => {
156156+ entries.forEach(entry => {
157157+ if (entry.isIntersecting) {
158158+ scroll.classList.add('opacity-0');
159159+ intro.classList.add('compact');
160160+ }
161161+ });
162162+ });
163163+164164+ function init(ev) {
165165+ if (window.innerHeight < 600) {
166166+ scroll.classList.add('opacity-0');
167167+ t.disconnect();
168168+ b.disconnect();
169169+ } else {
170170+ t.observe(document.querySelector('.top-detector'));
171171+ b.observe(document.querySelector('.bottom-detector'));
172172+ }
173173+ }
174174+175175+ window.addEventListener('resize', init)
176176+ window.addEventListener('load', init)
177177+</script>
···11---
22title: Works
33description: Projects, artworks, and other things I've done...
44+55+artworks:
66+ - id: tiger
77+ name: Ferality
88+ imgid: 558e95a4-f685-4dee-32a6-8c33e49d9600
99+ size: medium
1010+ aspect_ratio: square
1111+ width: 400
1212+ height: 408
1313+1414+ - id: blossoms
1515+ name: Altitudinous blossoms
1616+ imgid: 170696fd-d9b4-4652-e168-2cc80250d400
1717+ size: medium
1818+ aspect_ratio: 3by5
1919+ width: 400
2020+ height: 660
2121+2222+ - id: fish
2323+ name: A piscine aura in the depths
2424+ imgid: 278a69c6-ec0a-4461-c3f3-79aa615ad800
2525+ size: large
2626+ aspect_ratio: 4by3
2727+ width: 500
2828+ height: 380
2929+3030+ - id: red_cotton
3131+ name: A flower — what's her name again?
3232+ imgid: 35db3ba1-542a-46aa-2d10-850d34463e00"
3333+ size: large
3434+ aspect_ratio: 4by3
3535+ rtl: true
3636+ width: 500
3737+ height: 372
3838+3939+ - id: laotie
4040+ name: 老铁 (Laotie)
4141+ imgid: d35a98e6-9215-4ca7-ac79-133c93d17700
4242+ size: medium
4343+ aspect_ratio: 3by4
4444+ width: 400
4545+ height: 533
4646+4747+ - id: mom_and_i
4848+ name: By the lake, beneath the canopies, in the beforetimes
4949+ imgid: 34e6b9ba-08a0-4a1a-437c-2e8839591500
5050+ size: medium
5151+ aspect_ratio: 3by4
5252+ width: 400
5353+ height: 515
454---
5555656+{{#
657include _includes/comps/icon
758include _includes/comps/modal
5959+#}}
86099-h2.title.is-3 Projects
6161+<h2 class="text-3xl font-bold">Projects</h2>
10621111-:md
6363+{{ filter strip_indent |> md }}
1264 Under construction! :purple_heart:
1365 (Yeah, I know, it's been ages, gimme some more time)
6666+{{ /filter }}
14671515-h2.title.is-3 Artworks
6868+<h2 class="text-3xl font-bold">Artworks</h2>
16691717-mixin display(id, title, imgid)
1818- -const { height, width, aspectRatio, ...rest } = attributes;
7070+{{ function display(attrs) }}
7171+ {{> const { id, title, imgid, height, width, aspect_ratio } = attrs }}
19722020- figure.display&attributes(rest)
2121- label(for=id role="button" tabindex="0")
2222- img(
2323- src=`https://imagedelivery.net/TLP_u-wyyvTEPKkgbA6Osg/${imgid}/public`
2424- alt=title
2525- width=width
2626- height=height
2727- )
2828-2929- figcaption
3030- h3.title.is-4= title
3131- block
7373+ <figure class="display">
7474+ <label for={{ id }} role="button" tabindex="0">
7575+ <img
7676+ src="https://imagedelivery.net/TLP_u-wyyvTEPKkgbA6Osg/{{ imgid }}/public"
7777+ alt={{ title }}
7878+ width={{ width }}
7979+ height={{ height }}
8080+ />
8181+ </label>
8282+8383+ <figcaption>
8484+ <h3 class="text-2xl font-bold">{{ title }}</h3>
8585+ {{ it[id] }}
8686+ </figcaption>
8787+ {{#
3288 +modal(id)
3389 .image.is-fullwidth(class=aspectRatio)
3490 img(
···3793 fetchpriority="low"
3894 loading="lazy"
3995 )
9696+ #}}
9797+{{ /function }}
40984141-mixin header(date, medium)
4242- p.subtitle.is-6
4343- span.icon-text
4444- +icon("far fa-calendar")
4545- span= filters.date(date, "PP")
4646- +icon("fas fa-brush")
4747- span= medium
9999+{{ function header(date, medium) }}
100100+ <p class="text-xl">
101101+ <i data-lucide="calendar"></i>
102102+ {{ date |> date("PP") }}
103103+ <i data-lucide="brush"></i>
104104+ {{ medium }}
105105+ </p>
106106+{{ /function }}
481074949-+display("tiger", "Ferality", "558e95a4-f685-4dee-32a6-8c33e49d9600").has-frame(
5050- size="medium" aspectRatio="is-square" width=400 height=408
5151-)
5252- +header("2018-12-02", "Oil on canvas")
5353- :md
108108+{{ set tiger }}
109109+ {{ header("2018-12-02", "Oil on canvas") }}
110110+ {{ filter strip_indent |> md }}
54111 One of the older works of mine — I think I'd only spent 2 years dabbling with oil paintings back then,
55112 and the technical inexpertise definitely shows — but a brazen and unpolished technique does not
56113 necessarily hinder expressiveness. ;)
5757-114114+58115 I really wanted to capture the anger in the tiger, and as I exaggerated its features and started furiously
59116 laying down sweeping strokes of striking orange, I too experienced the feral fury in me.
60117 Wish I could experience that again...
118118+ {{ /filter }}
119119+{{ /set }}
611206262-+display("altitudinous_blossoms", "Altitudinous blossoms", "170696fd-d9b4-4652-e168-2cc80250d400").has-frame(
6363- size="medium" aspectRatio="is-3by5" rtl width=400 height=660
6464-)
6565- +header("2021-02-11", "Oil on canvas")
6666- :md
121121+{{ set blossoms }}
122122+ {{ header("2021-02-11", "Oil on canvas") }}
123123+ {{ filter strip_indent |> md }}
67124 A friend of my mother's is a hobbyist photographer, and I think he took the original photo when he went to Tibet to...
68125 well, take pictures of the wild flora and fauna and the majestic landscape.
69126 (Y'know, like a photographer? Why else would he be there anyway?)
···76133 I did take a while to figure it out though. I also used a toothbrush to ~~paint~~ *spray* the white dots on,
77134 which are actually specks of mint-scented toothpaste and not white paint!
78135 Although, they look like they hold up just fine on the canvas.
136136+ {{ /filter }}
137137+{{ /set }}
791388080-+display("tropical_fish", "A piscine aura in the depths", "278a69c6-ec0a-4461-c3f3-79aa615ad800").has-frame(
8181- size="large" aspectRatio="is-4by3" width=500 height=380
8282-)
8383- +header("2021-06-05", "Oil on canvas")
8484- :md
139139+{{ set fish }}
140140+ {{ header("2021-06-05", "Oil on canvas") }}
141141+ {{ filter strip_indent |> md }}
85142 Some kind of tropical fish whose name I have completely forgotten. It didn't even occur to past-Leah to write these things down! *sigh*
8614387144 It's really pretty, especially for its lake-blue scales and blood-red fins! Sure did take a long time to paint though... It was around this time
88145 when my style really departed from the raw, emotional expression like *Ferality*, towards a finer sort of aesthetic.
146146+ {{ /filter }}
147147+{{ /set }}
891489090-+display("red_cotton", "A flower — what's her name again?", "35db3ba1-542a-46aa-2d10-850d34463e00").has-frame(
9191- size="large" aspectRatio="is-4by3" rtl width=500 height=372
9292-)
9393- +header("2021-12-11", "Oil on canvas")
9494- :md
149149+{{ set red_cotton }}
150150+ {{ header("2021-12-11", "Oil on canvas") }}
151151+ {{ filter strip_indent |> md }}
95152 Turns out it's a flower of the tree [*Bombax ceiba*](https://en.wikipedia.org/wiki/Bombax_ceiba), better known as
96153 the red cotton tree, or <ruby>木棉 <rp>(</rp><rt>mù mián</rt><rp>)</rp></ruby> in Chinese.
97154 I was going to leave it unidentified, but my mother's a bonafide botanist and identified it for me.
···99156 Its striking red color is honestly captivating, and I still have it displayed on the wall of my room,
100157 facing the entrance for I hope any visitors would appreciate its vividity and life force seeping out of the canvas,
101158 as much as I would.
159159+ {{ /filter }}
160160+{{ /set }}
102161103103-+display("laotie", "老铁 (Laotie)", "d35a98e6-9215-4ca7-ac79-133c93d17700").has-frame(
104104- size="medium" aspectRatio="is-3by4" width=400 height=533
105105-)
106106- +header("2022-03-20", "Oil on canvas")
107107- :md
162162+{{ set laotie }}
163163+ {{ header("2022-03-20", "Oil on canvas") }}
164164+ {{ filter strip_indent |> md }}
108165 He's a corgi in the studio we used to paint in, and his presence made most of our weekly painting hours turn into communal dog-petting sessions.
109166 It was lovely to paint with such an adorable cutie around, and time and stress all went away so swiftly with him.
110167 I still have like, *so* many photos of him playing around with us... Too bad that that studio was shut down about 2 months ago, on February 2023.
111168112169 My mother insists I painted Santa Claus in disguise of a dog! But really, he's just wearing some festive clothes...
170170+ {{ /filter }}
171171+{{ /set }}
113172114114-+display("mom_and_i", "By the lake, beneath the canopies, in the beforetimes", "34e6b9ba-08a0-4a1a-437c-2e8839591500").has-frame(
115115- size="medium" aspectRatio="is-3by4" width=400 height=515
116116-)
117117- +header("2022-07-23", "Oil on canvas")
118118- :md
173173+{{ set mom_and_i }}
174174+ {{ header("2022-07-23", "Oil on canvas") }}
175175+ {{ filter strip_indent |> md }}
119176 One summer afternoon, on the eastern shore of Jinji Lake, Suzhou. It was an awfully nice day, so my mother and I decided
120177 to take a selfie on our daily stroll outside.
121178 Originally, I decided to paint this as a work of memorabilia, to make me cherish the good times I spent with my mother at home,
···123180124181 But now, it has taken an additional level of meaning — this was the last painting I finished before I realized I was a trans woman.
125182 That tall silhouette with the masculine build was supposed to be me, but now it's representative of the person I used to be.
126126-183183+127184 However, I have to remain truthful to myself — regardless of who I am now, I *was* like that back then, and this fossilized image
128128- of me is one that I can't, and don't want to change. The past is not to be changed — the future, however, is.185185+ of me is one that I can't, and don't want to change. The past is not to be changed — the future, however, is.
186186+ {{ /filter }}
187187+{{ /set }}
188188+189189+{{ for artwork of artworks }}
190190+ {{ display(artwork) }}
191191+{{ /for }}