aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2023-10-09 14:52:01 -0400
committerXe Iaso <me@xeiaso.net>2023-10-09 14:52:01 -0400
commit3ae1ea55ab1a4b1e5d0db4191efe5bebc4266a2b (patch)
treeb760d26a08e3695ed400fc51ecd1b251e31b2d44
parentcc4e4d20fc15703b8f3f714aa3605afc039983c2 (diff)
downloadxesite-3ae1ea55ab1a4b1e5d0db4191efe5bebc4266a2b.tar.xz
xesite-3ae1ea55ab1a4b1e5d0db4191efe5bebc4266a2b.zip
lume/blog: alvis post
Signed-off-by: Xe Iaso <me@xeiaso.net>
-rw-r--r--lume/_config.ts1
-rw-r--r--lume/deno.lock29
-rw-r--r--lume/src/_includes/bare.njk94
-rw-r--r--lume/src/_includes/base.njk1
-rw-r--r--lume/src/blog/alvis.mdx190
-rw-r--r--lume/src/blog/protos.mdx8
-rw-r--r--lume/src/landing/alvis.jsx478
-rw-r--r--lume/src/landing/alvis/P0001.md41
-rw-r--r--lume/src/static/font/inter/Inter-Black.woffbin0 -> 138764 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Black.woff2bin0 -> 102868 bytes
-rw-r--r--lume/src/static/font/inter/Inter-BlackItalic.woffbin0 -> 146824 bytes
-rw-r--r--lume/src/static/font/inter/Inter-BlackItalic.woff2bin0 -> 108752 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Bold.woffbin0 -> 143208 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Bold.woff2bin0 -> 106140 bytes
-rw-r--r--lume/src/static/font/inter/Inter-BoldItalic.woffbin0 -> 151052 bytes
-rw-r--r--lume/src/static/font/inter/Inter-BoldItalic.woff2bin0 -> 111808 bytes
-rw-r--r--lume/src/static/font/inter/Inter-ExtraBold.woffbin0 -> 142920 bytes
-rw-r--r--lume/src/static/font/inter/Inter-ExtraBold.woff2bin0 -> 106108 bytes
-rw-r--r--lume/src/static/font/inter/Inter-ExtraBoldItalic.woffbin0 -> 150628 bytes
-rw-r--r--lume/src/static/font/inter/Inter-ExtraBoldItalic.woff2bin0 -> 111708 bytes
-rw-r--r--lume/src/static/font/inter/Inter-ExtraLight.woffbin0 -> 140724 bytes
-rw-r--r--lume/src/static/font/inter/Inter-ExtraLight.woff2bin0 -> 104232 bytes
-rw-r--r--lume/src/static/font/inter/Inter-ExtraLightItalic.woffbin0 -> 149996 bytes
-rw-r--r--lume/src/static/font/inter/Inter-ExtraLightItalic.woff2bin0 -> 111392 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Italic.woffbin0 -> 144372 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Italic.woff2bin0 -> 106876 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Light.woffbin0 -> 140632 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Light.woff2bin0 -> 104332 bytes
-rw-r--r--lume/src/static/font/inter/Inter-LightItalic.woffbin0 -> 150092 bytes
-rw-r--r--lume/src/static/font/inter/Inter-LightItalic.woff2bin0 -> 111332 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Medium.woffbin0 -> 142552 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Medium.woff2bin0 -> 105924 bytes
-rw-r--r--lume/src/static/font/inter/Inter-MediumItalic.woffbin0 -> 150988 bytes
-rw-r--r--lume/src/static/font/inter/Inter-MediumItalic.woff2bin0 -> 112184 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Regular.woffbin0 -> 133844 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Regular.woff2bin0 -> 98868 bytes
-rw-r--r--lume/src/static/font/inter/Inter-SemiBold.woffbin0 -> 142932 bytes
-rw-r--r--lume/src/static/font/inter/Inter-SemiBold.woff2bin0 -> 105804 bytes
-rw-r--r--lume/src/static/font/inter/Inter-SemiBoldItalic.woffbin0 -> 151180 bytes
-rw-r--r--lume/src/static/font/inter/Inter-SemiBoldItalic.woff2bin0 -> 112048 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Thin.woffbin0 -> 135920 bytes
-rw-r--r--lume/src/static/font/inter/Inter-Thin.woff2bin0 -> 99632 bytes
-rw-r--r--lume/src/static/font/inter/Inter-ThinItalic.woffbin0 -> 145480 bytes
-rw-r--r--lume/src/static/font/inter/Inter-ThinItalic.woff2bin0 -> 106496 bytes
-rw-r--r--lume/src/static/font/inter/Inter-italic.var.woff2bin0 -> 245036 bytes
-rw-r--r--lume/src/static/font/inter/Inter-roman.var.woff2bin0 -> 227180 bytes
-rw-r--r--lume/src/static/font/inter/Inter.var.woff2bin0 -> 324864 bytes
-rw-r--r--lume/src/static/font/inter/inter.css200
-rw-r--r--lume/tailwind.config.js1
49 files changed, 1038 insertions, 5 deletions
diff --git a/lume/_config.ts b/lume/_config.ts
index a340f5f..333cd9e 100644
--- a/lume/_config.ts
+++ b/lume/_config.ts
@@ -28,6 +28,7 @@ const site = lume({
site.copy("static");
site.copy("favicon.ico");
+site.copy("static/font/inter/inter.css");
site.data("getYear", () => {
return new Date().getFullYear();
diff --git a/lume/deno.lock b/lume/deno.lock
index 68812b6..7cc9dc7 100644
--- a/lume/deno.lock
+++ b/lume/deno.lock
@@ -456,6 +456,14 @@
"https://deno.land/x/lume@v1.18.5/plugins/url.ts": "43d3d47896a7322a8dd34572dedb4baa6f73a382594a2ff7c34a3a064dcc6c9e",
"https://deno.land/x/lume@v1.18.5/plugins/utils.ts": "6435d164539d9e408e7e818b080cc1a96ff76ed3c376160577a7df751b57fa07",
"https://deno.land/x/lume@v1.18.5/plugins/yaml.ts": "df24aac4098dba258f1ac331a3b16ba488a336eb63c51afed8f59201228d583c",
+ "https://deno.land/x/tabler_icons_tsx@0.0.3/tsx/air-balloon.tsx": "d237673312f298c003138801b86d775b46d1699eb580d8a03018c9361d365cb5",
+ "https://deno.land/x/tabler_icons_tsx@0.0.3/tsx/alarm.tsx": "dffda4eadbab77c870236178f760f83e1e1f64a1ad6b136a6c99153b5137b8db",
+ "https://deno.land/x/tabler_icons_tsx@0.0.3/tsx/armchair.tsx": "8f30005e11d3f227e9fb1607e256bf360fad121e824bf54cf8fe48ae7b94a0d4",
+ "https://deno.land/x/tabler_icons_tsx@0.0.3/tsx/brand-github.tsx": "3e7c2e085570ebe78bf72d7ba9ad77e6519930feff5f3b653c3ba5b29b1c863b",
+ "https://deno.land/x/tabler_icons_tsx@0.0.3/tsx/chevron-right.tsx": "ac5c5c1a1b4aa6313347372f2d8dbb6cf192cf95d28573ae40d7d42e9073d0b6",
+ "https://deno.land/x/tabler_icons_tsx@0.0.3/tsx/lemon-2.tsx": "0de8b795eb80cf892897ac09ac6f5478e4d5332a3c7f2e403e797eea376381b6",
+ "https://deno.land/x/tabler_icons_tsx@0.0.5/tsx/check.tsx": "7a34654bec04502f8c411801621572232fa842a3a916fe6da0897aa0affb60ac",
+ "https://deno.land/x/tabler_icons_tsx@0.0.5/tsx/zzz.tsx": "58c9caa980f34bffd532ee0810fb4d7c061c20348db1858214c1758eafded78d",
"https://deno.land/x/xml@2.1.1/mod.ts": "4a314a7a28d1ec92f899ce4c6991f0356c77550a75955ec3f4a36733f08548e8",
"https://deno.land/x/xml@2.1.1/parse.ts": "614b8648345ae93c641368836947484d321c7ac9312ae12ec750434353cd7385",
"https://deno.land/x/xml@2.1.1/stringify.ts": "930d35431f153b29d36549cff08fcfbe978e52ccb56af1e3baa2e0760f418b04",
@@ -469,6 +477,8 @@
},
"npm": {
"specifiers": {
+ "@headlessui/react": "@headlessui/react@1.7.17_react@18.2.0_react-dom@18.2.0__react@18.2.0",
+ "@heroicons/react": "@heroicons/react@2.0.18_react@18.2.0",
"@mdx-js/mdx@2.3.0": "@mdx-js/mdx@2.3.0",
"@tailwindcss/forms": "@tailwindcss/forms@0.5.6_tailwindcss@3.3.3__postcss@8.4.29",
"@tailwindcss/typography": "@tailwindcss/typography@0.5.10_tailwindcss@3.3.3__postcss@8.4.29",
@@ -488,6 +498,7 @@
"preact": "preact@10.17.1",
"preact-render-to-string@6.2.1": "preact-render-to-string@6.2.1_preact@10.17.1",
"preact@10.17.1": "preact@10.17.1",
+ "react": "react@18.2.0",
"react-dom@18.2.0": "react-dom@18.2.0_react@18.2.0",
"react@18.2.0": "react@18.2.0",
"rehype-prism-plus": "rehype-prism-plus@1.6.3",
@@ -517,6 +528,20 @@
"postcss-selector-parser": "postcss-selector-parser@6.0.13"
}
},
+ "@headlessui/react@1.7.17_react@18.2.0_react-dom@18.2.0__react@18.2.0": {
+ "integrity": "sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==",
+ "dependencies": {
+ "client-only": "client-only@0.0.1",
+ "react": "react@18.2.0",
+ "react-dom": "react-dom@18.2.0_react@18.2.0"
+ }
+ },
+ "@heroicons/react@2.0.18_react@18.2.0": {
+ "integrity": "sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==",
+ "dependencies": {
+ "react": "react@18.2.0"
+ }
+ },
"@jridgewell/gen-mapping@0.3.3": {
"integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
"dependencies": {
@@ -825,6 +850,10 @@
"readdirp": "readdirp@3.6.0"
}
},
+ "client-only@0.0.1": {
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "dependencies": {}
+ },
"comma-separated-tokens@2.0.3": {
"integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
"dependencies": {}
diff --git a/lume/src/_includes/bare.njk b/lume/src/_includes/bare.njk
new file mode 100644
index 0000000..362e231
--- /dev/null
+++ b/lume/src/_includes/bare.njk
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html lang="en">
+ <!--
+MMMMMMMMMMMMMMMMMMNmmNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNmmmd.:mmMM
+MMMMMMMMMMMMMMMMMNmmmNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNmmydmmmmmNMM
+MMMMMMMMMMMMMMMMNm/:mNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNmms /mmmmmMMM
+MMMMMMMMMMMMMMMNmm:-dmMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNmmmmdsdmmmmNMMM
+MMMMMMMMMMMMMMMmmmmmmmNMMMMMMMMMMMNmmdhhddhhmNNMMMMMMMMMMMMMMMMNmy:hmmmmmmmmMMMM
+MMMMMMMMMMMMMMNm++mmmmNMMMMMMmdyo/::.........-:/sdNMMMMMMMMMMNmmms`smmmmmmmNMMMM
+MMMMMMMMMMMMMMmd.-dmmmmMMmhs/-....................-+dNMMMMMMNmmmmmmmmmmmmmmMMMMM
+MMMMMMMMMMMMMNmmmmmmmmho:-...........................:sNMMNmmmmmmmmmmmmmmmNMNmdd
+MMMMMMMMMMMMNmd+ydhs/-.................................-sNmmmmmmmmmmmmmmmdhyssss
+MMMMMMMMMMMNNh+`........................................:dmmmmmmmmmmmmmmmyssssss
+MMMMNNdhy+:-...........................................+dmmmmmmmmmmmmmmmdsssssss
+MMMN+-...............................................-smmmmmmmmmmmmmmmmmysyyhdmN
+MMMMNho:::-.--::-.......................----------..:hmmmmmmmmmmmmmmmmmmmNMMMMMM
+MMMMMMMMNNNmmdo:......................--------------:ymmmmmmmmmmmmmmmmmmmMMMMMMM
+MMMMMMMMMMds+........................-----------------+dmmmmmmmmmmmmmmmmmMMMMMMM
+MMMMMMMMMh+........................--------------------:smmmmmmmmmmmmmmNMMMMMMMM
+MMMMMMMNy/........................-------------::--------/hmmmmmmmmmmmNMMMMMMNmd
+MMMMMMMd/........................--------------so----------odmmmmmmmmMMNmdhhysss
+MMMMMMm/........................--------------+mh-----------:ymmmmdhhyysssssssss
+MMMMMMo.......................---------------:dmmo------------+dmdysssssssssssss
+yhdmNh:......................---------------:dmmmm+------------:sssssssssssyhhdm
+sssssy.......................--------------:hmmmmmmos++:---------/sssyyhdmNMMMMM
+ssssso......................--------------:hmmmNNNMNdddysso:------:yNNMMMMMMMMMM
+ysssss.....................--------------/dmNyy/mMMd``d/------------sNMMMMMMMMMM
+MNmdhy-...................--------------ommmh`o/NM/. smh+-----------:yNMMMMMMMMM
+MMMMMN+...................------------/hmmss: `-//-.smmmmd+----------:hMMMMMMMMM
+MMMMMMd:..................----------:smmmmhy+oosyysdmmy+:. `.--------/dMMMMMMMM
+MMMMMMMh-................---------:smmmmmmmmmmmmmmmh/` `/s:-------sMMMMMMMM
+MMMMMMMms:...............-------/ymmmmmmmmmmmmmmmd/ :dMMNy/-----+mMMMMMMM
+MMMMMMmyss/..............------ommmmmmmmmmmmmmmmd. :yMMMMMMNs:---+mMMMMMMM
+MMMMNdssssso-............----..odmmmmmmmmmmmmmmh:.` .sNMMMMMMMMMd/--sMMMMMMMM
+MMMmysssssssh/................` -odmmmmmmmmmh+. `omMMMMMMMMMMMMh/+mMMMMMMMM
+MNdyssssssymMNy-.............. `/sssso+:. `+mMMMMMMMMMMMMMMMdNMMMMMMMMM
+NhssssssshNMMMMNo:............/.` `+dMMMMMMMMMMMMMMMMMMMMMMMMMMMM
+ysssssssdMMMMMMMMm+-..........+ddy/.` -omMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
+ssssssymMMMMMMMMMMMh/.........-oNMMNmy+--` `-+dNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
+ssssydNMMMMMMMMMMMMMNy:........-hMMMMMMMNmdmMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
+sssymMMMMMMMMMMMMMMMMMm+....-..:hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
+symNMMMMMMMMMMMMMMMMMMMNo.../-/dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
+dNMMMMMMMMMMMMMMMMMMMMMMh:.:hyNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
+la budza pu cusku lu
+ <<.i do snura .i ko kanro
+ .i do panpi .i ko gleki>> li'u
+-->
+
+ <head>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+ <meta name="go-import" content="xeiaso.net/v4 git https://github.com/Xe/site"/>
+
+ <link rel="stylesheet" href="https://cdn.xeiaso.net/static/pkg/iosevka/family.css"/>
+ <link rel="stylesheet" href="/styles.css"/>
+ <link rel="alternate" type="application/rss+xml" href="https://xeiaso.net/blog.rss"/>
+ <link rel="alternate" type="application/json" href="https://xeiaso.net/blog.json"/>
+
+ <link rel="apple-touch-icon" sizes="57x57" href="/static/favicon/apple-icon-57x57.png">
+ <link rel="apple-touch-icon" sizes="60x60" href="/static/favicon/apple-icon-60x60.png">
+ <link rel="apple-touch-icon" sizes="72x72" href="/static/favicon/apple-icon-72x72.png">
+ <link rel="apple-touch-icon" sizes="76x76" href="/static/favicon/apple-icon-76x76.png">
+ <link rel="apple-touch-icon" sizes="114x114" href="/static/favicon/apple-icon-114x114.png">
+ <link rel="apple-touch-icon" sizes="120x120" href="/static/favicon/apple-icon-120x120.png">
+ <link rel="apple-touch-icon" sizes="144x144" href="/static/favicon/apple-icon-144x144.png">
+ <link rel="apple-touch-icon" sizes="152x152" href="/static/favicon/apple-icon-152x152.png">
+ <link rel="apple-touch-icon" sizes="180x180" href="/static/favicon/apple-icon-180x180.png">
+ <link rel="icon" type="image/png" sizes="192x192" href="/static/favicon/android-icon-192x192.png">
+ <link rel="icon" type="image/png" sizes="32x32" href="/static/favicon/favicon-32x32.png">
+ <link rel="icon" type="image/png" sizes="96x96" href="/static/favicon/favicon-96x96.png">
+ <link rel="icon" type="image/png" sizes="16x16" href="/static/favicon/favicon-16x16.png">
+ <link rel="icon" href="/favicon.ico?v=2"/>
+ <link rel="manifest" href="/static/manifest.json">
+ <meta name="msapplication-TileColor" content="#ffffff">
+ <meta name="msapplication-TileImage" content="/static/favicon/ms-icon-144x144.png">
+ <meta name="theme-color" content="#ffffff">
+
+ {% if title %}
+ <title>{{ title }} - Xeserv</title>
+ <meta property="og:title" content="{{ title }} - Xeserv"/>
+ <meta property="twitter:title" content="{{ title }} - Xeserv"/>
+ {% else %}
+ <title>Xeserv</title>
+ <meta property="og:title" content="Xeserv"/>
+ <meta property="twitter:title" content="Xeserv"/>
+ {% endif %}
+
+ {% if hero %}
+ <meta property="og:image" content="https://cdn.xeiaso.net/file/christine-static/hero/{{ hero.file }}.jpg"/>
+ <meta property="twitter:image" content="https://cdn.xeiaso.net/file/christine-static/hero/{{ hero.file }}.jpg"/>
+ {% endif %}
+ </head>
+
+ {{ content | safe }}
+</html> \ No newline at end of file
diff --git a/lume/src/_includes/base.njk b/lume/src/_includes/base.njk
index bc53ca3..9c3a278 100644
--- a/lume/src/_includes/base.njk
+++ b/lume/src/_includes/base.njk
@@ -54,7 +54,6 @@ la budza pu cusku lu
<link rel="stylesheet" href="/styles.css"/>
<link rel="alternate" type="application/rss+xml" href="https://xeiaso.net/blog.rss"/>
- <link rel="alternate" type="application/atom+xml" href="https://xeiaso.net/blog.atom"/>
<link rel="alternate" type="application/json" href="https://xeiaso.net/blog.json"/>
<link rel="apple-touch-icon" sizes="57x57" href="/static/favicon/apple-icon-57x57.png">
diff --git a/lume/src/blog/alvis.mdx b/lume/src/blog/alvis.mdx
new file mode 100644
index 0000000..1f1b405
--- /dev/null
+++ b/lume/src/blog/alvis.mdx
@@ -0,0 +1,190 @@
+---
+title: Alvis
+date: 2023-10-09
+tags:
+ - ai
+ - fiction
+hero:
+ file: basketball
+ prompt: "an effeminate anime guy in a basketball jersey holding a basketball"
+ ai: "SCMix"
+---
+
+export function ChatFrame({ children }) {
+ return (
+ <>
+ <div className="w-full space-y-4 p-4">{children}</div>
+ </>
+ );
+}
+
+export function ChatBubble({
+ reply = false,
+ bg = "blue-dark",
+ fg = "slate-50",
+ children,
+}) {
+ return (
+ <div className={`mx-auto w-full ${reply ? "" : "space-y-4"}`}>
+ <div className={`flex ${reply ? "justify-start" : "justify-end"}`}>
+ <div className={`flex w-11/12 ${reply ? "" : "flex-row-reverse"}`}>
+ <div
+ className={`relative max-w-xl rounded-xl ${
+ reply ? "rounded-tl-none" : "rounded-tr-none"
+ } bg-${bg} px-4 py-2`}
+ >
+ <span className={`font-medium text-${fg}`}>{children}</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ );
+}
+
+Sleep. It's such a lovely feeling. The taste of total obliteration that comes when you hit the pillow. Jared was peacefully asleep and dreaming of a world much like his own. One with capitalism and money and all of the other problems that bother us all. In the blissful silence of his bedroom, he was at peace.
+
+Then his pager went off. It crooned out "The server's on fireeee\~\~". The peace of sleep was shattered instantly with the force of a thousand hammers against prop glass. Jared was awake, and he was not happy about it.
+
+He got up and ambled over to his computer, half awake and blurry-eyed. He rubbed his eyes and unlocked his phone. It went off again with a happy little "The server's on fireeee\~\~". He sighed and picked up his phone. He opened the pager app and looked at the incident. The database was full of temporary entries again. _Huh, shouldn't this happen in like 3 months?_ he thought to himself. He opened up the database and looked at the logs. He prepared a delete command from the playbook and lifted his hand up to scratch his ear.
+
+His glass of water from last night was in the worst possible position. He knocked it over and it spilled all over the expensive MacBook keyboard. The keyboard started pressing enter repeatedly. He looked at the screen in horror. The database was being deleted. He tried to stop it, but the damage was already done. His laptop screen shut off and the magic smoke came out.
+
+It was toast. The database was gone.
+
+A small trickle of pages became a flood. The pager sound played over and over and then more times at once. The messages became increasingly dire and horrible from "the website isn't loading" to "our revenue graph is reading 0".
+
+It was finished. Techaro ceased to exist in a flash. Jared was out of a job. He was out of a home. He was out of a life. He was out of a future. He was out of everything. Jared screamed in horror.
+
+Jared shot upwards in his bed, still screaming in terror at the situation. He grabbed his phone and loaded the Techaro website. Everything worked fine. He loaded the PagerDuty app. Everything was fine. He loaded the Techaro status page. Everything was fine. He sighed in relief and put his phone back on the charger.
+
+His cat had run into his room because of the noise. She jumped up on his bed and pressed her forehead into his leg. He looked over at his cat, who was looking at him with a concerned look on her face. He petted her and she purred. He sighed again and laid back down. His cat was purring and he was petting her. He was at peace.
+
+He sat upright and grabbed his phone again. It was 7:00 AM, going back to sleep was either unwise or impossible at this point. Especially not after a nightmare like he had just had.
+
+He walked over to his kitchenette and hit the button on his coffee pod machine. Everything was set up the night prior so that he could take the time to read a bit of a vice that he'd been trying to quit but just couldn't: Slacker News on ZCombninator's website. He sat down at his desk and opened up the website. He clicked on the first link and started reading.
+
+Apparently a new startup had been added to the ZCombninator W23 batch, its name was Xeserv and its main product was a tool named Alvis. It claimed to be an AI-powered first-level software incident responder. They had a [fancy landing page](/landing/alvis/) with some information and a "Get started" button.
+
+_Interesting_, he thought to himself, _I really wonder how this could be used to handle those annoying non-incident pages._ He looked at the time again and realized that he had to get ready for work. He downed his coffee and got dressed. He grabbed his bag and walked out the door.
+
+Later that day, Jared had an uneventful day in the OurWork office. He had an interrupt ticket in front of him to write an oncall playbook for the Techaro website. Apparently sometimes the website would just stop responding to HTTP queries and the only real fix was to restart it. There was some weird lock contention issue that happened sometimes, but nobody could really figure out where it was (plus, it was cheaper to just restart the website when it happened instead of actually fixing the problematic Palima code). He opened VS Code and started writing:
+
+```markdown
+## techaro.fake is down
+
+- Check the health check page https://techaro.fake/.techaro/healthy
+ - If it's down, restart the app
+ - If it's up, escalate to the on-call engineer
+- Restart the app with `fly apps restart`: `fly apps restart techaro-website`
+- Wait for one minute
+- Check the health check page again https://techaro.fake/.techaro/healthy
+ - If it's down, escalate to the on-call engineer
+ - If it's up, close the incident
+```
+
+As he was writing that, his thoughts drifted again to [Alvis](/landing/alvis/). _Do we really have to have a human respond to this?_ He thought more about the problem and realized that _no, in fact, we do not need to have a human respond to this_. He opened up the Alvis documentation and scrolled down to how you defined a playbook. It was a simple YAML file. He translated his playbook a bit and hit save:
+
+```yaml
+meta:
+ service: techaro-website
+ platform: fly.io
+ condition: health check failed
+
+health_check:
+ url: https://techaro.fake/.techaro/healthy
+ method: GET
+ want_status: 200
+ every: 5m
+
+details: |-
+ Run your own copy of health checks.
+
+ If your health check fails, restart the app.
+ If it succeeds, close the incident.
+
+ Wait for one minute afte restarting the app.
+ Run the health check again after restarting the app.
+
+ If it fails again, escalate to the on-call engineer.
+```
+
+He pasted the YAML into their friendly web editor and hit save. He was done. Alvis was ticking along behind the scenes to check the website for him. He pull requested his playbook and went back to work.
+
+Later that day, he got an email from Alvis. The website had gone down and Alvis restarted it. Alvis even wrote an [incident summary](/landing/alvis/P0001/) for him.
+
+Until that point he was skeptical of the benefits of Alvis. Reading that summary totally sold it for him.
+
+> During the incident, a health check failure occurred for the Techary website. The health check failure was detected and reported at 10:32 PM UTC. Upon receiving the alert, immediate action was taken to address the issue.
+>
+> The root cause of the incident was a health check failure. The exact reason for the failure is unknown and requires further investigation.
+>
+> To resolve the issue, the system automatically initiated a restart of the website. The website successfully restarted, and the subsequent health check passed. As a result, the incident was closed.
+
+Writing those summaries amounted to about 20% of his job. He never had to write an incident summary again. He was happy. He pasted it into the incident response channel and went back to work.
+
+He woke up the next morning and found that Alvis had restarted the website again at 3 AM. He was elated. He didn't get woken up by it. When he went into work, he had a slack conversation with his manager:
+
+<ChatFrame>
+ <ChatBubble bg="emerald-300" fg="slate-900">
+ Hey, I found something really cool yesterday that I think we could get a lot
+ of value out of.
+ </ChatBubble>
+ <ChatBubble bg="red-600" reply>What is it?</ChatBubble>
+ <ChatBubble bg="emerald-300" fg="slate-900">
+ It's called [Alvis](/landing/alvis/). It's an AI that can respond to
+ incidents for us. It'll even write the postmortem documents for us.
+ </ChatBubble>
+ <ChatBubble bg="red-600" reply>That sounds really cool. How does it work?</ChatBubble>
+ <ChatBubble bg="emerald-300" fg="slate-900">
+ The power of AI! It's really cool, it kept me from getting woken up last
+ night.
+ </ChatBubble>
+ <ChatBubble bg="red-600" reply>
+ That sounds really cool. I'll look into it. Keep playing with it. You have
+ my approval.
+ </ChatBubble>
+ <ChatBubble bg="emerald-300" fg="slate-900">
+ 👍👍👍 Thanks!
+ </ChatBubble>
+</ChatFrame>
+
+And Techaro became a customer of Alvis. It saved the SRE team from their sleepless nights and it saved the company from the cost of having to pay people to be oncall. It was a win-win for everyone.
+
+Then Jared got woken up because they went over their incident count for the month.
+
+---
+
+Okay, so I realize that a lot of this is intended to be satire of our industry (and realistically, we deserve it, holy heck) but really a lot of the time we take the presence of on-call people for granted. I mean, I'm also speaking from the perspective of someone who has legitimately been woken up at ungodly times at night due to some random service going down and the only realistic option is to restart it, make sure things are happy, and go back to sleep. Yes realistically the service should just be fixed so that the problem doesn't happen at all, but we chronically forego maintenance because maintenance of existing systems doesn't get you promoted.
+
+Really, I've been _demoted_ because I wanted to focus on fixing the things that were making me lose sleep. To this day, most of the default PagerDuty ringtones give me traumatic flashbacks to when I was woken up in the middle of the night because some insomniac decided that the best way to go to sleep was to make drastic changes to some critical path API route that broke spectacularly.
+
+Normally I don't write this kind of section into my satire stories because I feel that the point should be obvious from the onset (like with [Sine](/blog/sine/)'s satire of the collapse of the medical system where I live), but with this one I really have to spell it out because I want you people to actually think about this issue.
+
+Why are we waking people up when restarting the service with a machine will just fix the issue enough so they can sleep?
+
+Is first line pager response really that important that we need to wake people up in the middle of the night?
+
+Is burnout really worth it?
+
+Maybe I in particular am just a bad candidate for oncall work, maybe this isn't actually a problem for people that aren't neurodivergent, but I really think that we have normalized waking people up in the middle of the night to follow a playbook that ChatGPT (or even a bunch of shitty if statements) can do better than any of us. I really think that the best course of action is to fundamentally change the incentives at play so that maintenance is rewarded more than new feature work, but I don't know how to do that.
+
+<XeblogConv name="Cadey" mood="coffee">
+ By the way, I have actually had a dream about accidentally deleting the
+ database before. It happens about once per quarter. I'm not sure why. I really
+ wish I could make them stop.
+</XeblogConv>
+
+The problem with maintenance work (and SRE in general) is that success is a negative. Things don't go wrong. People don't have issues. Under that lens of analysis, it's very easy to understand why it doesn't get people rewarded. It's also easy to understand why people sometimes _deliberately design systems to fail_ so that they can get rewarded for fixing them.
+
+Why do we accept this as an industry?
+
+<XeblogConv name="Mara" mood="hacker">
+ By the way, during the process of writing this article, a prototype for Alvis
+ was actually made. It will not be released on GitHub though, because there is
+ more to incident response than just restarting applications. Realistically,
+ most of what you get woken up for is when things are stuck in a weird state
+ and you need to restart it to get things working again. Arguably those
+ services should be made resilient enough that you don't need to wake people up
+ for that but in a pinch a restart-if-faling cronjob or a watchdog timer works
+ wonders here.
+</XeblogConv>
diff --git a/lume/src/blog/protos.mdx b/lume/src/blog/protos.mdx
index dfcef32..79711f2 100644
--- a/lume/src/blog/protos.mdx
+++ b/lume/src/blog/protos.mdx
@@ -47,7 +47,7 @@ investor class pressure to "cut costs". Techaro management had
followed suit. So he was left with this problem.
While Jeff was puzzling through the dense block of tokens, he took a
-look at his favorite news aggregator: Hacker Moose. While scrolling
+look at his favorite news aggregator: Slacker News. While scrolling
through the links, he saw something called "Protos". It claimed to be
a tool that he could install in BS Code and then it could rewrite code
to his needs.
@@ -146,7 +146,7 @@ wrote themselves. This was the real deal.
Jeff suddenly became terrified when he realized the power of this
technology. He had to be careful with this. He couldn't tell anyone
-about this and went over to flag the story on Hacker Moose as spam.
+about this and went over to flag the story on Slacker News as spam.
This could put him out of a job. He was shaking at his desk when
Palima walked over and clicked happily. Jeff looked over at aer and
@@ -167,7 +167,7 @@ and decided to keep the branches locally so he could release one or
two changes per day. Just enough to look like he was working, not
enough that it would look suspicious.
-Ariel was suspicious though. He also read Hacker Moose and was
+Ariel was suspicious though. He also read Slacker News and was
skeptical that Jeff could have figured out Palima's code so quickly.
He was a bit of a developer himself, so he took a look at one of the
backlog tickets and fired up Protos to implement a fix.
@@ -203,7 +203,7 @@ disrupting the government industry, and then
Jeff woke up at his desk. He must have dozed off. The calendar
reminder popped up on his screen, reminding him of his standup. The
-login form wasn't fixed yet. Hacker Moose didn't have a product named
+login form wasn't fixed yet. Slacker News didn't have a product named
Protos on the frontpage. The domain he remembered from his dream
didn't resolve.
diff --git a/lume/src/landing/alvis.jsx b/lume/src/landing/alvis.jsx
new file mode 100644
index 0000000..bdb2405
--- /dev/null
+++ b/lume/src/landing/alvis.jsx
@@ -0,0 +1,478 @@
+import BrandGithub from "https://deno.land/x/tabler_icons_tsx@0.0.3/tsx/brand-github.tsx";
+import LemonIcon from "https://deno.land/x/tabler_icons_tsx@0.0.3/tsx/lemon-2.tsx";
+import CheckIcon from "https://deno.land/x/tabler_icons_tsx@0.0.5/tsx/check.tsx"
+import IconChevronRight from "https://deno.land/x/tabler_icons_tsx@0.0.3/tsx/chevron-right.tsx";
+import IconAlarm from "https://deno.land/x/tabler_icons_tsx@0.0.3/tsx/alarm.tsx";
+import IconZZZ from "https://deno.land/x/tabler_icons_tsx@0.0.5/tsx/zzz.tsx"
+import IconArmchair from "https://deno.land/x/tabler_icons_tsx@0.0.3/tsx/armchair.tsx";
+
+export const layout = "bare.njk";
+export const title = "Alvis - Never get paged again";
+
+export const Header = ({ active }) => {
+ const menus = [
+ { name: "Home", href: "/" },
+ { name: "Blog", href: "/blog/" },
+ { name: "Contact", href: "/contact/" },
+ { name: "Resume", href: "/resume/" },
+ { name: "Talks", href: "/talks/" },
+ { name: "VODs", href: "/vods/" },
+ ];
+
+ return (
+ <div className="bg-slate-200 dark:bg-slate-800 text-slate-900 dark:text-slate-100 mb-4 w-full max-w-screen-lg py-6 px-8 flex flex-col md:flex-row gap-4">
+ <div className="flex items-center flex-1">
+ <LemonIcon className="inline-block" aria-hidden="true" />
+ <div className="text-2xl ml-1 font-bold">
+ Alvis
+ </div>
+ </div>
+ <ul className="flex items-center gap-6">
+ {menus.map((menu) => (
+ <li>
+ <a
+ href={menu.href}
+ className={menu.href === active ? " font-bold border-b-2" : ""}
+ >
+ {menu.name}
+ </a>
+ </li>
+ ))}
+ </ul>
+ </div>
+ );
+};
+
+export const Footer = () => {
+ const menus = [
+ {
+ title: "Documentation",
+ children: [
+ { name: "Getting Started", href: "#" },
+ { name: "Guide", href: "#" },
+ { name: "API", href: "#" },
+ { name: "Showcase", href: "#" },
+ { name: "Pricing", href: "/blog/alvis/" },
+ ],
+ },
+ {
+ title: "Community",
+ children: [
+ { name: "Forum", href: "#" },
+ { name: "Discord", href: "#" },
+ ],
+ },
+ ];
+
+ return (
+ <div class="bg-slate-200 dark:bg-slate-800 text-slate-900 dark:text-slate-100 mt-4 flex flex-col md:flex-row w-full max-w-screen-lg gap-8 md:gap-16 px-8 py-8 text-sm">
+ <div class="flex-1">
+ <div class="flex items-center gap-1">
+ <LemonIcon class="inline-block" aria-hidden="true" />
+ <div class="font-bold text-2xl">
+ Alvis
+ </div>
+ </div>
+ <div class="text-gray-500">
+ Give ChatGPT root in prod. What could possibly go wrong?
+ </div>
+ </div>
+
+