diff --git a/package.json b/package.json index 21b24ff3..b7a4c6cc 100644 --- a/package.json +++ b/package.json @@ -16,10 +16,10 @@ "dependencies": { "@astrojs/markdown-component": "1.0.5", "@astrojs/react": "^3.6.0", - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", - "@mui/icons-material": "^5.16.0", - "@mui/material": "^5.16.0", + "@emotion/react": "^11.13.0", + "@emotion/styled": "^11.13.0", + "@mui/icons-material": "^5.16.5", + "@mui/material": "^5.16.5", "@netlify/functions": "^2.8.1", "fast-xml-parser": "^4.4.0", "markdown-truncate": "^1.1.1", @@ -27,9 +27,10 @@ }, "devDependencies": { "@astro-community/astro-embed-youtube": "^0.5.2", - "@astrojs/mdx": "^3.1.2", + "@astrojs/mdx": "^3.1.3", "@astrojs/partytown": "^2.1.1", "@astrojs/rss": "^4.0.7", + "@astrojs/markdown-component": "1.0.5", "@astrojs/sitemap": "^3.1.6", "@astrojs/tailwind": "^5.1.0", "@astrolib/analytics": "^0.5.0", @@ -38,28 +39,28 @@ "@fontsource/bitter": "^5.0.19", "@iconify-json/carbon": "^1.1.36", "@iconify-json/fa": "^1.1.8", - "@iconify-json/fluent": "^1.1.58", + "@iconify-json/fluent": "^1.1.59", "@iconify-json/simple-line-icons": "^1.1.8", "@iconify-json/ph": "^1.1.13", "@iconify-json/ri": "^1.1.21", - "@iconify-json/simple-icons": "^1.1.109", - "@iconify-json/tabler": "^1.1.117", + "@iconify-json/simple-icons": "^1.1.110", + "@iconify-json/tabler": "^1.1.118", "@tailwindcss/typography": "^0.5.13", - "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.41", - "@typescript-eslint/parser": "^8.0.0-alpha.41", + "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", + "@typescript-eslint/parser": "^8.0.0-alpha.54", "accessible-astro-components": "^2.3.6", - "astro": "^4.11.5", + "astro": "^4.12.2", "astro-icon": "^1.1.0", - "eslint": "^9.6.0", + "eslint": "^9.7.0", "eslint-plugin-astro": "^1.2.3", "limax": "4.1.0", "mdast-util-to-string": "^4.0.0", - "prettier": "^3.3.2", - "prettier-plugin-astro": "^0.14.0", + "prettier": "^3.3.3", + "prettier-plugin-astro": "^0.14.1", "reading-time": "^1.5.0", "svgo": "^3.3.2", - "tailwindcss": "^3.4.4", + "tailwindcss": "^3.4.7", "truncate-html": "^1.1.1", - "typescript": "^5.5.3" + "typescript": "^5.5.4" } } diff --git a/src/assets/images/articles/1*Q5JULI5RlYh4apVdQa-N1w.webp b/src/assets/images/articles/1*Q5JULI5RlYh4apVdQa-N1w.webp new file mode 100644 index 00000000..c5961807 Binary files /dev/null and b/src/assets/images/articles/1*Q5JULI5RlYh4apVdQa-N1w.webp differ diff --git a/src/assets/images/articles/1*Soys68WY2ihqz-qiTHI_Ng.webp b/src/assets/images/articles/1*Soys68WY2ihqz-qiTHI_Ng.webp new file mode 100644 index 00000000..1ccbec25 Binary files /dev/null and b/src/assets/images/articles/1*Soys68WY2ihqz-qiTHI_Ng.webp differ diff --git a/src/assets/images/articles/1*StgPE0QKkMOWm96uUFCFCQ.webp b/src/assets/images/articles/1*StgPE0QKkMOWm96uUFCFCQ.webp new file mode 100644 index 00000000..d8e54c16 Binary files /dev/null and b/src/assets/images/articles/1*StgPE0QKkMOWm96uUFCFCQ.webp differ diff --git a/src/assets/images/articles/1*WUfhLdT4ewEz0_trgoqFow.webp b/src/assets/images/articles/1*WUfhLdT4ewEz0_trgoqFow.webp new file mode 100644 index 00000000..3b745c84 Binary files /dev/null and b/src/assets/images/articles/1*WUfhLdT4ewEz0_trgoqFow.webp differ diff --git a/src/assets/images/articles/1*m42kZBxdjFjcrAByDXGB6A.webp b/src/assets/images/articles/1*m42kZBxdjFjcrAByDXGB6A.webp new file mode 100644 index 00000000..42e21b39 Binary files /dev/null and b/src/assets/images/articles/1*m42kZBxdjFjcrAByDXGB6A.webp differ diff --git a/src/assets/images/articles/hb.jpeg b/src/assets/images/articles/hb.jpeg new file mode 100644 index 00000000..12eeef63 Binary files /dev/null and b/src/assets/images/articles/hb.jpeg differ diff --git a/src/assets/images/articles/kceu.jpeg b/src/assets/images/articles/kceu.jpeg new file mode 100644 index 00000000..40a6fd36 Binary files /dev/null and b/src/assets/images/articles/kceu.jpeg differ diff --git a/src/assets/images/articles/oseu.jpeg b/src/assets/images/articles/oseu.jpeg new file mode 100644 index 00000000..c3e005a4 Binary files /dev/null and b/src/assets/images/articles/oseu.jpeg differ diff --git a/src/assets/images/clients/caepe.png b/src/assets/images/clients/caepe.png new file mode 100644 index 00000000..b8b19495 Binary files /dev/null and b/src/assets/images/clients/caepe.png differ diff --git a/src/assets/images/clients/caepe.sh b/src/assets/images/clients/caepe.sh new file mode 100644 index 00000000..8edf290e --- /dev/null +++ b/src/assets/images/clients/caepe.sh @@ -0,0 +1,794 @@ + + + + + + + + + + + + +CAEPE Kubernetes Continuous Deployment - CAEPE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + +
+ + +
+
+ + +
+
+ + +
+ + + +
+
+
+

CAEPE™ Kubernetes Continuous Deployment

+ + + +

Deploy better, ship faster.

+ + + +
+
+
+
+ + + +
+
+
+
+ + + +
+
+
10x
+ + + +

Feature delivery

+
+ + + +
+
+ + + +

Support teams of different skill levels

+
+ + + +
+
+ + + +

Full enterprise support

+
+
+
+ + + +
+
+

Resources:

+
+ + + +
+
+ + + +
+

Features.

+ + + +
+
+
+ + + +

Progressive & Confident Delivery

+ + + +

Deployment Strategies, Smoke Tests, Pre-flight Tests, Dry Runs

+
+ + + +
+
+ + + +

Deploy
Anywhere

+ + + +

Major cloud services, on-prem,  airgapped/edge

+
+ + + +
+
+ + + +

Edge/Airgapped
Applications

+ + + +

Auto-cluster builds, deployment queues & priority, private repos/registries

+
+ + + +
+
+ + + +

Enterprise
Needs

+ + + +

RBAC, UI/APIs or scripting, best practices/conventions, enterprise support

+
+
+ + + + +
+ + + +
+

Use Cases.

+ + + +
+
+
+
+ + + +

Enhance Deployment Quality and Consistency

+ + + +

CAEPE addresses the challenges of maintaining consistent deployments, particularly for large and distributed teams, by enforcing deployment quality and consistency in several ways.

+ + + +

Read more

+
+
+ + + +
+
+
+ + + +

Accelerate Time to Market

+ + + +

By using CAEPE, engineering teams reduce the time required to onboard and release new applications to end users. CAEPE allows DevOps teams to automate pipelines and manage workflows and tests, while developers and QA engineers can build deployment plans based on guided workflows and prescribed tests without relying on DevOps.

+
+
+ + + +
+
+
+ + + +

Manage Software Upgrades and Execute Deployment Strategies

+ + + +

When it comes to software upgrades, DevOps teams employ various progressive delivery strategies to ensure positive end-user experiences, minimal downtime, and seamless transitions. CAEPE offers guided, UI-based workflows for each deployment strategy, enabling users to efficiently deploy, control routing, and tag new versions based on cluster groups for testing new features.

+ + + +

Read more

+
+
+ + + +
+
+
+ + + +

Test Production Applications and Kubernetes Versions

+ + + +

Engineering teams often need to test new production deployments for scalability & reliability and may want to evaluate existing applications on newer Kubernetes versions. CAEPE streamlines these testing scenarios through its UI, allowing users to deploy applications, initiate tests, and handle rollbacks or deployment to remaining clusters based on test results. Users can rapidly create cluster versions with new Kubernetes releases, snapshot and restore production applications and data, and run smoke tests to ensure functionality.

+ + + +

Read more

+
+
+ + + +
+
+
+ + + +

Support Regional and Global Deployments

+ + + +

CAEPE simplifies management of regional and global deployments by offering one-click deployment to various environments, enabling users to enforce data protection policies and comply with regional requirements.

+
+
+ + + +
+
+
+ + + +

Bridge Kubernetes Skill Gaps

+ + + +

CAEPE provides an easy-to-use web-based UI for common and advanced deployment tasks, enabling DevOps engineers to share responsibilities with the larger team and abstracting the process from the native Kubernetes layer for progressive delivery strategies.

+
+
+ + + +
+
+
+ + + +

Address Enterprise Requirements

+ + + +

CAEPE helps organizations meet their enterprise needs for Kubernetes applications, including deployment permissions and visibility, unified deployment approach, and business continuity planning.

+ + + +

Read more

+
+
+ + + +
+
+
+ + + +

Reduce DevOps Team Effort and Reliance

+ + + +

CAEPE significantly cuts down the time and effort DevOps teams spend on deployment, enabling them to focus on optimizing applications in production clusters. With CAEPE, QA engineers and developers can manage their own deployments, and teams can spin up short-term clusters for quick tests and development checks.

+ + + +

Read more

+
+
+
+ + + + +
+ + + +
+
+
+

Free Pilot Program

+ + + +

Evaluating DevOps tools for your team? The CAEPE pilot simplifies tool onboarding and adoption.

+
+ + + +
+
+ + + + +
+
+
+ + + +
+ + + +
+ +
+ + +
+ + +
+
+ + +
+ +
+ Scroll to Top +
+ + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/clients/docker.svg b/src/assets/images/clients/docker.svg new file mode 100644 index 00000000..b10cd5f9 --- /dev/null +++ b/src/assets/images/clients/docker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/clients/kilt.png b/src/assets/images/clients/kilt.png new file mode 100644 index 00000000..f3882893 Binary files /dev/null and b/src/assets/images/clients/kilt.png differ diff --git a/src/assets/images/clients/n8n.svg b/src/assets/images/clients/n8n.svg new file mode 100644 index 00000000..4ceb8f65 --- /dev/null +++ b/src/assets/images/clients/n8n.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/clients/revecom.png b/src/assets/images/clients/revecom.png new file mode 100644 index 00000000..6d2348da Binary files /dev/null and b/src/assets/images/clients/revecom.png differ diff --git a/src/assets/images/clients/sentry.png b/src/assets/images/clients/sentry.png new file mode 100644 index 00000000..e0277588 Binary files /dev/null and b/src/assets/images/clients/sentry.png differ diff --git a/src/assets/images/clients/slint.svg b/src/assets/images/clients/slint.svg new file mode 100644 index 00000000..9c802864 --- /dev/null +++ b/src/assets/images/clients/slint.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/games/407574.jpg b/src/assets/images/games/407574.jpg new file mode 100644 index 00000000..5ac4d2e8 Binary files /dev/null and b/src/assets/images/games/407574.jpg differ diff --git a/src/assets/images/games/408396.jpg b/src/assets/images/games/408396.jpg new file mode 100644 index 00000000..799d314b Binary files /dev/null and b/src/assets/images/games/408396.jpg differ diff --git a/src/assets/images/games/463789.jpg b/src/assets/images/games/463789.jpg new file mode 100644 index 00000000..213afa53 Binary files /dev/null and b/src/assets/images/games/463789.jpg differ diff --git a/src/assets/images/games/473859.jpg b/src/assets/images/games/473859.jpg new file mode 100644 index 00000000..23438d2e Binary files /dev/null and b/src/assets/images/games/473859.jpg differ diff --git a/src/assets/images/games/477885.jpg b/src/assets/images/games/477885.jpg new file mode 100644 index 00000000..553aa74a Binary files /dev/null and b/src/assets/images/games/477885.jpg differ diff --git a/src/assets/images/games/483011.jpg b/src/assets/images/games/483011.jpg new file mode 100644 index 00000000..00a7d251 Binary files /dev/null and b/src/assets/images/games/483011.jpg differ diff --git a/src/assets/images/games/aipokalypse.jpeg b/src/assets/images/games/aipokalypse.jpeg new file mode 100644 index 00000000..5151a464 Binary files /dev/null and b/src/assets/images/games/aipokalypse.jpeg differ diff --git a/src/components/Book.astro b/src/components/Book.astro index 490dca8b..31696d27 100644 --- a/src/components/Book.astro +++ b/src/components/Book.astro @@ -91,6 +91,7 @@ var idOfTitle = slugify(book.data.title); {book.data.publisher}, {formattedDate}, {book.data.role} + {truncatedBody} { book.data.store_urls && ( diff --git a/src/components/Client.astro b/src/components/Client.astro index 8dd835a3..4e1cb427 100644 --- a/src/components/Client.astro +++ b/src/components/Client.astro @@ -4,6 +4,7 @@ import { Image } from 'astro:assets'; import { type CollectionEntry } from 'astro:content'; import Markdown from '@astrojs/markdown-component'; +import truncateMarkdown from 'markdown-truncate'; export interface Props { client: CollectionEntry<'clients'>; @@ -11,6 +12,11 @@ export interface Props { const { client } = Astro.props; // const { Content } = await client.render(); // const featured_image = await findImage(client.data.image); + +const truncatedBody = truncateMarkdown(client.body, { + limit: 500, + ellipsis: true, +}); ---
@@ -29,7 +35,7 @@ const { client } = Astro.props; {client.data.title} @@ -52,6 +58,9 @@ const { client } = Astro.props; {client.data.type} - {client.body} + +
+ {truncatedBody} +
diff --git a/src/components/Course.astro b/src/components/Course.astro index 770acc8c..f6c254d1 100644 --- a/src/components/Course.astro +++ b/src/components/Course.astro @@ -78,6 +78,7 @@ var idOfTitle = slugify(course.data.title); {course.data.client}, {formattedDate} + {course.body} { course.data.store_urls && ( diff --git a/src/components/Event.astro b/src/components/Event.astro index 8162ef91..33d3caf0 100644 --- a/src/components/Event.astro +++ b/src/components/Event.astro @@ -61,6 +61,7 @@ var eventFormat = ''; + {body}
-

- { - url ? ( - - {game.data.title} - - ) : ( - game.data.title - ) - } +

+ {game.data.title}

{game.data.role}
+ {truncatedBody} + { + game.data.store_urls && ( + + Buy a copy in the following places: + + + ) + }
diff --git a/src/components/Post.astro b/src/components/Post.astro index 3a94c30b..f030e2ea 100644 --- a/src/components/Post.astro +++ b/src/components/Post.astro @@ -39,11 +39,10 @@ const truncatedBody = truncateMarkdown(post.body, { ellipsis: true, }); --- +
-
diff --git a/src/content/clients/caepe.md b/src/content/clients/caepe.md new file mode 100644 index 00000000..27f55abc --- /dev/null +++ b/src/content/clients/caepe.md @@ -0,0 +1,16 @@ +--- +type: Technical writing +title: CAEPE +layout: "../../layouts/Client.astro" +company_url: 'https://docker.com' +image: "~/assets/images/clients/caepe.png" +start_date: 2022 +end_date: 2023 +tags: +- Kubernetes +- containers +--- + +CAEPE is a Comprehensive Control Plane for Kubernetes Application Deployments + +I helped the company create its documentation tooling, documentation, and technical video content. \ No newline at end of file diff --git a/src/content/clients/docker.md b/src/content/clients/docker.md new file mode 100644 index 00000000..0e87e6e4 --- /dev/null +++ b/src/content/clients/docker.md @@ -0,0 +1,21 @@ +--- +type: Technical writing +title: Docker +layout: "../../layouts/Client.astro" +company_url: 'https://docker.com' +image: "~/assets/images/clients/docker.svg" +start_date: 2023 +end_date: 2023 +tags: +- docker +- containers +--- + +Docker Inc is a major contributor to many container-related technologies and its own commercial offerings. I was a staff technical writer on the documentation team and was attached to working on a number of commercial products. My responsibilities included: + +- Working with product managers, engineers, and designers to create and maintain documentation for new and existing products +- Proposing and steering new improvement projects +- Editing and reviewing submissions from internal and external contributors +- Liaising and working with our developer relations and marketing teams for collaboration ideas +- Writing technical blog posts for products +- Providing guidance, mentorship, and feedback \ No newline at end of file diff --git a/src/content/clients/kilt.md b/src/content/clients/kilt.md new file mode 100644 index 00000000..20fd869e --- /dev/null +++ b/src/content/clients/kilt.md @@ -0,0 +1,15 @@ +--- +type: Technical writing +title: KILT +layout: "../../layouts/Client.astro" +company_url: 'https://www.kilt.io' +image: "~/assets/images/clients/kilt.png" +start_date: 2023 +end_date: 2024 +tags: +- identity +- sdk +- blockchain +--- + +KILT provides secure, practical identity solutions for enterprises and consumers. I helped the team overhaul documentation and platform as well as documenting new features and creating video content. \ No newline at end of file diff --git a/src/content/clients/n8n.md b/src/content/clients/n8n.md new file mode 100644 index 00000000..bc810c42 --- /dev/null +++ b/src/content/clients/n8n.md @@ -0,0 +1,18 @@ +--- +type: Technical writing +title: n8n +image: ~/assets/images/clients/n8n.svg +category: Chris +tags: +- documentation +- automation +- hosting +- Containers +layout: "../../layouts/Client.astro" +company_url: 'https://n8n.io' +work_link: https://n8n.io +start_date: 2023 +end_date: 2023 +--- + +I helped the n8n team with creating self-hosting guides for their automation platform. \ No newline at end of file diff --git a/src/content/clients/revecom.md b/src/content/clients/revecom.md new file mode 100644 index 00000000..e2551411 --- /dev/null +++ b/src/content/clients/revecom.md @@ -0,0 +1,16 @@ +--- +type: Blogging +title: ReveCom +image: ~/assets/images/clients/revecom.png +category: Chris +tags: +- DevOps +- WASM +- Containers +layout: "../../layouts/Client.astro" +company_url: 'https://revecom.io' +start_date: 2020 +end_date: Ongoing +--- + +I write and edit posts for several ReveCom clients including Cosmonic, Kasten, and Speedscale. \ No newline at end of file diff --git a/src/content/clients/sentry.md b/src/content/clients/sentry.md new file mode 100644 index 00000000..beb2508a --- /dev/null +++ b/src/content/clients/sentry.md @@ -0,0 +1,16 @@ +--- +type: Blogging +title: Sentry +image: ~/assets/images/clients/sentry.png +category: Chris +tags: +- security +- debug +- programming +layout: "../../layouts/Client.astro" +company_url: 'https://sentry.io/welcome/' +start_date: 2023 +end_date: 2023 +--- + +I wrote blog posts on how to debug with certain languages. \ No newline at end of file diff --git a/src/content/clients/slint.md b/src/content/clients/slint.md new file mode 100644 index 00000000..bf66e21b --- /dev/null +++ b/src/content/clients/slint.md @@ -0,0 +1,15 @@ +--- +type: Technical writing +title: Slint +layout: "../../layouts/Client.astro" +company_url: 'https://slint.dev' +image: "~/assets/images/clients/slint.svg" +start_date: 2023 +end_date: 2024 +tags: +- cross-platform +- sdk +- API +--- + +Slint is a cross-platform SDK for building UIs. I helped the team overhaul their documentation tooling and rewrote their quickstart guides. \ No newline at end of file diff --git a/src/content/games/aberrations.md b/src/content/games/aberrations.md new file mode 100644 index 00000000..b8c4db1c --- /dev/null +++ b/src/content/games/aberrations.md @@ -0,0 +1,12 @@ +--- +title: Aberrations - Inflection Point - A Monster Horror Adventure In Icewind Dale +image: "~/assets/images/games/463789.jpg" +publisher: Art of Karthik +publish_date: 2023-12-27 +role: Proofreader +store_urls: + - label: Dungeon Masters Guild + url: https://www.dmsguild.com/product/463789/Aberrations-Inflection-Point--A-Monster-Horror-Adventure-In-Icewind-Dale +--- + +In the frigid heart of Icewind Dale, a distress call has been heard from a mining expedition sent to the outpost of Inflection Point. But this is no ordinary cry for help – it originates from the shattered remnants of a once-soaring castle that now lies broken and buried in the snow. Within its frozen depths, an elder mindflayer conducts grotesque experiments, melding aberration biology with creatures of the North, creating hybrid abominations that defy the natural order. \ No newline at end of file diff --git a/src/content/games/aipokalypse.md b/src/content/games/aipokalypse.md new file mode 100644 index 00000000..01984c65 --- /dev/null +++ b/src/content/games/aipokalypse.md @@ -0,0 +1,12 @@ +--- +title: A.I.Pokalypse +image: "~/assets/images/games/aipokalypse.jpeg" +publisher: Owly Mowly +publish_date: 2024-07-10 +role: English rules editor +store_urls: + - label: Kickstarter + url: https://www.kickstarter.com/projects/aipokalypse/aipokalypse-the-expert-auto-battle-card-game +--- + +After the A.I.POKALYPSE you are left to fend for yourself. Hire your best mercenaries, survive the combat zone and be the sole faction to make it out alive. Build your engine and fight for your life in this epic game in a small box! Raised €54,000 on Kickstarter in 2024. diff --git a/src/content/games/and-then-there-were-none.md b/src/content/games/and-then-there-were-none.md new file mode 100644 index 00000000..d97dd408 --- /dev/null +++ b/src/content/games/and-then-there-were-none.md @@ -0,0 +1,12 @@ +--- +title: Fairytale Fables of the Feywild +image: "~/assets/images/games/473859.jpg" +publisher: Art of Karthik +publish_date: 2024-03-23 +role: Proofreader +store_urls: + - label: Dungeon Masters Guild + url: https://www.dmsguild.com/product/473859/Fairytale-Fables-of-the-Feywild +--- + +Step into the enchanting realm of the Feywild, where the boundary between reality and fantasy blurs, and classic fairytales come to life in unexpected ways. Join the cunning Puss in Boots, the mysterious Little Miss Muffet, the porridge escapades of Goldilocks, the enigmatic Little Red Riding Hood, and the harrowed Cinderella, culminating in a climactic confrontation with the condescending Cloud Giant, leaving behind a trail of riddles and whimsical challenges! \ No newline at end of file diff --git a/src/content/games/moons-millions.md b/src/content/games/moons-millions.md new file mode 100644 index 00000000..6265c4a8 --- /dev/null +++ b/src/content/games/moons-millions.md @@ -0,0 +1,12 @@ +--- +title: Moon's Millions - A Phandalin Adventure! +image: "~/assets/images/games/407574.jpg" +publisher: Art of Karthik +publish_date: 2022-08-30 +role: Proofreader +store_urls: + - label: Dungeon Masters Guild + url: https://www.dmsguild.com/product/407574/Moons-Millions-A-Phandalin-Adventure +--- + +Once adventurers reach a high enough level, typical combat isn't that challenging. Puzzles and traps only get so far. They're probably rolling in money so they probably don't care for more of it as a reward. \ No newline at end of file diff --git a/src/content/games/oculus-prime.md b/src/content/games/oculus-prime.md new file mode 100644 index 00000000..a3510a16 --- /dev/null +++ b/src/content/games/oculus-prime.md @@ -0,0 +1,12 @@ +--- +title: Oculus Prime - A Bizarre Mystery Adventure +image: "~/assets/images/games/483011.jpg" +publisher: Art of Karthik +publish_date: 2023-07-17 +role: Proofreader +store_urls: + - label: Dungeon Masters Guild + url: https://www.dmsguild.com/product/483011/Oculus-Prime--A-Bizarre-Mystery-Adventure +--- + +In a bustling metropolis plagued by a string of mysterious disappearances, a sinister alliance between a clandestine death cult and a malevolent beholder unfolds. \ No newline at end of file diff --git a/src/content/games/pioneers-path.md b/src/content/games/pioneers-path.md new file mode 100644 index 00000000..e1f7fc5c --- /dev/null +++ b/src/content/games/pioneers-path.md @@ -0,0 +1,12 @@ +--- +title: Pioneer's Path To Port Luxus - An Urban Mystery Adventure! +image: "~/assets/images/games/408396.jpg" +publisher: Art of Karthik +publish_date: 2022-09-04 +role: Proofreader +store_urls: + - label: Dungeon Masters Guild + url: https://www.dmsguild.com/product/408396/Pioneers-Path-To-Port-Luxus-An-Urban-Mystery-Adventure +--- + +Dungeon Masters of the world, have you ever thrown a dragon at your party and found the resulting combat to be repetitive slugfest? Has your game of Dungeons & Dragons been reduced to a dull series of dice rolls resulting in "Hit" or "Miss"? Or conversely, is your dragon way too powerful, forcing you to make it weaker or risk a TPK? Would you like to spice up your dragon encounters with a little more personality? Would you like your dragons to be long-term threats whose actions have far-reaching consequences? Would you like to give your players more choices in what they want to do? \ No newline at end of file diff --git a/src/content/posts/2023/apple-shortcuts-obsidian.md b/src/content/posts/2023/apple-shortcuts-obsidian.md new file mode 100644 index 00000000..27d5ee9a --- /dev/null +++ b/src/content/posts/2023/apple-shortcuts-obsidian.md @@ -0,0 +1,15 @@ +--- +title: Bring the power of Apple Shortcuts to Obsidian +publishDate: 2023-12-13 +author: "Chris Ward" +publication_url: "https://medium.com/macoclock/bring-the-power-of-apple-shortcuts-to-obsidian-8cc84949e50e" +categories: + - writing +tags: + - Automation + - Apple + - Shortcuts +image: "../../../assets/images/articles/1*Soys68WY2ihqz-qiTHI_Ng.webp" +--- + +I’ve mentioned before that I have been using Obsidian more and more, and from a knowledge management perspective, it’s fantastic, with a plethora of plugins that extend its functionality to connect to many external services. But as a cross-platform Electron application, integration with the host operating system is one of the places it fails. As the underlying data store is a folder of files, some integration is possible there, but Obsidian has minimal awareness of changes that happen. \ No newline at end of file diff --git a/src/content/posts/2023/runme.md b/src/content/posts/2023/runme.md new file mode 100644 index 00000000..acec193d --- /dev/null +++ b/src/content/posts/2023/runme.md @@ -0,0 +1,14 @@ +--- +title: Making Markdown Interactive with Runme +publishDate: 2023-12-22 +author: "Chris Ward" +publication_url: "https://blog.stackademic.com/making-markdown-interactive-with-runme-654afb7a942b" +categories: + - writing +tags: + - Markdown + - Interactivity +image: "../../../assets/images/articles/1*m42kZBxdjFjcrAByDXGB6A.webp" +--- + +Markdown may be popular for its simplicity and “plainness”, but it’s often full of information. Whether for internal or external consumption, that information often contains code snippets for running certain commands or code examples. Wouldn’t it be great if you could run that code directly as you read from within the markdown? \ No newline at end of file diff --git a/src/content/posts/2024/eu-cloud-native.md b/src/content/posts/2024/eu-cloud-native.md new file mode 100644 index 00000000..9636a666 --- /dev/null +++ b/src/content/posts/2024/eu-cloud-native.md @@ -0,0 +1,15 @@ +--- +title: "As Kubernetes turns 10, experts predict the future of cloud-native" +publishDate: 2024-05-02 +author: "Chris Ward" +publication_url: "https://thenextweb.com/news/the-future-of-cloud-native-kubernetes" +categories: + - writing +tags: + - Kubernetes + - KubeCon + - Cloud-native +image: "../../../assets/images/articles/kceu.jpeg" +--- + +In June, Kubernetes celebrates its tenth birthday. The system is now so widely used by hundreds of thousands of companies worldwide to scale their applications to meet demand it’s hard even to remember a time before it existed. But there was a time when other options were available, and I even remember using some of them. \ No newline at end of file diff --git a/src/content/posts/2024/homebrew.md b/src/content/posts/2024/homebrew.md new file mode 100644 index 00000000..c36ba7f1 --- /dev/null +++ b/src/content/posts/2024/homebrew.md @@ -0,0 +1,16 @@ +--- +title: "After 15 years, the maintainer of Homebrew plans to make a living" +publishDate: 2024-07-26 +author: "Chris Ward" +publication_url: "https://thenextweb.com/news/homebrew-maintainer-make-a-living-15-weeks" +categories: + - writing +tags: + - macOS + - Homebrew +image: "../../../assets/images/articles/hb.jpeg" +--- + +Installing and updating applications and other dependencies on a computer really should be a solved problem by now. Yet almost every major desktop operating system provides multiple options, with no real clear answer to “which is best.” + +Linux, despite long-established package managers such as apt, deb, and rpm, just to name a few, still suffers from confusion and inconsistency between open source vs proprietary instals, as well as between developer tools and more user-focussed tools. Additionally, many package developers don’t even distribute to any package managers, or the versions you find in them are outdated. \ No newline at end of file diff --git a/src/content/posts/2024/loss-death.md b/src/content/posts/2024/loss-death.md new file mode 100644 index 00000000..18809737 --- /dev/null +++ b/src/content/posts/2024/loss-death.md @@ -0,0 +1,14 @@ +--- +title: Loss and absence in death +publishDate: 2024-01-06 +author: "Chris Ward" +publication_url: "https://chrischinchilla.medium.com/loss-and-absence-in-death-6c41d86be448" +categories: + - writing +tags: + - Death + - Loss +image: "../../../assets/images/articles/1*Q5JULI5RlYh4apVdQa-N1w.webp" +--- + +We had to put our 17-year-old cat to sleep last week. First, why does English have such terrible words for this action? “Putting down”, “putting to sleep”. They are both terrible ways to describe such an action, but I’m not sure I have any better ideas… \ No newline at end of file diff --git a/src/content/posts/2024/open-source-europe.md b/src/content/posts/2024/open-source-europe.md new file mode 100644 index 00000000..0edff1dc --- /dev/null +++ b/src/content/posts/2024/open-source-europe.md @@ -0,0 +1,17 @@ +--- +title: "The state of open source in Europe" +publishDate: 2024-04-11 +author: "Chris Ward" +publication_url: "https://thenextweb.com/news/state-open-source-europe" +categories: + - writing +tags: + - Open source + - Europe + - FOSDEM +image: "../../../assets/images/articles/oseu.jpeg" +--- + +Open source is at a crossroads. For the past few years, venture capital has directly or indirectly paid for many of the contributors and much of the infrastructure it needed to keep going. + +That was until the past 24 months or so, when funding started to slow down, leading to less internal development or funding resources going toward open source. \ No newline at end of file diff --git a/src/content/posts/2024/tracking-with-wordcounter.md b/src/content/posts/2024/tracking-with-wordcounter.md new file mode 100644 index 00000000..a7eaa4d1 --- /dev/null +++ b/src/content/posts/2024/tracking-with-wordcounter.md @@ -0,0 +1,14 @@ +--- +title: Tracking the words you write with WordCounter +publishDate: 2024-02-19 +author: "Chris Ward" +publication_url: "https://medium.com/macoclock/tracking-the-words-you-write-with-wordcounter-e7e08cbe50d7" +categories: + - writing +tags: + - Prodictivity + - Writing +image: "../../../assets/images/articles/1*StgPE0QKkMOWm96uUFCFCQ.webp" +--- + +How many words do you write every day? Think about it. Every time you send an email, post in Slack, or comment on an Instagram post. Oh, you thought I would mention those wondrous words you pour into your latest novel, blog post, marketing copy, or script? \ No newline at end of file diff --git a/src/content/posts/2024/writing-for-robots.md b/src/content/posts/2024/writing-for-robots.md new file mode 100644 index 00000000..e6ad4dc4 --- /dev/null +++ b/src/content/posts/2024/writing-for-robots.md @@ -0,0 +1,16 @@ +--- +title: Writing for robots – How to optimise your writing for LLMs +publishDate: 2024-04-23 +author: "Chris Ward" +publication_url: "https://chrischinchilla.medium.com/writing-for-robots-e051da7567e6" +categories: + - writing +tags: + - AI + - LLM + - Writing +image: "../../../assets/images/articles/1*WUfhLdT4ewEz0_trgoqFow.webp" +--- + +Who do you think reads most of your technical writing? Customers? Potential customers? +If your work is public and not behind a log-in, I hate to disappoint you, but your most frequent reader probably isn’t human. And this is nothing new. \ No newline at end of file diff --git a/src/pages/books/[...slug].astro b/src/pages/books/[...slug].astro deleted file mode 100644 index 7040750d..00000000 --- a/src/pages/books/[...slug].astro +++ /dev/null @@ -1,19 +0,0 @@ ---- -import MarkdownPostLayout from "../../layouts/MarkdownLayout.astro"; - -import { getCollection } from 'astro:content'; -// 1. Generate a new path for every collection entry -export async function getStaticPaths() { - const bookEntries = await getCollection('books'); - return bookEntries.map(entry => ({ - params: { slug: entry.slug }, props: { entry }, - })); -} -// 2. When it's time to render, you can get the entry directly from the prop -const { entry } = Astro.props; -const { Content } = await entry.render(); ---- - - - - diff --git a/src/pages/clients.astro b/src/pages/clients.astro deleted file mode 100644 index a625a992..00000000 --- a/src/pages/clients.astro +++ /dev/null @@ -1,38 +0,0 @@ ---- -import Layout from "~/layouts/PageLayoutNoBG.astro"; -import Headline from '~/components/blog/Headline.astro'; - -import Client from "../components/Client.astro"; -import { getCollection } from 'astro:content'; -const allClients = await getCollection('clients'); - -const meta = { - title: "Clients", - description: "Clients", - // canonical: post.canonical || url, - // image: await findImage(post.image), - // noindex: BLOG?.post?.noindex, - // ogType: 'article', -}; ---- - -
- - - {meta.title} - -
    - { - allClients.map((client) => ( -
  • - -
  • - )) - } -
-
-
\ No newline at end of file diff --git a/src/pages/clients/[...page].astro b/src/pages/clients/[...page].astro new file mode 100644 index 00000000..9be3595e --- /dev/null +++ b/src/pages/clients/[...page].astro @@ -0,0 +1,46 @@ +--- +import Layout from '~/layouts/PageLayoutNoBG.astro'; +import Headline from '~/components/blog/Headline.astro'; + +import Client from '~/components/Client.astro'; +import { getCollection } from 'astro:content'; +// const allClients = await getCollection('clients'); + +export async function getStaticPaths({ paginate }) { + let allClients = await getCollection('clients'); +// allGames = allGames.sort( (a, b) => new Date(b.data.publish_date).valueOf() - new Date(a.data.publish_date).valueOf() +// ); + + return paginate(allClients, { + pageSize: 25, + }); +} + +const { page } = Astro.props; + +const meta = { + title: 'Clients', + description: 'I\'ve worked with dozens of clients over the past 10 years. Small to large and spread across multiple industries. If you\'re looking for technical or creative text, audio, or video creation or editing:

Get in touch

', + // canonical: post.canonical || url, + // image: await findImage(post.image), + // noindex: BLOG?.post?.noindex, + // ogType: 'article', +}; +--- + + +
+ + {meta.title} + +
    + { + page.data.map((client) => ( +
  • + +
  • + )) + } +
+
+
diff --git a/src/pages/cv.md b/src/pages/cv.md index 19f08ae5..04077bf4 100644 --- a/src/pages/cv.md +++ b/src/pages/cv.md @@ -92,7 +92,7 @@ As a freelance writer and blogger, I have contributed to the blogs and documenta - **libcamera**: Documentation of an open-source camera stack and framework for Linux, Android, and ChromeOS. - **Dev Spotlight**: Technical blog posts for Salesforce, Kong, and others. -- **RevCom**: Technical blog post editing for high-profile clients. +- **ReveCom**: Technical blog post editing for high-profile clients. - **Sky Word**: Technical whitepaper writing for high-profile clients. - **Unity**: Documentation for the MARS AR development plugin. - **GitLab**: Technical blog posts. diff --git a/src/pages/games/[...page].astro b/src/pages/games/[...page].astro index 97513078..0d462308 100644 --- a/src/pages/games/[...page].astro +++ b/src/pages/games/[...page].astro @@ -18,7 +18,7 @@ export async function getStaticPaths({ paginate }) { const { page } = Astro.props; const meta = { title: "Games", - description: "I create and edit roleplay and board games and everything in-between.", + description: 'I create and edit roleplay and board games and everything in-between. If you\'re looking for a game writer, editor, or proofreader:

Get in touch

', // canonical: post.canonical || url, // image: await findImage(post.image), // noindex: BLOG?.post?.noindex, diff --git a/src/pages/games/[...slug].astro b/src/pages/games/[...slug].astro deleted file mode 100644 index 5ff1910c..00000000 --- a/src/pages/games/[...slug].astro +++ /dev/null @@ -1,34 +0,0 @@ ---- -import MarkdownPostLayout from '../../layouts/MarkdownLayout.astro'; -import { Image } from 'astro:assets'; -// import { findImage } from '~/utils/images'; -import { getCollection } from 'astro:content'; -// 1. Generate a new path for every collection entry -export async function getStaticPaths() { - const bookEntries = await getCollection('games'); - return bookEntries.map((entry) => ({ - params: { slug: entry.slug }, - props: { entry }, - })); -} -// 2. When it's time to render, you can get the entry directly from the prop -const { entry } = Astro.props; -// const featured_image = await findImage(entry.data.image); -const { Content } = await entry.render(); ---- - - - - {entry.data.title} - - \ No newline at end of file