From 3ae1ea55ab1a4b1e5d0db4191efe5bebc4266a2b Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Mon, 9 Oct 2023 14:52:01 -0400 Subject: lume/blog: alvis post Signed-off-by: Xe Iaso --- lume/_config.ts | 1 + lume/deno.lock | 29 ++ lume/src/_includes/bare.njk | 94 ++++ lume/src/_includes/base.njk | 1 - lume/src/blog/alvis.mdx | 190 ++++++++ lume/src/blog/protos.mdx | 8 +- lume/src/landing/alvis.jsx | 478 +++++++++++++++++++++ lume/src/landing/alvis/P0001.md | 41 ++ lume/src/static/font/inter/Inter-Black.woff | Bin 0 -> 138764 bytes lume/src/static/font/inter/Inter-Black.woff2 | Bin 0 -> 102868 bytes lume/src/static/font/inter/Inter-BlackItalic.woff | Bin 0 -> 146824 bytes lume/src/static/font/inter/Inter-BlackItalic.woff2 | Bin 0 -> 108752 bytes lume/src/static/font/inter/Inter-Bold.woff | Bin 0 -> 143208 bytes lume/src/static/font/inter/Inter-Bold.woff2 | Bin 0 -> 106140 bytes lume/src/static/font/inter/Inter-BoldItalic.woff | Bin 0 -> 151052 bytes lume/src/static/font/inter/Inter-BoldItalic.woff2 | Bin 0 -> 111808 bytes lume/src/static/font/inter/Inter-ExtraBold.woff | Bin 0 -> 142920 bytes lume/src/static/font/inter/Inter-ExtraBold.woff2 | Bin 0 -> 106108 bytes .../static/font/inter/Inter-ExtraBoldItalic.woff | Bin 0 -> 150628 bytes .../static/font/inter/Inter-ExtraBoldItalic.woff2 | Bin 0 -> 111708 bytes lume/src/static/font/inter/Inter-ExtraLight.woff | Bin 0 -> 140724 bytes lume/src/static/font/inter/Inter-ExtraLight.woff2 | Bin 0 -> 104232 bytes .../static/font/inter/Inter-ExtraLightItalic.woff | Bin 0 -> 149996 bytes .../static/font/inter/Inter-ExtraLightItalic.woff2 | Bin 0 -> 111392 bytes lume/src/static/font/inter/Inter-Italic.woff | Bin 0 -> 144372 bytes lume/src/static/font/inter/Inter-Italic.woff2 | Bin 0 -> 106876 bytes lume/src/static/font/inter/Inter-Light.woff | Bin 0 -> 140632 bytes lume/src/static/font/inter/Inter-Light.woff2 | Bin 0 -> 104332 bytes lume/src/static/font/inter/Inter-LightItalic.woff | Bin 0 -> 150092 bytes lume/src/static/font/inter/Inter-LightItalic.woff2 | Bin 0 -> 111332 bytes lume/src/static/font/inter/Inter-Medium.woff | Bin 0 -> 142552 bytes lume/src/static/font/inter/Inter-Medium.woff2 | Bin 0 -> 105924 bytes lume/src/static/font/inter/Inter-MediumItalic.woff | Bin 0 -> 150988 bytes .../src/static/font/inter/Inter-MediumItalic.woff2 | Bin 0 -> 112184 bytes lume/src/static/font/inter/Inter-Regular.woff | Bin 0 -> 133844 bytes lume/src/static/font/inter/Inter-Regular.woff2 | Bin 0 -> 98868 bytes lume/src/static/font/inter/Inter-SemiBold.woff | Bin 0 -> 142932 bytes lume/src/static/font/inter/Inter-SemiBold.woff2 | Bin 0 -> 105804 bytes .../static/font/inter/Inter-SemiBoldItalic.woff | Bin 0 -> 151180 bytes .../static/font/inter/Inter-SemiBoldItalic.woff2 | Bin 0 -> 112048 bytes lume/src/static/font/inter/Inter-Thin.woff | Bin 0 -> 135920 bytes lume/src/static/font/inter/Inter-Thin.woff2 | Bin 0 -> 99632 bytes lume/src/static/font/inter/Inter-ThinItalic.woff | Bin 0 -> 145480 bytes lume/src/static/font/inter/Inter-ThinItalic.woff2 | Bin 0 -> 106496 bytes lume/src/static/font/inter/Inter-italic.var.woff2 | Bin 0 -> 245036 bytes lume/src/static/font/inter/Inter-roman.var.woff2 | Bin 0 -> 227180 bytes lume/src/static/font/inter/Inter.var.woff2 | Bin 0 -> 324864 bytes lume/src/static/font/inter/inter.css | 200 +++++++++ lume/tailwind.config.js | 1 + 49 files changed, 1038 insertions(+), 5 deletions(-) create mode 100644 lume/src/_includes/bare.njk create mode 100644 lume/src/blog/alvis.mdx create mode 100644 lume/src/landing/alvis.jsx create mode 100644 lume/src/landing/alvis/P0001.md create mode 100644 lume/src/static/font/inter/Inter-Black.woff create mode 100644 lume/src/static/font/inter/Inter-Black.woff2 create mode 100644 lume/src/static/font/inter/Inter-BlackItalic.woff create mode 100644 lume/src/static/font/inter/Inter-BlackItalic.woff2 create mode 100644 lume/src/static/font/inter/Inter-Bold.woff create mode 100644 lume/src/static/font/inter/Inter-Bold.woff2 create mode 100644 lume/src/static/font/inter/Inter-BoldItalic.woff create mode 100644 lume/src/static/font/inter/Inter-BoldItalic.woff2 create mode 100644 lume/src/static/font/inter/Inter-ExtraBold.woff create mode 100644 lume/src/static/font/inter/Inter-ExtraBold.woff2 create mode 100644 lume/src/static/font/inter/Inter-ExtraBoldItalic.woff create mode 100644 lume/src/static/font/inter/Inter-ExtraBoldItalic.woff2 create mode 100644 lume/src/static/font/inter/Inter-ExtraLight.woff create mode 100644 lume/src/static/font/inter/Inter-ExtraLight.woff2 create mode 100644 lume/src/static/font/inter/Inter-ExtraLightItalic.woff create mode 100644 lume/src/static/font/inter/Inter-ExtraLightItalic.woff2 create mode 100644 lume/src/static/font/inter/Inter-Italic.woff create mode 100644 lume/src/static/font/inter/Inter-Italic.woff2 create mode 100644 lume/src/static/font/inter/Inter-Light.woff create mode 100644 lume/src/static/font/inter/Inter-Light.woff2 create mode 100644 lume/src/static/font/inter/Inter-LightItalic.woff create mode 100644 lume/src/static/font/inter/Inter-LightItalic.woff2 create mode 100644 lume/src/static/font/inter/Inter-Medium.woff create mode 100644 lume/src/static/font/inter/Inter-Medium.woff2 create mode 100644 lume/src/static/font/inter/Inter-MediumItalic.woff create mode 100644 lume/src/static/font/inter/Inter-MediumItalic.woff2 create mode 100644 lume/src/static/font/inter/Inter-Regular.woff create mode 100644 lume/src/static/font/inter/Inter-Regular.woff2 create mode 100644 lume/src/static/font/inter/Inter-SemiBold.woff create mode 100644 lume/src/static/font/inter/Inter-SemiBold.woff2 create mode 100644 lume/src/static/font/inter/Inter-SemiBoldItalic.woff create mode 100644 lume/src/static/font/inter/Inter-SemiBoldItalic.woff2 create mode 100644 lume/src/static/font/inter/Inter-Thin.woff create mode 100644 lume/src/static/font/inter/Inter-Thin.woff2 create mode 100644 lume/src/static/font/inter/Inter-ThinItalic.woff create mode 100644 lume/src/static/font/inter/Inter-ThinItalic.woff2 create mode 100644 lume/src/static/font/inter/Inter-italic.var.woff2 create mode 100644 lume/src/static/font/inter/Inter-roman.var.woff2 create mode 100644 lume/src/static/font/inter/Inter.var.woff2 create mode 100644 lume/src/static/font/inter/inter.css 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% if title %} + {{ title }} - Xeserv + + + {% else %} + Xeserv + + + {% endif %} + + {% if hero %} + + + {% endif %} + + + {{ content | safe }} + \ 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 - 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 ( + <> +
{children}
+ + ); +} + +export function ChatBubble({ + reply = false, + bg = "blue-dark", + fg = "slate-50", + children, +}) { + return ( +
+
+
+
+ {children} +
+
+
+
+ ); +} + +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: + + + + Hey, I found something really cool yesterday that I think we could get a lot + of value out of. + + What is it? + + 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. + + That sounds really cool. How does it work? + + The power of AI! It's really cool, it kept me from getting woken up last + night. + + + That sounds really cool. I'll look into it. Keep playing with it. You have + my approval. + + + ๐Ÿ‘๐Ÿ‘๐Ÿ‘ Thanks! + + + +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. + + + 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. + + +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? + + + 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. + 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 ( +
+
+
+ +
+ ); +}; + +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 ( +
+
+
+
+
+ Give ChatGPT root in prod. What could possibly go wrong? +
+
+ + {menus.map((item) => ( +
+
{item.title}
+ +
+ ))} + +
+
+ Copyright 2023 Xeserv.
+ All rights reserved. +
+ + + +
+
+ ); +} + +export const Hero = () => { + return ( +
+
+

Alvis

+

+ Don't worry about being paged, Alvis will take care of it. +

+
+ + +
+ ); +} + +export const Features = () => { + const featureItems = [ + { + icon: IconAlarm, + description: + "Automatically respond to production incidents with our industry-leading AI. Alvis will diagnose the problem and fix it.", + link: "#", + }, + { + icon: IconZZZ, + description: + "Leave yourself free to sleep, write, work on projects, relax, or spend time with your family. Alvis will take care of it.", + }, + { + icon: IconArmchair, + description: "Get a detailed report for every incident Alvis handles. This helps you understand what went wrong and how to fix it.", + link: "/landing/alvis/P0001/", + }, + ]; + + return ( +
+ {featureItems.map((item) => { + return ( +
+
+
+

+ {item.description} +

+ + {item.link && + ( + +

+ Read More{" "} +

+
+ )} +
+ ); + })} +
+ ); +} + +export const Testimonials = () => { + const testimonials = [ + { + name: "James Dornick", + position: "Lead SRE @ WritePulse", + color: "bg-[#9d789b]", + avatar: "https://cdn.xeiaso.net/avatar/d69caff2a9fd74b7069be6ece1a06ac5", + quote: "Honestly, I wasn't able to spend time with my kid until I set up Alvis. Now family time isn't turned into work time!", + }, + { + name: "Samus Rhodes", + position: "SRE @ Worcation", + color: "bg-[#5b5faf]", + avatar: "https://cdn.xeiaso.net/avatar/9108f6d8df326e20a4c1983a910cd952", + quote: "I was able to get a promotion after setting up Alvis. I can't believe I didn't do it sooner!", + }, + { + name: "Maria Robotnik", + position: "SRE @ G.U.N.", + color: "bg-[#d61a9b]", + avatar: "https://cdn.xeiaso.net/avatar/f9f35179d3331f30f92793b724c26cf9", + quote: "Every time I get paged, I just tell Alvis to take care of it. I don't even have to look at my phone anymore!", + } + ]; + + return ( +
+
+

Testimonials

+

+ Don't believe us? Trust the voices of your peers. They obviously know what they're talking about, don't they? +

+
+ +
+ {testimonials.map((testimonial) => ( +
+
+
+
+ +
+
+

{testimonial.name}

+
{testimonial.position}
+
+

+ + + + {testimonial.quote} +

+
+
+
+ ))} +
+
+ ) +} + +export const FAQs = () => { + const faqs = [ + { + question: "How does Alvis work?", + answer: "Alvis takes your production playbooks and turns them into diagnostic and remediation scripts. It then runs them when you get paged. If it's able to fix the problem, it closes the incident. Otherwise it escalates to you.", + }, + { + question: "What AI does Alvis use?", + answer: "Alvis uses the latest and greatest in large language model technology. It's all developed in-house and is not a wrapper to other services. This ensures your data is safe and secure with Alvis.", + }, + { + question: "What is the connection between Alvis and the Rhadamanthus organization?", + answer: "Alvis is a completly separate entity from Rhadamanthus. We are not affiliated with them in any way. We wish them luck with Project Exodus and their conflicts with the Saviorites.", + }, + { + question: "What happens when I go over the number of incidents in my plan?", + answer: "Alvis will automatically escalate your incidents to the oncall engineer. This ensures that Alvis is fast and ready for everyone!", + } + ] + return ( +
+
+
+

Frequently asked questions

+

+ Canโ€™t find the answer youโ€™re looking for? Reach out to our{' '} + + customer support + {' '} + team. +

+
+
+
+ {faqs.map((faq) => ( +
+
{faq.question}
+
{faq.answer}
+
+ ))} +
+
+
+
+ ) +} + +export const Pricing = () => { + const tiers = [ + { + name: 'Individual', + id: 'tier-individual', + href: '#', + priceMonthly: '$10', + description: 'The essentials to provide your best work for clients.', + features: [ + '50 incidents included per month', + '48 hour response time', + 'Basic analytics', + 'Help center access', + 'Tailscale integration', + ], + mostPopular: false, + }, + { + name: 'Startup', + id: 'tier-startup', + href: '#', + priceMonthly: '$32', + description: 'A plan that scales with your rapidly growing business.', + features: [ + 'Custom incident response steps', + '500 incidents included per month', + 'Same-day response time', + 'Advanced analytics', + ], + mostPopular: true, + }, + { + name: 'Enterprise', + id: 'tier-enterprise', + href: '#', + priceMonthly: '$500', + description: 'Dedicated support and infrastructure for your company.', + features: [ + 'Artificial General Intelligence', + 'Unlimited incidents', + 'SOCII/HIPPA/PCI compliance', + 'Custom analytics', + 'Custom SLAs', + ], + mostPopular: false, + }, + ] + + function classNames(...classes) { + return classes.filter(Boolean).join(' ') + } + + return ( +
+
+
+

Pricing

+

+ Pricing plans for teams of all sizes +

+
+
+ {tiers.map((tier, tierIdx) => ( +
+
+
+

+ {tier.name} +

+ {tier.mostPopular ? ( +

+ Most popular +

+ ) : null} +
+

{tier.description}

+

+ {tier.priceMonthly} + /month +

+
    + {tier.features.map((feature) => ( +
  • +
  • + ))} +
+
+ + Buy plan + +
+ ))} +
+
+
+ ) +} + +export const CTA = () => { + return ( +
+

+ Boost your productivity. +
+ Start using Alvis today. +

+
+ + Get started + + + Learn more + +
+
+ ) +} + +export default function Alvis() { + return ( + + +
+
+ + + + + + +
+ + ); +}; \ No newline at end of file diff --git a/lume/src/landing/alvis/P0001.md b/lume/src/landing/alvis/P0001.md new file mode 100644 index 0000000..3df252c --- /dev/null +++ b/lume/src/landing/alvis/P0001.md @@ -0,0 +1,41 @@ +--- +title: "Incident Summary for Incident P0001" +date: 2023-10-08 +layout: blog.njk +--- + +## Summary + +On October 8th, 2023, at 10:32 PM EDT, an incident (P0001) was reported for the service "xe-pronouns". The incident was triggered by a failed health check for the "fly app xe-pronouns". The health check failure was resolved within one minute, and the incident was closed at 10:33 PM EDT after the app was successfully restarted and the health check passed. + +## Postmortem + +During the incident, a health check failure occurred for the xe-pronouns fly app. The health check failure was detected and reported at 10:32 PM EDT. Upon receiving the alert, immediate action was taken to address the issue. + +At 10:32 PM EDT, the app xe-pronouns was restarted to resolve the health check failure. Fortunately, the restart process was successful, and by 10:33 PM EDT, the health check passed again. As a result, the incident was closed promptly. + +### Root Cause + +The root cause of the incident was a health check failure for the fly app xe-pronouns. The exact reason for the failure is unknown and requires further investigation. + +### Resolution + +To resolve the issue, the system automatically initiated a restart of the xe-pronouns app. The app successfully restarted, and the subsequent health check passed. As a result, the incident was closed. + +### Corrective and Preventative Measures + +To prevent similar incidents in the future, the following steps will be taken: + +1. Investigate the root cause: Conduct a thorough investigation to identify the underlying cause of the health check failure. This may involve reviewing server logs, monitoring metrics, and analyzing system behavior leading up to the incident. + +2. Implement monitoring and alerts: Set up proactive monitoring for the xe-pronouns app to detect any health check failures or other anomalies. Configure alerts to notify the administrators immediately when an issue occurs. + +3. Improve error handling and logging: Enhance the error handling and logging mechanisms in the app to provide more detailed information during health check failures. This will aid in troubleshooting and root cause analysis. + +4. Conduct regular health checks: Perform periodic health checks on the xe-pronouns app to proactively identify any potential issues before they impact the service. This will help maintain the overall health and stability of the application. + +5. Perform regular system maintenance: Regularly update and patch the software and dependencies used by the xe-pronouns app to ensure it is running on the latest stable versions. This will help address any known issues and vulnerabilities. + +6. Document incident response procedures: Document clear and concise procedures for responding to incidents like health check failures. This will ensure a consistent and efficient response from the operations team in the future. + +By implementing these measures, we aim to minimize the occurrence of similar incidents and maintain the reliability and availability of the xe-pronouns service. \ No newline at end of file diff --git a/lume/src/static/font/inter/Inter-Black.woff b/lume/src/static/font/inter/Inter-Black.woff new file mode 100644 index 0000000..a18593a Binary files /dev/null and b/lume/src/static/font/inter/Inter-Black.woff differ diff --git a/lume/src/static/font/inter/Inter-Black.woff2 b/lume/src/static/font/inter/Inter-Black.woff2 new file mode 100644 index 0000000..68f64c9 Binary files /dev/null and b/lume/src/static/font/inter/Inter-Black.woff2 differ diff --git a/lume/src/static/font/inter/Inter-BlackItalic.woff b/lume/src/static/font/inter/Inter-BlackItalic.woff new file mode 100644 index 0000000..b6b0194 Binary files /dev/null and b/lume/src/static/font/inter/Inter-BlackItalic.woff differ diff --git a/lume/src/static/font/inter/Inter-BlackItalic.woff2 b/lume/src/static/font/inter/Inter-BlackItalic.woff2 new file mode 100644 index 0000000..1c9c7ca Binary files /dev/null and b/lume/src/static/font/inter/Inter-BlackItalic.woff2 differ diff --git a/lume/src/static/font/inter/Inter-Bold.woff b/lume/src/static/font/inter/Inter-Bold.woff new file mode 100644 index 0000000..eaf3d4b Binary files /dev/null and b/lume/src/static/font/inter/Inter-Bold.woff differ diff --git a/lume/src/static/font/inter/Inter-Bold.woff2 b/lume/src/static/font/inter/Inter-Bold.woff2 new file mode 100644 index 0000000..2846f29 Binary files /dev/null and b/lume/src/static/font/inter/Inter-Bold.woff2 differ diff --git a/lume/src/static/font/inter/Inter-BoldItalic.woff b/lume/src/static/font/inter/Inter-BoldItalic.woff new file mode 100644 index 0000000..3275076 Binary files /dev/null and b/lume/src/static/font/inter/Inter-BoldItalic.woff differ diff --git a/lume/src/static/font/inter/Inter-BoldItalic.woff2 b/lume/src/static/font/inter/Inter-BoldItalic.woff2 new file mode 100644 index 0000000..0b1fe8e Binary files /dev/null and b/lume/src/static/font/inter/Inter-BoldItalic.woff2 differ diff --git a/lume/src/static/font/inter/Inter-ExtraBold.woff b/lume/src/static/font/inter/Inter-ExtraBold.woff new file mode 100644 index 0000000..c2c17ed Binary files /dev/null and b/lume/src/static/font/inter/Inter-ExtraBold.woff differ diff --git a/lume/src/static/font/inter/Inter-ExtraBold.woff2 b/lume/src/static/font/inter/Inter-ExtraBold.woff2 new file mode 100644 index 0000000..c24c2bd Binary files /dev/null and b/lume/src/static/font/inter/Inter-ExtraBold.woff2 differ diff --git a/lume/src/static/font/inter/Inter-ExtraBoldItalic.woff b/lume/src/static/font/inter/Inter-ExtraBoldItalic.woff new file mode 100644 index 0000000..c42f705 Binary files /dev/null and b/lume/src/static/font/inter/Inter-ExtraBoldItalic.woff differ diff --git a/lume/src/static/font/inter/Inter-ExtraBoldItalic.woff2 b/lume/src/static/font/inter/Inter-ExtraBoldItalic.woff2 new file mode 100644 index 0000000..4a81dc7 Binary files /dev/null and b/lume/src/static/font/inter/Inter-ExtraBoldItalic.woff2 differ diff --git a/lume/src/static/font/inter/Inter-ExtraLight.woff b/lume/src/static/font/inter/Inter-ExtraLight.woff new file mode 100644 index 0000000..d0de5f3 Binary files /dev/null and b/lume/src/static/font/inter/Inter-ExtraLight.woff differ diff --git a/lume/src/static/font/inter/Inter-ExtraLight.woff2 b/lume/src/static/font/inter/Inter-ExtraLight.woff2 new file mode 100644 index 0000000..f2ea706 Binary files /dev/null and b/lume/src/static/font/inter/Inter-ExtraLight.woff2 differ diff --git a/lume/src/static/font/inter/Inter-ExtraLightItalic.woff b/lume/src/static/font/inter/Inter-ExtraLightItalic.woff new file mode 100644 index 0000000..81f1a28 Binary files /dev/null and b/lume/src/static/font/inter/Inter-ExtraLightItalic.woff differ diff --git a/lume/src/static/font/inter/Inter-ExtraLightItalic.woff2 b/lume/src/static/font/inter/Inter-ExtraLightItalic.woff2 new file mode 100644 index 0000000..9af717b Binary files /dev/null and b/lume/src/static/font/inter/Inter-ExtraLightItalic.woff2 differ diff --git a/lume/src/static/font/inter/Inter-Italic.woff b/lume/src/static/font/inter/Inter-Italic.woff new file mode 100644 index 0000000..a806b38 Binary files /dev/null and b/lume/src/static/font/inter/Inter-Italic.woff differ diff --git a/lume/src/static/font/inter/Inter-Italic.woff2 b/lume/src/static/font/inter/Inter-Italic.woff2 new file mode 100644 index 0000000..a619fc5 Binary files /dev/null and b/lume/src/static/font/inter/Inter-Italic.woff2 differ diff --git a/lume/src/static/font/inter/Inter-Light.woff b/lume/src/static/font/inter/Inter-Light.woff new file mode 100644 index 0000000..c496464 Binary files /dev/null and b/lume/src/static/font/inter/Inter-Light.woff differ diff --git a/lume/src/static/font/inter/Inter-Light.woff2 b/lume/src/static/font/inter/Inter-Light.woff2 new file mode 100644 index 0000000..bc4be66 Binary files /dev/null and b/lume/src/static/font/inter/Inter-Light.woff2 differ diff --git a/lume/src/static/font/inter/Inter-LightItalic.woff b/lume/src/static/font/inter/Inter-LightItalic.woff new file mode 100644 index 0000000..f84a9de Binary files /dev/null and b/lume/src/static/font/inter/Inter-LightItalic.woff differ diff --git a/lume/src/static/font/inter/Inter-LightItalic.woff2 b/lume/src/static/font/inter/Inter-LightItalic.woff2 new file mode 100644 index 0000000..842b2df Binary files /dev/null and b/lume/src/static/font/inter/Inter-LightItalic.woff2 differ diff --git a/lume/src/static/font/inter/Inter-Medium.woff b/lume/src/static/font/inter/Inter-Medium.woff new file mode 100644 index 0000000..d546843 Binary files /dev/null and b/lume/src/static/font/inter/Inter-Medium.woff differ diff --git a/lume/src/static/font/inter/Inter-Medium.woff2 b/lume/src/static/font/inter/Inter-Medium.woff2 new file mode 100644 index 0000000..f92498a Binary files /dev/null and b/lume/src/static/font/inter/Inter-Medium.woff2 differ diff --git a/lume/src/static/font/inter/Inter-MediumItalic.woff b/lume/src/static/font/inter/Inter-MediumItalic.woff new file mode 100644 index 0000000..459a656 Binary files /dev/null and b/lume/src/static/font/inter/Inter-MediumItalic.woff differ diff --git a/lume/src/static/font/inter/Inter-MediumItalic.woff2 b/lume/src/static/font/inter/Inter-MediumItalic.woff2 new file mode 100644 index 0000000..0e3019f Binary files /dev/null and b/lume/src/static/font/inter/Inter-MediumItalic.woff2 differ diff --git a/lume/src/static/font/inter/Inter-Regular.woff b/lume/src/static/font/inter/Inter-Regular.woff new file mode 100644 index 0000000..62d3a61 Binary files /dev/null and b/lume/src/static/font/inter/Inter-Regular.woff differ diff --git a/lume/src/static/font/inter/Inter-Regular.woff2 b/lume/src/static/font/inter/Inter-Regular.woff2 new file mode 100644 index 0000000..6c2b689 Binary files /dev/null and b/lume/src/static/font/inter/Inter-Regular.woff2 differ diff --git a/lume/src/static/font/inter/Inter-SemiBold.woff b/lume/src/static/font/inter/Inter-SemiBold.woff new file mode 100644 index 0000000..a815f43 Binary files /dev/null and b/lume/src/static/font/inter/Inter-SemiBold.woff differ diff --git a/lume/src/static/font/inter/Inter-SemiBold.woff2 b/lume/src/static/font/inter/Inter-SemiBold.woff2 new file mode 100644 index 0000000..611e90c Binary files /dev/null and b/lume/src/static/font/inter/Inter-SemiBold.woff2 differ diff --git a/lume/src/static/font/inter/Inter-SemiBoldItalic.woff b/lume/src/static/font/inter/Inter-SemiBoldItalic.woff new file mode 100644 index 0000000..909e43a Binary files /dev/null and b/lume/src/static/font/inter/Inter-SemiBoldItalic.woff differ diff --git a/lume/src/static/font/inter/Inter-SemiBoldItalic.woff2 b/lume/src/static/font/inter/Inter-SemiBoldItalic.woff2 new file mode 100644 index 0000000..545685b Binary files /dev/null and b/lume/src/static/font/inter/Inter-SemiBoldItalic.woff2 differ diff --git a/lume/src/static/font/inter/Inter-Thin.woff b/lume/src/static/font/inter/Inter-Thin.woff new file mode 100644 index 0000000..62bc58c Binary files /dev/null and b/lume/src/static/font/inter/Inter-Thin.woff differ diff --git a/lume/src/static/font/inter/Inter-Thin.woff2 b/lume/src/static/font/inter/Inter-Thin.woff2 new file mode 100644 index 0000000..abbc3a5 Binary files /dev/null and b/lume/src/static/font/inter/Inter-Thin.woff2 differ diff --git a/lume/src/static/font/inter/Inter-ThinItalic.woff b/lume/src/static/font/inter/Inter-ThinItalic.woff new file mode 100644 index 0000000..700a7f0 Binary files /dev/null and b/lume/src/static/font/inter/Inter-ThinItalic.woff differ diff --git a/lume/src/static/font/inter/Inter-ThinItalic.woff2 b/lume/src/static/font/inter/Inter-ThinItalic.woff2 new file mode 100644 index 0000000..ab0b200 Binary files /dev/null and b/lume/src/static/font/inter/Inter-ThinItalic.woff2 differ diff --git a/lume/src/static/font/inter/Inter-italic.var.woff2 b/lume/src/static/font/inter/Inter-italic.var.woff2 new file mode 100644 index 0000000..b826d5a Binary files /dev/null and b/lume/src/static/font/inter/Inter-italic.var.woff2 differ diff --git a/lume/src/static/font/inter/Inter-roman.var.woff2 b/lume/src/static/font/inter/Inter-roman.var.woff2 new file mode 100644 index 0000000..6a256a0 Binary files /dev/null and b/lume/src/static/font/inter/Inter-roman.var.woff2 differ diff --git a/lume/src/static/font/inter/Inter.var.woff2 b/lume/src/static/font/inter/Inter.var.woff2 new file mode 100644 index 0000000..365eedc Binary files /dev/null and b/lume/src/static/font/inter/Inter.var.woff2 differ diff --git a/lume/src/static/font/inter/inter.css b/lume/src/static/font/inter/inter.css new file mode 100644 index 0000000..f450010 --- /dev/null +++ b/lume/src/static/font/inter/inter.css @@ -0,0 +1,200 @@ +@font-face { + font-