diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..4bf10c6
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+/public/rss.xsl linguist-vendored
\ No newline at end of file
diff --git a/.github/workflows/houseplants-deploy.yml b/.github/workflows/houseplants-deploy.yml
new file mode 100644
index 0000000..08549c2
--- /dev/null
+++ b/.github/workflows/houseplants-deploy.yml
@@ -0,0 +1,33 @@
+name: Deploy on Houseplants
+
+on:
+ push:
+ branches:
+ - main
+
+jobs:
+ deploy:
+ name: Deploy
+ runs-on: ubuntu-latest
+ steps:
+ - name: Setup Tailscale
+ uses: tailscale/github-action@v3
+ with:
+ oauth-client-id: ${{secrets.TS_OAUTH_ID}}
+ oauth-secret: ${{secrets.TS_OAUTH_SECRET}}
+ tags: tag:ci
+ use-cache: "true"
+
+ - name: Deploy to Houseplants
+ shell: bash
+ run: |
+ # Add the Tailscale IP of your VPS
+ TAILSCALE_IP="100.64.20.2" # Replace with your VPS Tailscale IP
+
+ # SSH into the VPS and deploy
+ ssh -o StrictHostKeyChecking=no "deploy@${TAILSCALE_IP}" << 'EOF'
+ cd /opt/ivy.rs # Replace with the project directory on the VPS
+ git pull origin main
+ pnpm install # Adjust this if you're using a different build tool
+ pnpm run build
+ EOF
diff --git a/.gitignore b/.gitignore
index 016b59e..8b44695 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,7 @@
# build output
dist/
+redirects.caddyfile
+robots.caddyfile
# generated types
.astro/
diff --git a/Caddyfile b/Caddyfile
new file mode 100644
index 0000000..8375309
--- /dev/null
+++ b/Caddyfile
@@ -0,0 +1,15 @@
+# this will only work on my vps.. sorry lol
+
+http://localhost:9000 {
+ root * ./dist
+ file_server
+
+ handle_errors {
+ @404 {
+ expression {http.error.status_code} == 404
+ }
+ rewrite @404 /404.html
+ file_server
+ }
+ import ./redirects.caddyfile
+}
\ No newline at end of file
diff --git a/astro.config.mjs b/astro.config.mjs
index 837ac3c..91d6fbb 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -16,7 +16,7 @@ export default defineConfig({
],
markdown: {
shikiConfig: {
- theme: "gruvbox-dark-hard"
+ theme: "gruvbox-dark-soft"
},
},
diff --git a/cli/src/main.ts b/cli/src/main.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/package.json b/package.json
index 42d514d..69be177 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
"dependencies": {
"@astrojs/rss": "^4.0.11",
"@tailwindcss/vite": "^4.0.13",
- "astro": "^5.7.5",
+ "astro": "^5.7.10",
"astro-pagefind": "^1.8.3",
"ava": "^6.2.0",
"clsx": "^2.1.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e59e1b9..6c25625 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -13,13 +13,13 @@ importers:
version: 4.0.11
'@tailwindcss/vite':
specifier: ^4.0.13
- version: 4.0.13(vite@6.3.3(jiti@2.4.2)(lightningcss@1.29.2))
+ version: 4.0.13(vite@6.3.4(jiti@2.4.2)(lightningcss@1.29.2))
astro:
- specifier: ^5.7.5
- version: 5.7.5(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.35.0)(typescript@5.8.2)
+ specifier: ^5.7.10
+ version: 5.7.10(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.35.0)(typescript@5.8.2)
astro-pagefind:
specifier: ^1.8.3
- version: 1.8.3(astro@5.7.5(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.35.0)(typescript@5.8.2))
+ version: 1.8.3(astro@5.7.10(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.35.0)(typescript@5.8.2))
ava:
specifier: ^6.2.0
version: 6.2.0(rollup@4.35.0)
@@ -867,8 +867,8 @@ packages:
peerDependencies:
astro: ^2.0.4 || ^3 || ^4 || ^5
- astro@5.7.5:
- resolution: {integrity: sha512-c59YuYiXyWWnUMOBlDczrjqKzF0dJQP20EP9vqDggcyKm//tEt9iJHNwoYq4r3UeO9UJCwlGK8FwaGTAwwF3IA==}
+ astro@5.7.10:
+ resolution: {integrity: sha512-9TQcFZqP2w6//JXXUHfw8/5PX7KUx9EkG5O3m+hISuyeUztvjY1q5+p7+C5HiXyg24Zs3KkpieoL5BGRXGCAGA==}
engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
hasBin: true
@@ -1249,14 +1249,6 @@ packages:
fastq@1.19.1:
resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
- fdir@6.4.3:
- resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==}
- peerDependencies:
- picomatch: ^3 || ^4
- peerDependenciesMeta:
- picomatch:
- optional: true
-
fdir@6.4.4:
resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==}
peerDependencies:
@@ -2212,10 +2204,6 @@ packages:
tinyexec@0.3.2:
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
- tinyglobby@0.2.12:
- resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==}
- engines: {node: '>=12.0.0'}
-
tinyglobby@0.2.13:
resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==}
engines: {node: '>=12.0.0'}
@@ -2296,8 +2284,8 @@ packages:
unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
- unifont@0.2.0:
- resolution: {integrity: sha512-RoF14/tOhLvDa7R5K6A3PjsfJVFKvadvRpWjfV1ttabUe9704P1ie9z1ABLWEts/8SxrBVePav/XhgeFNltpsw==}
+ unifont@0.4.1:
+ resolution: {integrity: sha512-zKSY9qO8svWYns+FGKjyVdLvpGPwqmsCjeJLN1xndMiqxHWBAhoWDMYMG960MxeV48clBmG+fDP59dHY1VoZvg==}
unist-util-find-after@5.0.0:
resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
@@ -2397,8 +2385,8 @@ packages:
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
- vite@6.3.3:
- resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==}
+ vite@6.3.4:
+ resolution: {integrity: sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
peerDependencies:
@@ -3105,13 +3093,13 @@ snapshots:
postcss-selector-parser: 6.0.10
tailwindcss: 4.0.13
- '@tailwindcss/vite@4.0.13(vite@6.3.3(jiti@2.4.2)(lightningcss@1.29.2))':
+ '@tailwindcss/vite@4.0.13(vite@6.3.4(jiti@2.4.2)(lightningcss@1.29.2))':
dependencies:
'@tailwindcss/node': 4.0.13
'@tailwindcss/oxide': 4.0.13
lightningcss: 1.29.2
tailwindcss: 4.0.13
- vite: 6.3.3(jiti@2.4.2)(lightningcss@1.29.2)
+ vite: 6.3.4(jiti@2.4.2)(lightningcss@1.29.2)
'@types/debug@4.1.12':
dependencies:
@@ -3211,14 +3199,14 @@ snapshots:
arrify@3.0.0: {}
- astro-pagefind@1.8.3(astro@5.7.5(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.35.0)(typescript@5.8.2)):
+ astro-pagefind@1.8.3(astro@5.7.10(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.35.0)(typescript@5.8.2)):
dependencies:
'@pagefind/default-ui': 1.3.0
- astro: 5.7.5(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.35.0)(typescript@5.8.2)
+ astro: 5.7.10(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.35.0)(typescript@5.8.2)
pagefind: 1.3.0
sirv: 3.0.1
- astro@5.7.5(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.35.0)(typescript@5.8.2):
+ astro@5.7.10(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.35.0)(typescript@5.8.2):
dependencies:
'@astrojs/compiler': 2.11.0
'@astrojs/internal-helpers': 0.6.1
@@ -3264,15 +3252,15 @@ snapshots:
semver: 7.7.1
shiki: 3.3.0
tinyexec: 0.3.2
- tinyglobby: 0.2.12
+ tinyglobby: 0.2.13
tsconfck: 3.1.5(typescript@5.8.2)
ultrahtml: 1.6.0
- unifont: 0.2.0
+ unifont: 0.4.1
unist-util-visit: 5.0.0
unstorage: 1.15.0
vfile: 6.0.3
- vite: 6.3.3(jiti@2.4.2)(lightningcss@1.29.2)
- vitefu: 1.0.6(vite@6.3.3(jiti@2.4.2)(lightningcss@1.29.2))
+ vite: 6.3.4(jiti@2.4.2)(lightningcss@1.29.2)
+ vitefu: 1.0.6(vite@6.3.4(jiti@2.4.2)(lightningcss@1.29.2))
xxhash-wasm: 1.1.0
yargs-parser: 21.1.1
yocto-spinner: 0.2.1
@@ -3704,10 +3692,6 @@ snapshots:
dependencies:
reusify: 1.1.0
- fdir@6.4.3(picomatch@4.0.2):
- optionalDependencies:
- picomatch: 4.0.2
-
fdir@6.4.4(picomatch@4.0.2):
optionalDependencies:
picomatch: 4.0.2
@@ -4927,11 +4911,6 @@ snapshots:
tinyexec@0.3.2: {}
- tinyglobby@0.2.12:
- dependencies:
- fdir: 6.4.3(picomatch@4.0.2)
- picomatch: 4.0.2
-
tinyglobby@0.2.13:
dependencies:
fdir: 6.4.4(picomatch@4.0.2)
@@ -4997,7 +4976,7 @@ snapshots:
trough: 2.2.0
vfile: 6.0.3
- unifont@0.2.0:
+ unifont@0.4.1:
dependencies:
css-tree: 3.1.0
ohash: 2.0.11
@@ -5072,7 +5051,7 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.2
- vite@6.3.3(jiti@2.4.2)(lightningcss@1.29.2):
+ vite@6.3.4(jiti@2.4.2)(lightningcss@1.29.2):
dependencies:
esbuild: 0.25.1
fdir: 6.4.4(picomatch@4.0.2)
@@ -5085,9 +5064,9 @@ snapshots:
jiti: 2.4.2
lightningcss: 1.29.2
- vitefu@1.0.6(vite@6.3.3(jiti@2.4.2)(lightningcss@1.29.2)):
+ vitefu@1.0.6(vite@6.3.4(jiti@2.4.2)(lightningcss@1.29.2)):
optionalDependencies:
- vite: 6.3.3(jiti@2.4.2)(lightningcss@1.29.2)
+ vite: 6.3.4(jiti@2.4.2)(lightningcss@1.29.2)
web-namespaces@2.0.1: {}
diff --git a/src/components/home/Hero.astro b/src/components/home/Hero.astro
index d19f494..96d327a 100644
--- a/src/components/home/Hero.astro
+++ b/src/components/home/Hero.astro
@@ -15,9 +15,17 @@ import { Content as Bio } from "~/content/bio.md";
+
+
+
-
+
-
+
diff --git a/src/components/home/LatestBlogPosts.astro b/src/components/home/LatestBlogPosts.astro
index 0526763..b0151dd 100644
--- a/src/components/home/LatestBlogPosts.astro
+++ b/src/components/home/LatestBlogPosts.astro
@@ -3,7 +3,7 @@ import Box from "~/components/ui/Box.astro";
import CollectionList from "~/components/lists/BlogPostList.astro";
import StyledLink from "~/components/util/StyledLink.astro";
---
-
+
see more
diff --git a/src/components/lists/BlogPostList.astro b/src/components/lists/BlogPostList.astro
index aeb1f49..f5c1556 100644
--- a/src/components/lists/BlogPostList.astro
+++ b/src/components/lists/BlogPostList.astro
@@ -5,10 +5,17 @@ import { getPublishedAndSortedPosts } from "~/lib/blog";
interface Props {
limit?: number;
+ featured?: boolean;
+}
+
+const { limit = 1000, featured = false } = Astro.props;
+let items = getPublishedAndSortedPosts(await getCollection("blog"));
+
+// Filter items to only include featured posts if the `featured` prop is true
+if (featured) {
+ items = items.filter((item) => item.data.featured === true);
}
-const { limit } = Astro.props;
-const items = getPublishedAndSortedPosts(await getCollection("blog"));
const limitedItems = limit ? items.slice(0, limit) : items;
const getPostIcon = (item: { data: { icon?: string } }) => {
diff --git a/src/components/ui/Header.astro b/src/components/ui/Header.astro
index 9e6de8d..a5c26f5 100644
--- a/src/components/ui/Header.astro
+++ b/src/components/ui/Header.astro
@@ -1,5 +1,4 @@
---
-import { getFlavourText } from "~/lib/fun";
import Navigation from "./Navigation.astro";
import conf from "~/site.config";
@@ -12,6 +11,5 @@ let headerurl = "/";
{headertext}
- {getFlavourText()}
diff --git a/src/components/ui/Navigation.astro b/src/components/ui/Navigation.astro
index d96de53..2a1ddf8 100644
--- a/src/components/ui/Navigation.astro
+++ b/src/components/ui/Navigation.astro
@@ -38,7 +38,7 @@ const headerLinks = [
];
---
-