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"; + +
+
- +
- {"tree"} + {"tree"}
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} - 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 = [ ]; --- -