This commit is contained in:
Ivy Turner 2025-05-05 15:55:53 +01:00
parent 5f63527955
commit f51dc7e078
No known key found for this signature in database
31 changed files with 331 additions and 88 deletions

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
/public/rss.xsl linguist-vendored

View file

@ -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

2
.gitignore vendored
View file

@ -1,5 +1,7 @@
# build output
dist/
redirects.caddyfile
robots.caddyfile
# generated types
.astro/

15
Caddyfile Normal file
View file

@ -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
}

View file

@ -16,7 +16,7 @@ export default defineConfig({
],
markdown: {
shikiConfig: {
theme: "gruvbox-dark-hard"
theme: "gruvbox-dark-soft"
},
},

View file

View file

@ -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",

67
pnpm-lock.yaml generated
View file

@ -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: {}

View file

@ -15,9 +15,17 @@ import { Content as Bio } from "~/content/bio.md";
<Prose>
<Bio />
</Prose>
<div class="mt-2 flex gap-2">
</div>
</div>
<div>
<Image src={"https://cdn.laker.tech/images/tree.png"} alt={"tree"} width={200} height={300}/>
<Image
src={"https://cdn.laker.tech/images/tree.png"}
alt={"tree"}
width={200}
height={300}
/>
</div>
</div>

View file

@ -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";
---
<Box title="latest blog posts" icon="fa-solid fa-signature" class="w-8">
<Box title="latest blog posts" icon="fa-solid fa-signature" class="w-[50%]">
<CollectionList limit={3} />
<div class="py-1"></div>
<StyledLink href="/blog">see more</StyledLink>

View file

@ -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 } }) => {

View file

@ -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 = "/";
<i class="fa-solid fa-star mr-2"></i>
<a href={headerurl}>{headertext}</a>
</h1>
<p class="hidden md:block">{getFlavourText()}</p>
<Navigation />
</header>

View file

@ -38,7 +38,7 @@ const headerLinks = [
];
---
<nav class="flex flex-row flex-wrap gap-4 md:flex-nowrap">
<nav class="flex flex-row flex-wrap gap-4 md:flex-nowrap text-balance">
{
headerLinks.map((link) => (
<span class="">
@ -54,4 +54,5 @@ const headerLinks = [
</span>
))
}
<a href="/meta/subscribe"><i class="fa-solid fa-rss text-light-or dark:text-dark-or"></i></a>
</nav>

View file

@ -3,7 +3,7 @@
---
<div
class="prose dark:prose-invert prose-p:text-light-tx dark:prose-p:text-dark-tx prose-headings:mt-1 prose-a:decoration-dotted prose-a:text-light-tx dark:prose-a:text-dark-tx prose-a:underline-offset-4 prose-a:decoration-2 prose-a:underline prose-a:decoration-light-pu dark:prose-a:decoration-dark-pu prose-strong:text-light-tx dark:prose-strong:text-dark-tx prose-code:font-mono prose-ul:list-outside"
class="prose dark:prose-invert prose-p:text-light-tx dark:prose-p:text-dark-tx prose-headings:mt-1 prose-a:decoration-dotted prose-a:text-light-tx dark:prose-a:text-dark-tx prose-a:underline-offset-4 prose-a:decoration-2 prose-a:underline prose-a:decoration-light-pu dark:prose-a:decoration-dark-pu prose-strong:text-light-tx dark:prose-strong:text-dark-tx prose-code:font-mono prose-ul:list-outside prose-ul:text-light-tx dark:prose-ul:text-dark-tx prose-headings:text-light-tx dark:prose-headings:text-dark-tx"
>
<slot />
</div>

View file

@ -2,7 +2,6 @@
import Notif from "../ui/Notif.astro";
---
<Notif level={1} xstyle="sm:block md:hidden">
<p>This viewport may be too small.</p>
<Notif level={1} xstyle="sm:block md:hidden" heading="This viewport may be too small.">
<p>Try ivy.rs on a bigger screen.</p>
</Notif>

View file

@ -11,6 +11,7 @@ const blog = defineCollection({
date: z.date().default(new Date()),
tags: z.array(z.string()),
draft: z.boolean().default(false),
featured: z.boolean().default(false),
icon: z.string().optional().default("fa-solid fa-star"),
image: z
.object({

View file

@ -1 +1 @@
lol, nothing here yet. [ping me about it](mailto:ivy@sorbet.gay)
Hi, I'm Ivy.

View file

@ -1,5 +1,5 @@
I'm a musician, student, part-time software developer and writer.
I like creating websites (like this one) with [Astro](https://astro.build), and going outside whenever I'm not doing either of those things.
I go by **ivyrs**, **ivyneedsrest** or previously `lakerjv, lxjv, losangeles` etc.
I'm currently studying music and performing in a band :3

View file

@ -6,4 +6,26 @@ okay more specific this time:
- Color scheme: [Flexoki](https://stephango.com/flexoki) (it's very pretty)
- Deployment: [fly.io](https://fly.io) (likely to be self-hosted as soon as i get GitHub Actions working)
You can find the source code for this site at [ivyturner/trellis](https://github.com/ivyturner/trellis)
You can find the source code for this site at [ivyturner/ivy.rs](https://github.com/ivyturner/ivy.rs)
### Design
ivy.rs is styled with [Tailwind CSS](https://tailwindcss.com), because I like how quick it is to make CSS do what I want.
The colorscheme in use is [Flexoki](https://stephango.com/flexoki), because It's Extremely Pretty.
The font is Inter, currently served by [Googl]
### the domains, [ivy], what do they MEAN?
i chose ivy.rs for three reasons
- short, easy to say
- i like the rust programming language, even if i am terrible at it
- my name is IVY RoSe
laker.tech is my old personal site domain and redirects here for posterity / so i don't have to update it.
ivy.rs is bought through [istanco.net](https://istanco.net) as Porkbun doesnt support .rs domains (yet?)
All of my other domains are bought through [Porkbun](https://porkbun.com).
DNS is hosted by [deSEC.io](https://desec.io) and controlled by [DNSControl](https://dnscontrol.org)

60
src/data/caddy.json Normal file
View file

@ -0,0 +1,60 @@
{
"redirects": { "/now": "/me/now" },
"blockedCrawlers": [
"AI2Bot",
"Ai2Bot-Dolma",
"aiHitBot",
"Amazonbot",
"anthropic-ai",
"Applebot",
"Applebot-Extended",
"Brightbot 1.0",
"Bytespider",
"CCBot",
"ChatGPT-User",
"Claude-Web",
"ClaudeBot",
"cohere-ai",
"cohere-training-data-crawler",
"Cotoyogi",
"Crawlspace",
"Diffbot",
"DuckAssistBot",
"FacebookBot",
"Factset_spyderbot",
"FirecrawlAgent",
"FriendlyCrawler",
"Google-Extended",
"GoogleOther",
"GoogleOther-Image",
"GoogleOther-Video",
"GPTBot",
"iaskspider/2.0",
"ICC-Crawler",
"ImagesiftBot",
"img2dataset",
"imgproxy",
"ISSCyberRiskCrawler",
"Kangaroo Bot",
"Meta-ExternalAgent",
"Meta-ExternalFetcher",
"NovaAct",
"OAI-SearchBot",
"omgili",
"omgilibot",
"Operator",
"PanguBot",
"Perplexity-User",
"PerplexityBot",
"PetalBot",
"Scrapy",
"SemrushBot-OCOB",
"SemrushBot-SWA",
"Sidetrade indexer bot",
"TikTokSpider",
"Timpibot",
"VelenPublicWebCrawler",
"Webzio-Extended",
"YouBot"
]
}

View file

@ -9,18 +9,11 @@ import Notif from "~/components/ui/Notif.astro";
const { title, date, description } = Astro.props;
---
<html class="font-inter bg-light-bg text-light-tx dark:bg-dark-bg dark:text-dark-tx">
<html class="font-sans bg-light-bg text-light-tx dark:bg-dark-bg dark:text-dark-tx">
<Head title={title} date={date} description={description} />
<body class="pl-1 md:px-24 sm:pt-2 md:pt-6">
<ClientRouter />
<SizeWarning />
{
() => {
if (!isProd()) {
return <Notif level={1} xstyle="w-fit p-2 mb-2">dev mode, hang tight</Notif>;
}
}
}
<slot />
</body>
</html>

View file

@ -3,6 +3,16 @@ import Layout from "~/layouts/Base.astro";
import Header from "~/components/ui/Header.astro";
import Strapline from "~/components/ui/Strapline.astro";
import Footer from "~/components/ui/Footer.astro";
interface Props {
title: string,
description: string,
icon?: string,
date?: Date,
back?: string,
backLabel?: string
}
const { title, description, icon, date, back, backLabel } = Astro.props;
---

View file

@ -10,12 +10,12 @@ export async function GET(context) {
const blog = await getCollection('blog');
return rss({
// `<title>` field in output xml
title: conf.site.title,
title: `${conf.site.title} blog`,
// `<description>` field in output xml
description: conf.site.description,
// Pull in your project "site" from the endpoint context
// https://docs.astro.build/en/reference/api-reference/#site
site: context.site,
site: context.site + "/blog",
stylesheet: "/feed.xsl",
// Array of `<item>`s in output xml
// See "Generating items" section for examples using content collections and glob imports

View file

@ -4,13 +4,17 @@ import BlogPostList from "~/components/lists/BlogPostList.astro";
import StyledLink from "~/components/util/StyledLink.astro";
---
<Page
title="Blog"
description="writing"
icon="fa-solid fa-signature"
>
<Page title="Blog" description="writing" icon="fa-solid fa-signature">
<StyledLink href="/blog/tags">See all the tags</StyledLink>
<StyledLink href="/blog/feed.xml" icon="fa-solid fa-rss">Subscribe via RSS</StyledLink>
<StyledLink
href="/blog/feed.xml"
icon="fa-solid fa-rss"
>
Subscribe via RSS
</StyledLink>
<div class="mb-4"></div>
<h3>Featured</h3>
<BlogPostList featured={true} />
<div class="mb-4"></div>
<BlogPostList />
</Page>

View file

@ -14,5 +14,5 @@ import LatestNotes from "~/components/home/LatestNotes.astro";
<LatestBlogPosts />
<LatestNotes />
</div>
</Layout>
<Footer />
</Layout>

46
src/pages/landing.astro Normal file
View file

@ -0,0 +1,46 @@
---
import Navigation from "~/components/ui/Navigation.astro";
import Base from "~/layouts/Base.astro";
import siteConfig from "~/site.config";
import Prose from "~/components/ui/Prose.astro";
import Image from "astro/components/Image.astro";
import { Content as Bio } from "~/content/bio.md";
---
<Base>
<div class="flex items-center flex-col">
<div
class="border-4 border-light-pu dark:border-dark-pu w-fit p-4 rounded-br-3xl rounded-tl-3xl"
>
<div>
<h1 class="font-bold text-3xl text-center">{siteConfig.site.title}</h1>
<Navigation />
</div>
</div>
<div
class="mt-4 border-4 border-light-pu dark:border-dark-pu w-fit p-4 rounded-br-3xl rounded-tl-3xl"
>
<h1
class="text-2xl font-bold underline decoration-wavy underline-offset-8 decoration-3 decoration-light-pu dark:decoration-dark-pu mb-6"
>
Hi! I'm Ivy, welcome to my website!
</h1>
<Prose>
<Bio />
</Prose>
<div class="mt-2 flex gap-2"></div>
</div>
<div>
<Image
src={"https://cdn.laker.tech/images/tree.png"}
alt={"tree"}
width={200}
height={300}
/>
</div>
</div>
</Base>

View file

@ -5,14 +5,12 @@ import others from "~/data/others.json";
---
<Page
title="Other people and sites I like"
title="Other people and places on the internet that I like"
description="also some webrings, wow!"
icon="fa-solid fa-users"
>
<h3>Friends</h3>
{others.friends.map((item) => {
switch (item.b) {
{others.friends.map(() => {
}
})}
</Page>

View file

@ -0,0 +1,24 @@
---
import Page from "~/layouts/Page.astro";
---
<Page title="Subscribe" description="hit that bell gamers" icon="fa-solid fa-rss">
<ul class="fa-ul mb-2">
<li class="mb-1">
<i class="fa-li fa-solid fa-signature"></i>
<b>Blog</b>:
<a class="link" href="/blog/feed.xml">RSS</a>
</li>
<li>
<i class="fa-li fa-solid fa-sticky-note"></i>
<b>Notes</b>:
<a class="link" href="/notes/feed.xml">RSS</a>
</li>
</ul>
<p>
I also post most of the stuff here on <a
href="https://social.lol/@ivy"
class="link">Mastodon</a
> & <a href="https://bsky.app/profile/ivy.rs" class="link">Bluesky</a>.
</p>
</Page>

View file

@ -34,9 +34,9 @@ function stripHtmlAndAddFootnotes(html) {
export async function GET(context) {
const blog = await getCollection('notes');
return rss({
title: conf.site.title,
title: `${conf.site.title} notes`,
description: conf.site.description,
site: context.site,
site: context.site + "notes",
// stylesheet: "/feed.xsl",
items: blog.map((post) => {
const contentWithFootnotes = stripHtmlAndAddFootnotes(parser.render(post.body));

View file

@ -1,8 +1,24 @@
@import url(https://fonts.bunny.net/css?family=ibm-plex-mono:400,700i|ibm-plex-sans:300,300i,400,400i,500,500i,700,700i);
@import "tailwindcss";
@plugin "@tailwindcss/typography";
@theme {
--font-mono: "IBM Plex Mono", monospace;
--font-sans: "IBM Plex Sans", ui-sans-serif,
system-ui,
sans-serif,
"Apple Color Emoji",
"Segoe UI Emoji",
"Segoe UI Symbol",
"Noto Color Emoji";
--font-mono: "IBM Plex Mono", ui-monospace,
SFMono-Regular,
Menlo,
Monaco,
Consolas,
"Liberation Mono",
"Courier New",
monospace;
/* Disable default colors to prevent their use; feel free to re-enable as needed. */
--color-amber-*: initial;
--color-lime-*: initial;
@ -204,6 +220,7 @@ hr {
@apply border-0 h-0.5 my-4 bg-light-pu dark:bg-dark-pu;
}
[aria-current="page"] { /* used for the header thing */
[aria-current="page"] {
/* used for the header thing */
@apply font-bold decoration-light-ma dark:decoration-dark-ma;
}

25
trellis.sh Executable file
View file

@ -0,0 +1,25 @@
#!/usr/bin/env bash
caddy_config="./src/data/caddy.json"
gen_redirects () {
caddyfile="redirects.caddyfile"
# clean before we append
rm -rf $caddyfile;
touch $caddyfile;
# Append the redirects
jq -r '.redirects | to_entries[] | "redir \(.key) \(.value)"' "$caddy_config" >> "$caddyfile";
}
gen_robots () {
caddyfile="robots.caddyfile"
rm -rf $caddyfile;
touch $caddyfile;
jq -r '.blockedCrawlers | to_entries | "respond \(.value) "Access Denied" 403';
}
gen_robots
gen_redirects