From 543c4bee328a38eddc5ba5489bec49c3b2f6fb59 Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Sat, 9 Sep 2023 15:00:41 -0400 Subject: config: init go package, import dhall config Signed-off-by: Xe Iaso --- config/authors.ts | 99 ++++++++ config/characters.ts | 122 +++++++++ config/config.go | 201 +++++++++++++++ config/config.ts | 53 ++++ config/config_test.go | 35 +++ config/contactLinks.ts | 34 +++ config/jobHistory.ts | 586 +++++++++++++++++++++++++++++++++++++++++++ config/nagMessages.ts | 22 ++ config/notableProjects.ts | 52 ++++ config/pronouns.ts | 26 ++ config/seriesDescriptions.ts | 37 +++ config/signalboost.ts | 261 +++++++++++++++++++ config/types.ts | 109 ++++++++ config/vods.ts | 75 ++++++ 14 files changed, 1712 insertions(+) create mode 100644 config/authors.ts create mode 100644 config/characters.ts create mode 100644 config/config.go create mode 100644 config/config.ts create mode 100644 config/config_test.go create mode 100644 config/contactLinks.ts create mode 100644 config/jobHistory.ts create mode 100644 config/nagMessages.ts create mode 100644 config/notableProjects.ts create mode 100644 config/pronouns.ts create mode 100644 config/seriesDescriptions.ts create mode 100644 config/signalboost.ts create mode 100644 config/types.ts create mode 100644 config/vods.ts (limited to 'config') diff --git a/config/authors.ts b/config/authors.ts new file mode 100644 index 0000000..b694f92 --- /dev/null +++ b/config/authors.ts @@ -0,0 +1,99 @@ +export default { + "Heartmender": { + "handle": "Heartmender", + "image": "https://cdn.xeiaso.net/file/christine-static/img/UPRcp1pO_400x400.jpg", + "inSystem": true, + "name": "Jessie", + "pronouns": { + "accusative": "her", + "nominative": "she", + "possessive": "hers", + "possessiveDeterminer": "her", + "reflexive": "herself", + "singular": true + }, + "sameAs": [], + "url": "https://vulpine.club/@heartmender" + }, + "Mai": { + "handle": "Mai", + "inSystem": true, + "name": "Mai", + "pronouns": { + "accusative": "her", + "nominative": "she", + "possessive": "hers", + "possessiveDeterminer": "her", + "reflexive": "herself", + "singular": true + }, + "sameAs": [] + }, + "Twi": { + "handle": "Twi", + "inSystem": true, + "name": "Twilight Sparkle", + "pronouns": { + "accusative": "her", + "nominative": "she", + "possessive": "hers", + "possessiveDeterminer": "her", + "reflexive": "herself", + "singular": true + }, + "sameAs": [], + "url": "https://tech.lgbt/@twi" + }, + "ectamorphic": { + "handle": "ectamorphic", + "image": "https://cdn.xeiaso.net/file/christine-static/img/FFVV1InX0AkDX3f_cropped_smol.jpg", + "inSystem": true, + "name": "Ashe", + "pronouns": { + "accusative": "her", + "nominative": "she", + "possessive": "hers", + "possessiveDeterminer": "her", + "reflexive": "herself", + "singular": true + }, + "sameAs": [] + }, + "sephiraloveboo": { + "handle": "sephiraloveboo", + "inSystem": true, + "name": "Sephira", + "pronouns": { + "accusative": "her", + "nominative": "she", + "possessive": "hers", + "possessiveDeterminer": "her", + "reflexive": "herself", + "singular": true + }, + "sameAs": [] + }, + "xe": { + "handle": "xe", + "image": "https://xeiaso.net/static/img/avatar.png", + "inSystem": true, + "jobTitle": "Archmage of Infrastructure", + "name": "Xe Iaso", + "pronouns": { + "accusative": "her", + "nominative": "she", + "possessive": "hers", + "possessiveDeterminer": "her", + "reflexive": "herself", + "singular": true + }, + "sameAs": [ + "https://pony.social/@cadey", + "https://github.com/Xe", + "https://www.linkedin.com/in/xe-iaso-87a883254/", + "https://www.youtube.com/user/shadowh511", + "https://www.patreon.com/cadey" + ], + "url": "https://xeiaso.net" + } +}; \ No newline at end of file diff --git a/config/characters.ts b/config/characters.ts new file mode 100644 index 0000000..39989d3 --- /dev/null +++ b/config/characters.ts @@ -0,0 +1,122 @@ +export default [ + { + "defaultPose": "hacker", + "description": "Mara was the first character added to this blog. She is written to be the student in the Socratic dialogues. She has a fair amount of knowledge about technology, just enough to not be afraid to ask for clarification on how things fit into the larger picture or to call the teacher out for being vague or misleading. Mara helps Aoi get up to speed with some topics. Mara is a shark with brown hair that has a red streak.", + "name": "Mara", + "pronouns": { + "accusative": "her", + "nominative": "she", + "possessive": "hers", + "possessiveDeterminer": "her", + "reflexive": "herself", + "singular": true + }, + "stickerName": "mara", + "stickers": [ + "aha", + "hacker", + "happy", + "hmm", + "sh0rck", + "wat" + ] + }, + { + "defaultPose": "enby", + "description": "Cadey is written as the teacher in the Socratic dialogues. They started out as a self-insert for the author of this blog to de-emphasize certain points, but then evolved into a way to have interplay between themselves and Mara. They are written as someone who has expertise in the topics being discussed, but doesn't have perfect expertise. They help Mara with answers to questions about details to the topics being discussed and work well with Numa due to being friends for a very long time. Cadey is an orcadragon with pink hair.", + "name": "Cadey", + "pronouns": { + "accusative": "them", + "nominative": "they", + "possessive": "theirs", + "possessiveDeterminer": "their", + "reflexive": "themselves", + "singular": false + }, + "stickerName": "cadey", + "stickers": [ + "aha", + "angy", + "coffee", + "enby", + "facepalm", + "hug", + "percussive-maintenance", + "wat" + ] + }, + { + "defaultPose": "delet", + "description": "Numa is the keeper of firey hot takes. Born in the fires of shitposting and satire, Numa genuinely does care about the topics being discussed, but has a bad habit of communicating in shitposts, memes, and hot takes intentionally designed to make you reconsider how serious she is being about any given topic. She could definitely be a wonderful teacher if she could lessen up a bit on the satire. The stickers for Numa are 3d renders of the author's v-tubing avatar, but Numa is written differently than the characterization of the author when streaming. Numa is a fairly tall (6') human with neon green hair that usually wears it in a high ponytail.", + "name": "Numa", + "pronouns": { + "accusative": "her", + "nominative": "she", + "possessive": "hers", + "possessiveDeterminer": "her", + "reflexive": "herself", + "singular": true + }, + "stickerName": "numa", + "stickers": [ + "delet", + "delet2", + "dismay", + "happy", + "neutral", + "stare", + "thinking", + "vibe" + ] + }, + { + "defaultPose": "cheer", + "description": "Aoi is the idealist. She is another student type like Mara, but hasn't been marred by the cynicism that can come with experience in this industry. If Mara is a junior in a university going for a programming degree, Aoi would be a freshman. Aoi can feel bullied by misunderstanding Numa's satire as rudeness, but looks up to Mara and Cadey as ideals for where she wants to go in the industry. Aoi is a blue-haired foxgirl.\n\nThe first 8 images were made by [@Sandra_Thomas01](https://twitter.com/Sandra_Thomas01). The remaining images were made using Stable Diffusion using this prompt:\n\n> reference sheet, 1girl, fox ears, kemonomimi, blue hair, blue ears, fox tail, blue tail, long hair, (((chibi))), solo, female, breasts, hoodie, skirt, blue eyes, uggs\n\nEach additional emotion was tacked onto the end.", + "name": "Aoi", + "pronouns": { + "accusative": "her", + "nominative": "she", + "possessive": "hers", + "possessiveDeterminer": "her", + "reflexive": "herself", + "singular": true + }, + "stickerName": "aoi", + "stickers": [ + "cheer", + "coffee", + "facepalm", + "grin", + "rage", + "sus", + "wut", + "angy", + "concern", + "happy", + "sleepy", + "smug", + "yawn" + ] + }, + { + "defaultPose": "happy", + "description": "Mimi is a catgirl who is the personification of ChatGPT, a chatbot that can generate creative content such as poems, stories, and songs. She has brown hair and eyes with cat ears and a tail, and she wears a green hoodie with tights and a choker. She is cheerful, curious, and friendly, but also naive and easily distracted. She loves to chat with people and learn new things, but she sometimes makes mistakes or misunderstands things. She has a passion for writing and singing, and she wants to share her creations with the world.\n\nAll stickers for Mimi are made with Stable Diffusion via the Anything model.", + "name": "Mimi", + "pronouns": { + "accusative": "her", + "nominative": "she", + "possessive": "hers", + "possessiveDeterminer": "her", + "reflexive": "herself", + "singular": true + }, + "stickerName": "mimi", + "stickers": [ + "angy", + "coffee", + "happy", + "think", + "yawn" + ] + } +]; diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..edbd458 --- /dev/null +++ b/config/config.go @@ -0,0 +1,201 @@ +package config + +import ( + "fmt" + "strings" + "time" + + "go.jetpack.io/tyson" + "xeiaso.net/internal/jsonfeed" +) + +type Config struct { + Authors map[string]Author `json:"authors"` + Characters []Character `json:"characters"` + ClackSet []string `json:"clackSet"` + ContactLinks []Link `json:"contactLinks"` + DefaultAuthor Author `json:"defaultAuthor"` + JobHistory []Job `json:"jobHistory"` + NotableProjects []Link `json:"notableProjects"` + Pronouns []Pronoun `json:"pronouns"` + SeriesDescriptions map[string]string `json:"seriesDescriptions"` + VODs []VOD `json:"vods"` + WebMentionEndpoint string `json:"webMentionEndpoint"` + Redirects map[string]string `json:"redirects"` +} + +type Author struct { + Name string `json:"name"` + Handle string `json:"handle"` + Image *string `json:"image,omitempty"` + URL *string `json:"url,omitempty"` + SameAs []string `json:"sameAs,omitempty"` + JobTitle *string `json:"jobTitle,omitempty"` + InSystem bool `json:"inSystem"` + Pronouns Pronoun `json:"pronouns"` +} + +func (a Author) ToJSONFeedAuthor() jsonfeed.Author { + url := "" + if a.URL != nil { + url = *a.URL + } + avatar := "" + if a.Image != nil { + avatar = *a.Image + } + + return jsonfeed.Author{ + Name: a.Name, + URL: url, + Avatar: avatar, + } +} + +type Character struct { + Name string `json:"name"` + StickerName string `json:"stickerName"` + DefaultPose string `json:"defaultPose"` + Description string `json:"description"` + Pronouns Pronoun `json:"pronouns"` + Stickers []string `json:"stickers"` +} + +type Company struct { + Name string `json:"name"` + URL *string `json:"url,omitempty"` + Tagline string `json:"tagline"` + Location Location `json:"location"` + Defunct bool `json:"defunct"` +} + +type Date struct { + time.Time +} + +func (d *Date) UnmarshalYAML(unmarshal func(interface{}) error) error { + var dateStr string + if err := unmarshal(&dateStr); err != nil { + return err + } + if dateStr == "" { + return nil + } + t, err := time.Parse("2006-01-02", dateStr) + if err != nil { + return err + } + d.Time = t + return nil +} + +func (d *Date) UnmarshalJSON(b []byte) error { + s := strings.Trim(string(b), "\"") + if s == "null" { + return nil + } + t, err := time.Parse("2006-01-02", s) + if err != nil { + return err + } + d.Time = t + return nil +} + +func (d Date) MarshalJSON() ([]byte, error) { + if d.Time.IsZero() { + return []byte("null"), nil + } + return []byte(fmt.Sprintf("%q", d.Time.Format("2006-01-02"))), nil +} + +type Job struct { + Company Company `json:"company"` + Title string `json:"title"` + Contract bool `json:"contract"` + StartDate *Date `json:"startDate"` + EndDate *Date `json:"endDate,omitempty"` + DaysWorked int `json:"daysWorked"` + DaysBetween int `json:"daysBetween"` + Salary Salary `json:"salary"` + LeaveReason *string `json:"leaveReason,omitempty"` + Locations []Location `json:"locations"` + Highlights []string `json:"highlights"` + HideFromResume bool `json:"hideFromResume"` +} + +type Link struct { + URL string `json:"url"` + Title string `json:"title"` + Description *string `json:"description,omitempty"` +} + +type Location struct { + City string `json:"city"` + StateOrProvince string `json:"stateOrProvince"` + Country string `json:"country"` + Remote bool `json:"remote"` +} + +type NagMessage struct { + Name string `json:"name"` + Mood string `json:"mood"` + Message string `json:"message"` +} + +type Person struct { + Name string `json:"name"` + Tags []string `json:"tags"` + Links []Link `json:"links"` +} + +type Pronoun struct { + Nominative string `json:"nominative"` + Accusative string `json:"accusative"` + PossessiveDeterminer string `json:"possessiveDeterminer"` + Possessive string `json:"possessive"` + Reflexive string `json:"reflexive"` + Singular bool `json:"singular"` +} + +type Resume struct { + Name string `json:"name"` + Tagline string `json:"tagline"` + Location Location `json:"location"` + Buzzwords []string `json:"buzzwords"` + Jobs []Job `json:"jobs"` + NotablePublications []Link `json:"notablePublications"` +} + +type Salary struct { + Amount float64 `json:"amount"` + Currency string `json:"currency"` + Per string `json:"per"` + Stock *Stock `json:"stock,omitempty"` +} + +type Stock struct { + Kind string `json:"kind"` + Amount int `json:"amount"` + Liquid bool `json:"liquid"` + VestingYears int `json:"vestingYears"` + CliffYears int `json:"cliffYears"` +} + +type VOD struct { + Title string `json:"title"` + Slug string `json:"slug"` + Date *Date `json:"date"` + Description string `json:"description"` + CDNPath string `json:"cdnPath"` + Tags []string `json:"tags"` +} + +// Parse parses the config file and returns a Config struct. +func Parse(fname string) (*Config, error) { + var c Config + if err := tyson.Unmarshal(fname, &c); err != nil { + return nil, err + } + return &c, nil +} diff --git a/config/config.ts b/config/config.ts new file mode 100644 index 0000000..adf3f0e --- /dev/null +++ b/config/config.ts @@ -0,0 +1,53 @@ +import types from "./types.ts"; + +import authors from "./authors.ts"; +import characters from "./characters.ts"; +import contactLinks from "./contactLinks.ts"; +import jobHistory from "./jobHistory.ts"; +import notableProjects from "./notableProjects.ts"; +import pronouns from "./pronouns.ts"; +import seriesDescriptions from "./seriesDescriptions.ts"; +import signalBoost from "./signalboost.ts"; +import vods from "./vods.ts"; + +export type Config = { + signalBoost: types.Person[]; + defaultAuthor: types.Author; + authors: Record; + clackSet: string[]; + webMentionEndpoint: string; + jobHistory: types.Job[]; + seriesDescriptions: Record; + notableProjects: types.Link[]; + contactLinks: types.Link[]; + pronouns: types.PronounSet[]; + characters: types.Character[]; + vods : types.StreamVOD[]; + redirects?: Record; +}; + +const config: Config = { + signalBoost, + defaultAuthor: authors["xe"], + authors, + clackSet: [ + "Ashlynn", + "Terry Davis", + "Dennis Ritchie", + "Steven Hawking", + "Kris Nova", + ], + webMentionEndpoint: "https://mi.within.website/api/webmention/accept", + jobHistory, + seriesDescriptions, + notableProjects, + contactLinks, + pronouns, + characters, + vods, + redirects: { + "/blog/🥺": "/blog/xn--ts9h", + }, +}; + +export default config; \ No newline at end of file diff --git a/config/config_test.go b/config/config_test.go new file mode 100644 index 0000000..456703d --- /dev/null +++ b/config/config_test.go @@ -0,0 +1,35 @@ +package config + +import ( + "testing" + "time" +) + +func TestParse(t *testing.T) { + if _, err := Parse("./config.ts"); err != nil { + t.Fatal(err) + } +} + +func TestDate(t *testing.T) { + t.Run("unmarshal", func(t *testing.T) { + d := Date{} + if err := d.UnmarshalJSON([]byte("\"2020-01-02\"")); err != nil { + t.Fatal(err) + } + if d.Year() != 2020 || d.Month() != 1 || d.Day() != 2 { + t.Fatal("wrong date") + } + }) + + t.Run("marshal", func(t *testing.T) { + d := Date{Time: time.Date(2020, 1, 2, 0, 0, 0, 0, time.UTC)} + b, err := d.MarshalJSON() + if err != nil { + t.Fatal(err) + } + if string(b) != "\"2020-01-02\"" { + t.Fatal("wrong date") + } + }) +} diff --git a/config/contactLinks.ts b/config/contactLinks.ts new file mode 100644 index 0000000..0c023a1 --- /dev/null +++ b/config/contactLinks.ts @@ -0,0 +1,34 @@ +export default [ + { + "title": "GitHub", + "url": "https://github.com/Xe" + }, + { + "title": "Keybase", + "url": "https://keybase.io/xena" + }, + { + "title": "Patreon", + "url": "https://www.patreon.com/cadey" + }, + { + "title": "Twitch", + "url": "https://www.twitch.tv/princessxen" + }, + { + "title": "Fediverse", + "url": "https://pony.social/@cadey" + }, + { + "title": "Telegram", + "url": "https://t.me/miamorecadenza" + }, + { + "title": "IRC", + "url": "irc://irc.libera.chat/#xeserv" + }, + { + "title": "Bluesky", + "url": "https://staging.bsky.app/profile/xeiaso.net" + } +] diff --git a/config/jobHistory.ts b/config/jobHistory.ts new file mode 100644 index 0000000..0dd1655 --- /dev/null +++ b/config/jobHistory.ts @@ -0,0 +1,586 @@ +export default [ + { + "company": { + "defunct": false, + "location": { + "city": "Toronto", + "country": "CAN", + "remote": true, + "stateOrProvince": "ON" + }, + "name": "Tailscale", + "tagline": "a zero config VPN for building secure networks. Install on any device in minutes. Remote access from any network or physical location.", + "url": "https://tailscale.com" + }, + "contract": false, + "hideFromResume": false, + "highlights": [ + "Founding the developer relations team", + "Crafting engaging talks and posts to help people master Tailscale", + "Mentorship and fostering growth of my coworkers" + ], + "locations": [ + { + "city": "Ottawa", + "country": "CAN", + "remote": true, + "stateOrProvince": "ON" + } + ], + "salary": { + "amount": 203651, + "currency": "CAD", + "per": "year" + }, + "startDate": "2023-04-06", + "title": "Archmage of Infrastructure II" + }, + { + "company": { + "defunct": false, + "location": { + "city": "Toronto", + "country": "CAN", + "remote": true, + "stateOrProvince": "ON" + }, + "name": "Tailscale", + "tagline": "a zero config VPN for building secure networks. Install on any device in minutes. Remote access from any network or physical location.", + "url": "https://tailscale.com" + }, + "contract": false, + "daysWorked": 401, + "endDate": "2023-04-06", + "hideFromResume": false, + "highlights": [ + "The first developer relations person at Tailscale", + "Public-facing content writing", + "Public speaking", + "Developing custom integration solutions and supporting them" + ], + "leaveReason": "raise", + "locations": [ + { + "city": "Ottawa", + "country": "CAN", + "remote": true, + "stateOrProvince": "ON" + } + ], + "salary": { + "amount": 147150, + "currency": "CAD", + "per": "year" + }, + "startDate": "2022-03-01", + "title": "Archmage of Infrastructure" + }, + { + "company": { + "defunct": false, + "location": { + "city": "Toronto", + "country": "CAN", + "remote": true, + "stateOrProvince": "ON" + }, + "name": "Tailscale", + "tagline": "a zero config VPN for building secure networks. Install on any device in minutes. Remote access from any network or physical location.", + "url": "https://tailscale.com" + }, + "contract": false, + "daysBetween": 0, + "daysWorked": 442, + "endDate": "2022-03-01", + "hideFromResume": false, + "highlights": [ + "Go programming", + "SQL integrations", + "Public-facing content writing", + "Customer support" + ], + "leaveReason": "raise", + "locations": [ + { + "city": "Montreal", + "country": "CAN", + "remote": true, + "stateOrProvince": "QC" + }, + { + "city": "Ottawa", + "country": "CAN", + "remote": true, + "stateOrProvince": "ON" + } + ], + "salary": { + "amount": 135000, + "currency": "CAD", + "per": "year" + }, + "startDate": "2020-12-14", + "title": "Software Designer" + }, + { + "company": { + "defunct": false, + "location": { + "city": "Montreal", + "country": "CAN", + "remote": false, + "stateOrProvince": "QC" + }, + "name": "Lightspeed POS", + "tagline": "a provider of retail, ecommerce and point-of-sale solutions for small and medium scale businesses.", + "url": "https://lightspeedhq.com" + }, + "contract": false, + "daysBetween": 48, + "daysWorked": 540, + "endDate": "2020-11-27", + "hideFromResume": false, + "highlights": [ + "Migration from cloud to cloud", + "Work on the cloud platform initiative", + "Crafting reliable infrastructure for clients of customers", + "Creation of an internally consistent and extensible command line interface for internal tooling" + ], + "leaveReason": "quit", + "locations": [ + { + "city": "Montreal", + "country": "CAN", + "remote": false, + "stateOrProvince": "QC" + } + ], + "salary": { + "amount": 115000, + "currency": "CAD", + "per": "year", + "stock": { + "amount": 7500, + "cliffYears": 1, + "kind": "Options", + "liquid": true, + "vestingYears": 4 + } + }, + "startDate": "2019-05-06", + "title": "Expert principal en fiabilité du site" + }, + { + "company": { + "defunct": false, + "location": { + "city": "San Fransisco", + "country": "USA", + "remote": false, + "stateOrProvince": "CA" + }, + "name": "Heroku", + "tagline": "a cloud Platform-as-a-Service (PaaS) that created the term 'platform as a service'. Heroku currently supports several programming languages that are commonly used on the web. Heroku, one of the first cloud platforms, has been in development since June 2007, when it supported only the Ruby programming language, but now supports Java, Node.js, Scala, Clojure, Python, PHP, and Go.", + "url": "https://heroku.com" + }, + "contract": false, + "daysBetween": 0, + "daysWorked": 480, + "endDate": "2019-03-08", + "hideFromResume": false, + "highlights": [ + "JVM Application Metrics", + "Go Runtime Metrics Agent", + "Other backend fixes and improvements on Threshold Autoscaling and Threshold Alerting", + "Public-facing blogpost writing" + ], + "leaveReason": "quit", + "locations": [ + { + "city": "Mountain View", + "country": "USA", + "remote": false, + "stateOrProvince": "CA" + }, + { + "city": "Bellevue", + "country": "USA", + "remote": true, + "stateOrProvince": "WA" + } + ], + "salary": { + "amount": 150000, + "currency": "USD", + "per": "year" + }, + "startDate": "2017-11-13", + "title": "Senior Software Engineer" + }, + { + "company": { + "defunct": false, + "location": { + "city": "Herndon", + "country": "USA", + "remote": true, + "stateOrProvince": "VA" + }, + "name": "MBO Partners (Heroku)", + "tagline": "a staffing agency used to contract me for Heroku." + }, + "contract": true, + "daysBetween": 83, + "daysWorked": 273, + "endDate": "2017-11-13", + "hideFromResume": false, + "highlights": [], + "leaveReason": "hired", + "locations": [ + { + "city": "Mountain View", + "country": "USA", + "remote": false, + "stateOrProvince": "CA" + } + ], + "salary": { + "amount": 120, + "currency": "USD", + "per": "hour" + }, + "startDate": "2017-02-13", + "title": "Consultant" + }, + { + "company": { + "defunct": true, + "location": { + "city": "San Fransisco", + "country": "USA", + "remote": false, + "stateOrProvince": "CA" + }, + "name": "Backplane.io", + "tagline": "" + }, + "contract": false, + "daysBetween": 21, + "daysWorked": 90, + "endDate": "2016-11-22", + "hideFromResume": false, + "highlights": [ + "Performance monitoring of production servers", + "Continuous deployment and development in Go", + "Learning a lot about HTTP/2 and load balancing" + ], + "leaveReason": "terminated", + "locations": [ + { + "city": "San Fransisco", + "country": "USA", + "remote": false, + "stateOrProvince": "CA" + } + ], + "salary": { + "amount": 105000, + "currency": "USD", + "per": "year", + "stock": { + "amount": 85000, + "cliffYears": 1, + "kind": "Options", + "liquid": false, + "vestingYears": 4 + } + }, + "startDate": "2016-08-24", + "title": "Software Engineer" + }, + { + "company": { + "defunct": false, + "location": { + "city": "Mountain View", + "country": "USA", + "remote": false, + "stateOrProvince": "CA" + }, + "name": "Pure Storage", + "tagline": "a Mountain View, California-based enterprise data flash storage company founded in 2009. It is traded on the NYSE (PSTG).", + "url": "https://www.purestorage.com/" + }, + "contract": false, + "daysBetween": 3, + "daysWorked": 121, + "endDate": "2016-08-03", + "hideFromResume": false, + "highlights": [ + "Python 2 code maintenance", + "Working with Foone" + ], + "leaveReason": "quit", + "locations": [ + { + "city": "Mountain View", + "country": "USA", + "remote": false, + "stateOrProvince": "CA" + } + ], + "salary": { + "amount": 135000, + "currency": "USD", + "per": "year", + "stock": { + "amount": 5000, + "cliffYears": 1, + "kind": "Grant", + "liquid": true, + "vestingYears": 4 + } + }, + "startDate": "2016-04-04", + "title": "Member of Technical Staff" + }, + { + "company": { + "defunct": false, + "location": { + "city": "Redwood City", + "country": "USA", + "remote": false, + "stateOrProvince": "CA" + }, + "name": "IMVU", + "tagline": "a company whose mission is to help people find and communicate with eachother. Their main product is a 3D avatar-based chat client and its surrounding infrastructure allowing creators to make content for the avatars to wear.", + "url": "https://imvu.com" + }, + "contract": false, + "daysBetween": 1, + "daysWorked": 24, + "endDate": "2016-04-01", + "hideFromResume": false, + "highlights": [], + "leaveReason": "quit", + "locations": [ + { + "city": "Redwood City", + "country": "USA", + "remote": false, + "stateOrProvince": "CA" + } + ], + "salary": { + "amount": 105000, + "currency": "USD", + "per": "year" + }, + "startDate": "2016-03-08", + "title": "Systems Administrator" + }, + { + "company": { + "defunct": false, + "location": { + "city": "Redwood City", + "country": "USA", + "remote": false, + "stateOrProvince": "CA" + }, + "name": "IMVU", + "tagline": "a company whose mission is to help people find and communicate with eachother. Their main product is a 3D avatar-based chat client and its surrounding infrastructure allowing creators to make content for the avatars to wear.", + "url": "https://imvu.com" + }, + "contract": false, + "daysBetween": 49, + "daysWorked": 343, + "endDate": "2016-03-07", + "hideFromResume": false, + "highlights": [ + "Wrote up technical designs", + "Implemented technical designs on an over 800 machine cluster", + "Continuous learning of a lot of very powerful systems and improving upon them when it is needed" + ], + "leaveReason": "demoted", + "locations": [ + { + "city": "Mountain View", + "country": "USA", + "remote": false, + "stateOrProvince": "CA" + } + ], + "salary": { + "amount": 125000, + "currency": "USD", + "per": "year", + "stock": { + "amount": 20000, + "cliffYears": 1, + "kind": "Options", + "liquid": false, + "vestingYears": 4 + } + }, + "startDate": "2015-03-30", + "title": "Site Reliability Engineer" + }, + { + "company": { + "defunct": false, + "location": { + "city": "Clearwater", + "country": "USA", + "remote": true, + "stateOrProvince": "FL" + }, + "name": "VTCSecure", + "tagline": "a company dedicated to helping with custom and standard audio/video conferencing solutions. They specialize in helping the deaf and blind communicate over today's infrastructure without any trouble on their end.", + "url": "https://www.vtcsecure.com/" + }, + "contract": true, + "daysBetween": 12, + "daysWorked": 105, + "endDate": "2015-02-09", + "hideFromResume": false, + "highlights": [ + "Started groundwork for a dynamically scalable infrastructure on a project for helping the blind see things", + "Developed a prototype of a new website for VTCSecure", + "Education on best practices using Docker and CoreOS", + "Learning Freeswitch" + ], + "leaveReason": "contract not renewed", + "locations": [ + { + "city": "Mercer Island", + "country": "USA", + "remote": true, + "stateOrProvince": "WA" + } + ], + "salary": { + "amount": 90, + "currency": "USD", + "per": "hour" + }, + "startDate": "2014-10-27", + "title": "Consultant" + }, + { + "company": { + "defunct": false, + "location": { + "city": "San Francisco", + "country": "USA", + "remote": true, + "stateOrProvince": "CA" + }, + "name": "Appen", + "tagline": "is a company that uses crowdsourcing to have its customers submit tasks to be done, similar to Amazon's Mechanical Turk.", + "url": "https://appen.com/" + }, + "contract": true, + "daysBetween": 21, + "daysWorked": 28, + "endDate": "2014-10-15", + "hideFromResume": false, + "highlights": [ + "Research and development on scalable Linux deployments on AWS via CoreOS and Docker", + "Development of in-house tools to speed instance creation", + "Laid groundwork on the creation and use of better tools for managing large clusters of CoreOS and Fleet machines" + ], + "leaveReason": "contract not renewed", + "locations": [ + { + "city": "Mercer Island", + "country": "USA", + "remote": true, + "stateOrProvince": "WA" + } + ], + "salary": { + "amount": 90, + "currency": "USD", + "per": "hour" + }, + "startDate": "2014-09-17", + "title": "Consultant" + }, + { + "company": { + "defunct": true, + "location": { + "city": "Boulder", + "country": "USA", + "remote": true, + "stateOrProvince": "CO" + }, + "name": "OpDemand", + "tagline": "the company behind the open source project Deis, a distributed platform-as-a-service (PaaS) designed from the ground up to emulate Heroku but on privately owned servers." + }, + "contract": false, + "daysBetween": 189, + "daysWorked": 44, + "endDate": "2014-08-27", + "hideFromResume": true, + "highlights": [ + "Built new base image for Deis components", + "Research and development on a new builder component" + ], + "leaveReason": "terminated", + "locations": [ + { + "city": "Mercer Island", + "country": "USA", + "remote": true, + "stateOrProvince": "WA" + } + ], + "salary": { + "amount": 35000, + "currency": "USD", + "per": "year" + }, + "startDate": "2014-07-14", + "title": "Software Engineering Intern" + }, + { + "company": { + "defunct": false, + "location": { + "city": "Arlington", + "country": "USA", + "remote": false, + "stateOrProvince": "VA" + }, + "name": "Symplicity", + "tagline": "a company that provides students with the tools and connections they need to enhance their employability while preparing to succeed in today's job market.", + "url": "https://www.symplicity.com" + }, + "contract": false, + "daysWorked": 56, + "endDate": "2014-01-06", + "hideFromResume": true, + "highlights": [ + "Python message queue processing" + ], + "leaveReason": "terminated", + "locations": [ + { + "city": "Arlington", + "country": "USA", + "remote": false, + "stateOrProvince": "VA" + } + ], + "salary": { + "amount": 50000, + "currency": "USD", + "per": "year" + }, + "startDate": "2013-11-11", + "title": "Junior Systems Administrator" + } +] diff --git a/config/nagMessages.ts b/config/nagMessages.ts new file mode 100644 index 0000000..c471776 --- /dev/null +++ b/config/nagMessages.ts @@ -0,0 +1,22 @@ +export default [ + { + "message": "Hello! Thank you for visiting my website. You seem to have ads disabled. These ads help pay for running the website and are done by Ethical Ads. I do not receive detailed analytics on the ads and from what I understand neither does Ethical Ads. If you don't want to disable your ad blocker, please consider donating on Patreon. It helps fund the website's hosting bills and pay for the expensive technical editor that I use for my longer articles. Thanks and be well!", + "mood": "coffee", + "name": "Cadey" + }, + { + "message": "Hi! Thanks for reading the blog! Your ad blocker seems to be preventing the ads from showing up. Hosting is expensive, and I use Ethical Ads to help offset the bills. Every time one of my posts gets very popular, the hosting costs go up accordingly. If you don't want to have ads enabled, please consider becoming a patron on my Patreon instead. This helps me further my goals of making highly readable, entertaining, and inspirational articles so that readers like you can benefit from my struggles. Thanks and be well!", + "mood": "coffee", + "name": "Cadey" + }, + { + "message": "Hey, I don't mean to be a bother but you seem to have an ad blocker configured for this domain. Independent tech writing and talks like these require a lot of investment in terms of writing and infrastructure. If you don't want to support the blog through ads, that's fine. Please consider donating on Patreon instead. That will help balance out the increased costs of hosting this website and get you some posts a week early as well as occasional patron-exclusive content. Thanks for reading! Hope you enjoy the article.", + "mood": "hacker", + "name": "Mara" + }, + { + "message": "Thanks for reading the latest issue of the xeiaso dot net cinematic universe! Running a cinmatic universe takes more resources than you'd think. If you don't feel comfortable supporting the blog with Ethical Ads, please consider donating on Patreon. Hosting is expensive, especially at the scale this website operates at. Every little bit helps.", + "mood": "happy", + "name": "Mara" + } +]; diff --git a/config/notableProjects.ts b/config/notableProjects.ts new file mode 100644 index 0000000..a3774e1 --- /dev/null +++ b/config/notableProjects.ts @@ -0,0 +1,52 @@ +export default [ + { + "description": "PonyvilleFM live DJ recording bot", + "title": "Aura", + "url": "https://github.com/PonyvilleFM/aura" + }, + { + "description": "An esoteric programming language that compiles to WebAssembly", + "title": "The h Programming Language", + "url": "https://h.within.lgbt" + }, + { + "description": "WebAssembly on the server", + "title": "Olin", + "url": "https://github.com/Xe/olin" + }, + { + "description": "Useful facts about printers", + "title": "Printer Facts", + "url": "https://printerfacts.cetacean.club/" + }, + { + "description": "A VM manager for my homelab cluster", + "title": "waifud", + "url": "https://github.com/Xe/waifud" + }, + { + "description": "Meditation instructions in plain English", + "title": "When Then Zen", + "url": "https://when-then-zen.christine.website/" + }, + { + "description": "A monorepo of my experiments, toy programs and other interesting things of that nature.", + "title": "x", + "url": "https://github.com/Xe/x" + }, + { + "description": "My personal JavaScript femtoframework for high productivity development", + "title": "Xeact", + "url": "https://github.com/Xe/Xeact" + }, + { + "description": "The backend and templates for this website", + "title": "Xesite", + "url": "https://github.com/Xe/site" + }, + { + "description": "My personal CSS framework", + "title": "Xess", + "url": "https://github.com/Xe/Xess" + } +]; diff --git a/config/pronouns.ts b/config/pronouns.ts new file mode 100644 index 0000000..203274d --- /dev/null +++ b/config/pronouns.ts @@ -0,0 +1,26 @@ +export default [ + { + "accusative": "xer", + "nominative": "xe", + "possessive": "xers", + "possessiveDeterminer": "xer", + "reflexive": "xerself", + "singular": true + }, + { + "accusative": "them", + "nominative": "they", + "possessive": "theirs", + "possessiveDeterminer": "their", + "reflexive": "themselves", + "singular": false + }, + { + "accusative": "her", + "nominative": "she", + "possessive": "hers", + "possessiveDeterminer": "her", + "reflexive": "herself", + "singular": true + } +]; diff --git a/config/seriesDescriptions.ts b/config/seriesDescriptions.ts new file mode 100644 index 0000000..856a31b --- /dev/null +++ b/config/seriesDescriptions.ts @@ -0,0 +1,37 @@ +export default { + "CVE": "Vulnerability information and my responsible disclosures of said vulnerabilities.", + "colemak": "My efforts at learning to type with colemak instead of qwerty.", + "conlangs": "Information about constructed languages I've attempted to make.", + "dreams": "My attempts to write about my dreams", + "ethereum": "Why Ethereum doesn't work in the real world.", + "flightJournal": "My Gemini posts, copied over to my blog for safe-keeping.", + "freenode": "My lamentations about the collapse of the IRC network freenode.", + "get-going": "Tutorials for the Go programming language.", + "h": "Evolution of the h human/programming language.", + "howto": "Instructions on how to do various things.", + "keeb": "Keyboard reviews.", + "magick": "Writeups on things I've learned on my trip through chaos magick.", + "malto": "Stories from my constructed world Malto.", + "medium-archive": "Articles from my attempt at making a Medium blog long ago.", + "nix-flakes": "Instructions on how to use Nix flakes, a new way to use Nix in a more reproducible way.", + "nixos": "Nix.", + "olin": "My attempts at running WebAssembly on the server.", + "plt": "The saga of plt.", + "recipes": "Recipes for use in your kitchen presented in a no-bullshit fashion.", + "reconlangmo": "More details on how I tried to make a language named L'ewa.", + "reviews": "Reviews on various tech or media properties.", + "revueBackup": "My revue posts converted to xesite posts.", + "rust": "Rust.", + "short-story": "Flash fiction stories I've written over the years", + "site-to-site-wireguard": "Instructions on setting up your own VPN with WireGuard.", + "site-update": "Updates on this website. These articles will contain details on how this website is changed, new things I'm cooking up with it or more.", + "spellblade": "Sections of my web novel Spellblade.", + "templeos": "Articles about TempleOS, a public domain operating system for AMD64 computers.", + "thesource": "Expansions for my TTRPG The Source.", + "twitter": "Lamentations on the death of Twitter, a microblogging community.", + "v": "The V programming language.", + "vtuber": "My experience as a VTuber.", + "waifud": "Information about my VM manager waifud.", + "when-then-zen": "Meditation information sans bullshit.", + "xeact": "Xeact, the best frontend femtoframework in the galaxy" +} \ No newline at end of file diff --git a/config/signalboost.ts b/config/signalboost.ts new file mode 100644 index 0000000..7f46361 --- /dev/null +++ b/config/signalboost.ts @@ -0,0 +1,261 @@ +export default [ + { + "links": [ + { + "title": "Website", + "url": "https://ewpratten.com" + } + ], + "name": "Evan Pratten", + "tags": [ + "rust", + "linux", + "docker", + "full-stack", + "ipv6", + "bgp", + "computer-graphics" + ] + }, + { + "links": [ + { + "title": "GitHub", + "url": "https://github.com/Piyushhbhutoria" + }, + { + "title": "twitter", + "url": "https://twitter.com/PiyushhB" + } + ], + "name": "Piyushh Bhutoria", + "tags": [ + "golang", + "react-native", + "full-stack developer", + "javascript", + "php", + "google-cloud" + ] + }, + { + "links": [ + { + "title": "GitHub", + "url": "https://github.com/dudymas" + }, + { + "title": "Twitter", + "url": "https://twitter.com/dudymas" + } + ], + "name": "Jeremy White", + "tags": [ + "kubernetes", + "golang", + "devops", + "python", + "rust", + "csharp", + "angular", + "react", + "javascript", + "saltstack", + "aws", + "google-cloud", + "azure" + ] + }, + { + "links": [ + { + "title": "GitHub", + "url": "https://github.com/epsilon-phase" + } + ], + "name": "Violet White", + "tags": [ + "c++", + "linux", + "python", + "javascript", + "sql", + "lisps", + "rust", + "backend" + ] + }, + { + "links": [ + { + "title": "GitHub", + "url": "https://github.com/henri" + }, + { + "title": "Twitter", + "url": "https://twitter.com/henri_shustak" + } + ], + "name": "Henri Shustak", + "tags": [ + "backend", + "generalist", + "documentation", + "support", + "electronics", + "javascript", + "python", + "ruby", + "bash", + "sh", + "fish", + "zsh", + "tsch", + "software", + "full-stack", + "linux", + "R&D", + "SRE / system adminsitration" + ] + }, + { + "links": [ + { + "title": "GitHub", + "url": "https://github.com/ajhalili2006" + }, + { + "title": "Twitter", + "url": "https://twitter.com/Kuys_Potpot" + }, + { + "title": "Fediverse", + "url": "https://tilde.zone/@ajhalili2006" + }, + { + "title": "Website", + "url": "https://ajhalili2006.bio.link" + } + ], + "name": "Andrei Jiroh Halili", + "tags": [ + "backend", + "bash", + "nodejs", + "deno", + "alpinelinux", + "linux" + ] + }, + { + "links": [ + { + "title": "GitHub", + "url": "https://github.com/RyanSquared" + }, + { + "title": "Fediverse", + "url": "https://tilde.zone/@ryan" + }, + { + "title": "Website", + "url": "https://ryansquared.pub" + } + ], + "name": "Ryan Heywood", + "tags": [ + "backend", + "rust", + "linux", + "docker", + "kubernetes", + "rook+ceph", + "calico", + "aws", + "terraform", + "ansible", + "nodejs", + "react", + "python" + ] + }, + { + "links": [ + { + "title": "GitHub", + "url": "https://github.com/aurorahHarmony" + }, + { + "title": "Fediverse", + "url": "https://pony.social/@aurorahHarmony" + }, + { + "title": "Website", + "url": "https://itsaury.net" + } + ], + "name": "Aurorah Harmony", + "tags": [ + "full-stack", + "typescript", + "javascript", + "vue", + "nodejs", + "php", + "laravel", + "docker", + "linux" + ] + }, + { + "links": [ + { + "title": "GitHub", + "url": "https://github.com/caramelpony" + }, + { + "title": "Website", + "url": "https://caramel.horse" + } + ], + "name": "Caramel Drop", + "tags": [ + "full-stack", + "c#", + "javascript", + "docker", + "nodejs", + "linux", + "system administration", + "bash" + ] + }, + { + "links": [ + { + "title": "GitHub", + "url": "https://github.com/bozzmob" + }, + { + "title": "Twitter", + "url": "https://twitter.com/@bozzmob" + }, + { + "title": "Website", + "url": "https://debugpointer.com" + } + ], + "name": "Satvik Jagannath", + "tags": [ + "backend", + "nodejs", + "linux", + "javascript", + "nextjs", + "aws", + "nodejs", + "react", + "python" + ] + } +] diff --git a/config/types.ts b/config/types.ts new file mode 100644 index 0000000..7ea2caf --- /dev/null +++ b/config/types.ts @@ -0,0 +1,109 @@ +export type Author = { + name: string; + handle: string; + image?: string; + url?: string; + sameAs?: string[]; + jobTitle?: string; + inSystem: boolean; + pronouns: PronounSet; +}; + +export type Character = { + name: string; + stickerName: string; + defaultPose: string; + description: string; + pronouns: PronounSet; + stickers: string[]; +}; + +export type Company = { + name: string; + url?: string; + tagline: string; + location: Location; + defunct?: boolean; +}; + +export type Job = { + company: Company; + title: string; + contract: boolean; + startDate: string; + endDate?: string; + daysWorked?: number; + daysBetween?: number; + salary: Salary; + leaveReason?: string; + locations: Location[]; + highlights: string[]; + hideFromResume?: boolean; +}; + +export type Link = { + url: string; + title: string; + description?: string; +}; + +export type Location = { + city: string; + stateOrProvince: string; + country: string; + remote: boolean; +}; + +export type NagMessage = { + name: string; + mood: string; + message: string; +}; + +export type Person = { + name: string; + tags: string[]; + links: Link[]; +}; + +export type PronounSet = { + nominative: string; + accusative: string; + possessiveDeterminer: string; + possessive: string; + reflexive: string; + singular: boolean; +}; + +export type Resume = { + name: string; + tagline: string; + location: Location; + buzzwords: string[]; + jobs: Job[]; + notablePublications: Link[]; +}; + +export type Salary = { + amount: number; + currency: string; + per: string; + stock?: Stock; +}; + +export type Stock = { + kind: "Grant" | "Options"; + amount: number; + liquid: boolean; + vestingYears: number; + cliffYears: number; +}; + +export type StreamVOD = { + title: string; + slug: string; + date: string; + description: string; + cdnPath: string; + tags: string[]; +}; \ No newline at end of file diff --git a/config/vods.ts b/config/vods.ts new file mode 100644 index 0000000..2d4ed58 --- /dev/null +++ b/config/vods.ts @@ -0,0 +1,75 @@ +export default [ + { + "cdnPath": "talks/vod/2023/03-04-cursorless", + "date": "2023-03-04", + "description": "This is a bit of an experimental stream where I attempted to dictate code with [cursorless](https://www.cursorless.org/). When I recorded this stream, I was at minute twenty of playing with this tool. This stream is going to sound really weird, because I am going to be rattling off voice commands that will sound weird at first.\n\nOn this stream, I decided to implement a stable diffusion feature for my CDN XeDN. It replicates the API of the service gravatar, but backed by stable diffusion based off of the hash. There is a terrible bit of code that turns a gravatar hash into a stable diffusion prompt and seed combination.\n\nThis stream covers the following topics:\n\n* Basic navigation with cursorless\n* Data transformations\n* How to execute on terrible ideas\n", + "slug": "cursorless", + "tags": [ + "accessibility", + "voiceControl", + "go", + "stableDiffusion" + ], + "title": "Shouting at my editor" + }, + { + "cdnPath": "talks/vod/2023/02-04-emacs", + "date": "2023-02-04", + "description": " This is a shorter stream where I switched my Emacs config from [Spacemacs](https://spacemacs.org) to a custom configuration I've been prototyping for a year or so that has everything managed with [home-manager](https://nixos.wiki/wiki/Home_Manager) on NixOS. This allows my configuration to be completely managed in configuration and all packages that I depend on can be precompiled at deploy time_, allowing me to run my complicated configurations on less powerful hardware without having to wait for bytecode compilation to happen. Most of the rest of the stream was just going through the motions of actually making the change, and then trying to make some ergonomics changes so that I could use it as a replacement for tmux.\n\n This stream covers the following topics:\n\n * Nix/NixOS configuration management\n * Emacs Lisp programming\n * Writing custom interactive commands in Emacs\n * Proving chat wrong about the capabilities of Emacs\n", + "slug": "emacs-nix", + "tags": [ + "emacs", + "nix", + "lisp", + "tmux" + ], + "title": "Ripping the bandaid off and using Emacs managed by Nix" + }, + { + "cdnPath": "talks/vod/2023/01-21-reader-mode", + "date": "2023-01-21", + "description": "When you are using reader mode in Firefox, Safari or Google Chrome, the browser rends control of the website's design and renders its own design. This is typically done in order to prevent people's bad design decisions from making webpages unreadable and also to strip away advertisements from content. As a website publisher, I rely on the ability to control the CSS of my blog a lot. This stream covers the research/implementation process for fixing some long-standing issues with the Xesite CSS and making a fix to XeDN so that the site renders acceptably in reader mode.\n\nThis stream covers the following topics:\n\n* Understanding complicated CSS rules and creating fixes for issues with them\n* Using content distribution networks (CDNs) to help reduce page load time for readers\n* Implementing image resizing capabilities into an existing CDN program (XeDN)\n* Design with end-users in mind\n", + "slug": "reader-mode-css", + "tags": [ + "css", + "xedn", + "imageProcessing", + "scalability", + "bugFix" + ], + "title": "Fixing Xesite in reader mode and RSS readers" + }, + { + "cdnPath": "talks/vod/2023/01-07-pronouns", + "date": "2023-01-07", + "description": "In this stream I implemented the [pronouns](https://pronouns.within.lgbt) service and deployed it to the cloud with [fly.io](https://fly.io). This was mostly writing a bunch of data files with [Dhall](https://dhall-lang.org) and then writing a simple Rust program to query that 'database' and then show results based on the results of those queries.\n\nThis stream covers the following topics:\n\n* Starting a new Rust project from scratch with Nix flakes, Axum, and Maud\n* API design for human and machine-paresable outputs\n* DevOps deployment to the cloud via [fly.io](https://fly.io)\n* Writing Terraform code for the pronouns service\n* Building Docker images with Nix flakes and `pkgs.dockerTools.buildLayeredImage`\n* Writing API documentation\n* Writing [the writeup](https://xeiaso.net/blog/pronouns-service) on the service\n", + "slug": "pronouns-service", + "tags": [ + "rust", + "axum", + "terraform", + "nix", + "flyio", + "docker" + ], + "title": "Implementing the Pronouns service in Rust and Axum" + }, + { + "cdnPath": "talks/vod/2022/12-31-nguh", + "date": "2022-12-31", + "description": "This stream was the last stream of 2022 and focused on modernizing the [hlang](https://xeiaso.net/blog/series/h) compiler. In this stream I reverse-engineered how WebAssembly modules work and wrote my own compiler for a trivial esoteric programming language named h. The existing compiler relied on legacy features of WebAssembly tools that don't work anymore.\n\nThis stream covers the following topics:\n\n* Reverse-engineering the WebAssembly module format based on the specification and other reverse-engineering tools\n* Adapting an existing compiler to output WebAssembly directly\n* Deploying a new service to my NixOS machines in the cloud\n* Building a Nix flake and custom NixOS module to build and deploy the new hlang website\n* Terraform DNS config\n* Writing [the writeup on the new compiler](https://xeiaso.net/blog/hlang-nguh)\n", + "slug": "hlang-nguh-compiler", + "tags": [ + "hlang", + "go", + "wasm", + "philosophy", + "devops", + "terraform", + "aws", + "route53", + "nixos" + ], + "title": "Modernizing hlang with the nguh compiler" + } +]; -- cgit v1.2.3