summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoe Carstairs <65492573+joeacarstairs@users.noreply.github.com>2024-05-05 21:00:40 +0100
committerGitHub <noreply@github.com>2024-05-05 21:00:40 +0100
commit86450b3dd8bec3b76e2b2a03b8cdc8a708c5f3bc (patch)
tree7576d8863193369adc87dd80d91a3d5d3f58ede1 /src
parent579e12cfebce9a70ab2adf5842e2673673a707d2 (diff)
Infrastructure as code (#3)
* Moves website to website/ * Adds terraform gitignores * Terraform with AWS provider * Initialises Terraform * Locals and variables for provider * Fetches SSL certificate from ACM * S3 static website bucket * CloudFront distribution * Route53 records * Deployment workflow uses secret S3 bucket suffix * Adds README --------- Co-authored-by: Joe Carstairs <65492573+Sycamost@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r--src/components/BaseHead.astro44
-rw-r--r--src/components/BlogFeed.astro76
-rw-r--r--src/components/FormattedDate.astro21
-rw-r--r--src/components/Me.astro43
-rw-r--r--src/consts.ts2
-rw-r--r--src/content/blog/2024/01/14/sapiens_on_religion.md77
-rw-r--r--src/content/blog/2024/01/29/euhwc_toast_to_the_lasses_2024.md261
-rw-r--r--src/content/blog/2024/03/30/easter.md98
-rw-r--r--src/content/blog/2024/04/10/tracking_pixels.md35
-rw-r--r--src/content/config.ts19
-rw-r--r--src/env.d.ts2
-rw-r--r--src/layouts/BlogPost.astro50
-rw-r--r--src/layouts/Page.astro17
-rw-r--r--src/pages/blog/[...slug].astro20
-rw-r--r--src/pages/blog/index.astro17
-rw-r--r--src/pages/error.astro14
-rw-r--r--src/pages/index.astro11
-rw-r--r--src/pages/rss.xml.js17
18 files changed, 0 insertions, 824 deletions
diff --git a/src/components/BaseHead.astro b/src/components/BaseHead.astro
deleted file mode 100644
index e8e44ab..0000000
--- a/src/components/BaseHead.astro
+++ /dev/null
@@ -1,44 +0,0 @@
----
-interface Props {
- title: string;
- description: string;
- image?: string;
-}
-
-const canonicalURL = new URL(Astro.url.pathname, Astro.site);
-
-const { title, description, image = '/images/headshot.jpg' } = Astro.props;
----
-
-<!-- Stylesheets -->
-<link rel="stylesheet" href="/css/reset.css" />
-<link rel="stylesheet" href="/css/base.css" />
-<link rel="stylesheet" href="/css/hcard.css" />
-
-<!-- Global Metadata -->
-<meta charset="utf-8" />
-<meta name="viewport" content="width=device-width,initial-scale=1" />
-<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
-<meta name="generator" content={Astro.generator} />
-
-<!-- Canonical URL -->
-<link rel="canonical" href={canonicalURL} />
-
-<!-- Primary Meta Tags -->
-<title>{title}</title>
-<meta name="title" content={title} />
-<meta name="description" content={description} />
-
-<!-- Open Graph / Facebook -->
-<meta property="og:type" content="website" />
-<meta property="og:url" content={Astro.url} />
-<meta property="og:title" content={title} />
-<meta property="og:description" content={description} />
-<meta property="og:image" content={new URL(image, Astro.url)} />
-
-<!-- Twitter -->
-<meta property="twitter:card" content="summary_large_image" />
-<meta property="twitter:url" content={Astro.url} />
-<meta property="twitter:title" content={title} />
-<meta property="twitter:description" content={description} />
-<meta property="twitter:image" content={new URL(image, Astro.url)} />
diff --git a/src/components/BlogFeed.astro b/src/components/BlogFeed.astro
deleted file mode 100644
index b6f9d55..0000000
--- a/src/components/BlogFeed.astro
+++ /dev/null
@@ -1,76 +0,0 @@
----
-import type { CollectionEntry } from 'astro:content';
-import { getCollection } from 'astro:content';
-
-export interface Props {
- headingLevel?: 1 | 2 | 3 | 4 | 5 | 6,
- hideAuthor?: boolean,
-};
-
-const { headingLevel = 2, hideAuthor = false } = Astro.props;
-
-const posts = (await getCollection('blog'));
-
-const distinctYears: number[] = posts
- .map(post => post.data.pubDate.year)
- .reduce<number[]>((acc, curr) => acc.includes(curr) ? acc : [...acc, curr], [])
- .sort((a, b) => b - a);
-
-function matchesYear(year: number) {
- return (post: CollectionEntry<'blog'>) => post.data.pubDate.year === year;
-}
-
-function sortByPubDateDescending(post1: CollectionEntry<'blog'>, post2: CollectionEntry<'blog'>) {
- const year1 = post1.data.pubDate.year;
- const year2 = post2.data.pubDate.year;
- const month1 = post1.data.pubDate.month;
- const month2 = post2.data.pubDate.month;
- const day1 = post1.data.pubDate.day;
- const day2 = post2.data.pubDate.day;
-
- if (year1 !== year2) {
- return year2 - year1;
- } else if (month1 !== month2) {
- return month2 - month1;
- } else {
- return day2 - day1;
- }
-}
-
-const headingElem = `h${headingLevel}`;
-
-const canonicalBlogUrl = new URL('blog', Astro.site)
----
-
-<section class="h-feed">
- <Fragment set:html={`
- <${headingElem} class="p-name">
- My blog
- </${headingElem}>
- `} />
-
- <aside>
- <p class={hideAuthor ? 'hidden' : ''}>
- This blog is written by <a class="p-author h-card" href="/">Joe Carstairs</a>
- </p>
-
- <p>
- <a class="u-url" href={canonicalBlogUrl}>Permalink</a>
- </p>
- </aside>
-
- <ul>
- { distinctYears.map(year => (
- <li>
- {year}
- <ul>
- { posts.filter(matchesYear(year)).sort(sortByPubDateDescending).map(post => (
- <li class="h-entry">
- <a class="u-url p-name" href={`/blog/${post.slug}`}>{post.data.title}</a>
- </li>
- )) }
- </ul>
- </li>
- )) }
- </ul>
-</section> \ No newline at end of file
diff --git a/src/components/FormattedDate.astro b/src/components/FormattedDate.astro
deleted file mode 100644
index bb7a2c0..0000000
--- a/src/components/FormattedDate.astro
+++ /dev/null
@@ -1,21 +0,0 @@
----
-interface Props {
- className?: string;
- date: Date | string;
-}
-
-let { className, date } = Astro.props;
-if (typeof(date) === 'string') {
- date = new Date(date);
-}
----
-
-<time datetime={date.toISOString()} class={className ?? ''}>
- {
- date.toLocaleDateString('en-GB', {
- year: 'numeric',
- month: 'long',
- day: 'numeric',
- })
- }
-</time>
diff --git a/src/components/Me.astro b/src/components/Me.astro
deleted file mode 100644
index c9af587..0000000
--- a/src/components/Me.astro
+++ /dev/null
@@ -1,43 +0,0 @@
----
----
-
-<section class="h-card">
- <img class="u-photo" src="/images/headshot.jpg" height="256" width="256" />
-
- <div>
- <h1>
- <a class="p-name u-url u-uid" href="https://joeac.net" rel="me">
- Joe Carstairs
- </a>
- </h1>
-
- <p>
- Hi! 👋 My name is <span class="p-given-name">Joe</span>
- <span class="p-family-name">Carstairs</span>. I’m a
- <span class="p-job-title">software developer</span> at
- <a class="p-org" href="https://www.scottlogic.com">Scott Logic</a>, a
- graduate of Philosophy and Mathematics at the University of Edinburgh,
- a committed Christian and a pretty rubbish poet.
- </p>
-
- <p>
- I’m also the <span class="p-job-title">secretary</span> of the
- <a class="p-org" href="https://scotsleidassocie.org">Scots Language Society</a>.
- <a href="https://github.com/joeacarstairs/lallans-wabsteid-astro">Help me maintain our website!</a>
- </p>
-
- <p>
- Email me at
- <a class="u-email" href="mailto:joeacarstairs@gmail.com">joeacarstairs@gmail.com</a>
- with your thoughts on metaethics, Scots verse and eschatology.
- </p>
-
- <p>
- Or get me on
- <a href="https://www.facebook.com/joe.carstairs.5" rel="me">Facebook</a>,
- <a href="https://mastodon.social/@joe_carstairs" rel="me">Mastodon</a>,
- <a href="https://www.linkedin.com/in/joe-carstairs-0aa936277" rel="me">LinkedIn</a>,
- or <a href="https://github.com/joeacarstairs" rel="me">GitHub</a>.
- </p>
- </div>
-</section> \ No newline at end of file
diff --git a/src/consts.ts b/src/consts.ts
deleted file mode 100644
index 461043d..0000000
--- a/src/consts.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export const SITE_TITLE = 'Joe Carstairs';
-export const SITE_DESCRIPTION = 'Joe’s personal website.'; \ No newline at end of file
diff --git a/src/content/blog/2024/01/14/sapiens_on_religion.md b/src/content/blog/2024/01/14/sapiens_on_religion.md
deleted file mode 100644
index b484557..0000000
--- a/src/content/blog/2024/01/14/sapiens_on_religion.md
+++ /dev/null
@@ -1,77 +0,0 @@
----
-title: Harari’s Sapiens on Religion
-description: >-
- In which I discuss why I think Harari’s characterisation of religion
- is inadequate because it’s too materialistic.
-pubDate:
- year: 2024
- month: 01
- day: 14
----
-
-I’ve been slowly re-reading Yuval Noah Harari’s 2014 classic,
-<a href="https://www.ynharari.com/book/sapiens-2">Sapiens</a>,
-which apart from being ridiculously over-scoped and hilariously
-under-evidenced, is proving delightfully entertaining.
-
-I’ve just finished chapter 12, covering the world history of all
-religion in thirty pages. Of course, at that level of brevity,
-there will be many deficiencies. But here’s some thoughts - not
-terribly well organised - which stand out to me.
-
-Hurari generally assumes a materialist metaphysic (a problem which
-blights the book more generally). Nothing exists except physical stuff.
-This gives him severe tunnel vision. As a consequence of this
-restricting metaphysic, he is forced to adopt limiting accounts of what
-the role of religion is in world history, and therefore what religion is.
-
-> The crucial historical role of religion has been to give superhuman
-> legitimacy to [all social orders and hierarchies].
-> Religion can thus be defined as <em>a system of human norms and
-> values that is founded on a belief in a superhuman order</em>.
-> <footer>p. 234</footer>
-
-It might seem a little unfair to criticise Harari for giving a
-materialist account of religion. <i>Sapiens</i> is, after all, a
-materialist world history.
-
-But this account is just one extreme example of how that project, to
-give a materialist account of world history, will inevitably lack the
-metaphysical resources to really understand the human story.
-
-On Harari’s view, any human enterprise which attempts to understand
-that which transcends direct human experience is at best an effort in
-imaginative story-telling. All scientific theory, theology, ethics and
-metaphysics either contorted out of all recognition into a pragmatic
-fiction or is cast to the flames.
-
-In particular, it’s a view which is incapable of taking seriously some
-of the most important questions human beings have grappled with in the
-course of their history. Those who know me won’t be surprised at which
-ones I’m going to pick out: who was the being which made their covenant
-with Abraham? How is that promise being fulfilled? And who the heck was
-Jesus of Nazareth?
-
-If Harari’s characterisation of religion is adequate - and the Abrahamic
-faiths come under that banner - then those questions are reduced to
-nothing more profound than Doctor Who fans arguing over ‘canon’. The
-question of who God is becomes a mere tool for the organisation of
-society, rather than a substantial and important question on a matter
-of fact.
-
-This is a shortcoming for its own sake: a materialist account of
-religion cannot adequately account for the phenomenon of religion
-itself.
-
-But it is also a shortcoming even by its own lights. Without giving
-serious consideration to the substantial matter of what Harari calls
-‘religion’ (which, to his mind, includes the Abrahamic faiths,
-Hinduism, paganism, animism, Buddhism, Shintoism, Confucianism,
-capitalism, communism and Nazism), even the material facts are
-inexplicable. Why would, as Harari is keen to point out, out, people
-fight and die over and over again for a fiction?
-
-The material facts themselves prove that ‘religion’ as he construes it
-is not window dressing to the real story of history. It cannot merely
-serve as a mechanism in the churning of material history. It is itself
-the centre of the story.
diff --git a/src/content/blog/2024/01/29/euhwc_toast_to_the_lasses_2024.md b/src/content/blog/2024/01/29/euhwc_toast_to_the_lasses_2024.md
deleted file mode 100644
index 8641a5d..0000000
--- a/src/content/blog/2024/01/29/euhwc_toast_to_the_lasses_2024.md
+++ /dev/null
@@ -1,261 +0,0 @@
----
-title: EUHWC Toast to the Lassies 2024
-description: >-
- At the <a href="https://www.euhwc.co.uk">EUHWC</a> Burns meet in
- Ullapool last weekend, I had the last privilege of giving the Toast to
- the Lassies. Particularly for the benefit of those who weren’t there,
- here it is in full!
-pubDate:
- year: 2024
- month: 01
- day: 29
----
-
-Had Burns, instead of his sweet bonnie Jean,<br>
-his skills poetical for to mature<br>
-had any one of our club’s lassies seen<br>
-he would forever have remained obscure.<br>
-If he had nothing but this box of worms<br>
-Scotia would have been poorer, that I’m sure.<br>
-Now none of us can claim to be a Burns,<br>
-I’m no poetic master, still, I’ll have a punt,<br>
-though let’s be clear, I’ll do it on my terms.<br>
-I’ve everywhere avoided being blunt -<br>
-politeness matters more than any schema -<br>
-but it is hard when Isla’s such a cunt.<br>
-It was a challenge to produce a terza rima<br>
-I could recite withouten snoring;<br>
-you’ve been so stiff I thought youse had oedema.<br>
-The bother is this year is you’ll all been boring:<br>
-no drugs, no sex, no gossiping or lies,<br>
-no rock and roll, and hardly any whoring.<br>
-But hey well, rules is rules, I’ve had to try!<br>
-At least it can’t be worse than the reply.<br>
-
-I’ll start with Audrey, the club’s senior member,<br>
-for if there’s something that I say which disconcerts her,<br>
-it’s fine: the poor old girl, she won’t remember.<br>
-She likes to let us think she’s a hard worker<br>
-but we’re electing a third social sec…<br>
-it’s pretty clear she’s just another shirker.<br>
-This lady, half American, half Czech,<br>
-for study, moved to Scotland for to do<br>
-American history – really, what the heck?<br>
-The club is so much louder thanks to you:<br>
-impressive vocals for just five foot two.<br>
-
-That woman, Willow, reggles is bespeckled<br>
-with her sickle and her fishing tackle<br>
-shackled by the shins while she is heckled;<br>
-the way that Willow waddles maks me cackle<br>
-like a speckled jackal getting tickles,<br>
-worth a shekel in the tabernacle;<br>
-I chuckle muckle at her love of pickles<br>
-which she wiggles when she has the heart<br>
-while work for the Committee’s fickle trickles.<br>
-Her modus operandi: <em>you can’t rush art.</em><br>
-Her reimbursements programme’s going great;<br>
-any day now, she’ll maybe even start.<br>
-She cannot walk without Audrey, her mate:<br>
-I wonder when they’re going to consummate.<br>
-
-Although they make them pretty tough in Peebles,<br>
-the thought of actually going up a peak<br>
-fills Shona Lewis with the heeble-jeebles.<br>
-New car? We miss your beautiful antique!<br>
-How long before this one’s also up a creek?<br>
-
-Once there was a lass called Hannah Collier<br>
-whom even hell below regarded nasty,<br>
-deeply despised by all that dwells there.<br>
-Dating’s proceeding slowly for our lassie;<br>
-not far from giving up til she beguiles<br>
-a hot Italian in Southsider: classy!<br>
-At first, Michaelo seems to be all smiles<br>
-till it transpires he’s one of Dante’s demons…<br>
-I guess it’s back to posters of Harry Styles.<br>
-One day you’ll get a decent boy, keep dreamin;<br>
-somewhere there waits a handsome Mr Collier.<br>
-Hopefully when she meets him she’ll no be steamin.<br>
-Hannah, I’m not sure why you chose to maul your<br>
-poor skeleton at Subway (she’s still tetchy)<br>
-and then abandon what remains of all your<br>
-dignity at Ryvoan with a Frenchie!<br>
-I think he wishes that he never met ye.<br>
-
-And has a quiet Felicia e’er been seen?<br>
-The energy she has is frankly wild.<br>
-I’ve never seen a hillwalker so keen!<br>
-<i lang="de">Ssie ischt raschtlos und nie gelangweilt</i>.<br>
-She eats raw oats with soggy protein powder:<br>
-a camping pot has ne’er been worse defiled.<br>
-She uses what her Maker has endowed her<br>
-with: her recorder skills are off the charts;<br>
-youse think I’m joking, but I wouldn’t doubt her!<br>
-This lass of the land of the Rot-Gold-Schwarz<br>
-will soon depart, though long we might beseech ya<br>
-to stay. Of course, you’ll break all of our hearts,<br>
-but mine most of all. Any time, Felicia,<br>
-Creag Meagaidh calls, I know routes up the rear<br>
-dark and under-explored that I can teach you!<br>
-I won’t deny I think it’s rather queer<br>
-the things you do with chickpeas, but no matter.<br>
-You’re keen, you’re quick, you’re cool, that much is clear.<br>
-In fact, I think you’d make a damn good faffer:<br>
-swoop down on distilleries like the Luftwaffe.<br>
-
-And now we come to our girl Emily Topness!<br>
-You’re keen for social sec. You’d suit the role<br>
-because… I’m not quite sure, it’s embdy’s guess.<br>
-We met your sister, and she was just as dull.<br>
-No, please drone on about Icelandic soil!<br>
-Poor Joe here down the front’s bored out his skull.<br>
-And since I mentioned Joe – I hate to spoil<br>
-it for you – but you’ve got the inferior Joe,<br>
-by Jove, no joke, it’s Jock here’s got the style!<br>
-Nah, write the boy a sonnet, get in the flow,<br>
-Whatever you produce’ll beat by thrice<br>
-your Masters thesis. What’d you got to show<br>
-for months of hunting for the butterflies?<br>
-‘There weren’t any.’ Oh, and have some sense,<br>
-cos I’ve heard rumours – I assume they’re lies –<br>
-you’ve called yourself the ‘poet in residence.’<br>
-You know you can’t compete, drop the pretence.<br>
-
-Tereza was our gear sec for last year.<br>
-She helped herself to stuff: that’s factual.<br>
-Now when she asks to loan a bit club gear<br>
-we have to ask her to provide collateral.<br>
-She picked up tin whistle pretty sharp!<br>
-Which is to say, she’s not a natural.<br>
-She’s nowhere happier than under tarp<br>
-gazing up at the moon and stars alone<br>
-somewhere distant and remote like Glen Tarff.<br>
-Now what to say about Lucy Ma-the-soooon....<br>
-she likes… to faff… mm hmmm… well, moving on!<br>
-
-And now we come to Emilie the French.<br>
-She seems to be nice on the trips we see her<br>
-but my distrust of frogs will ne’er be quenched.<br>
-Claims she’s a ‘pharmacist’? So she’s a dealer.<br>
-Need some pills in a pinch? You call, she’s there<br>
-at your door in her rally-approved four-wheeler.<br>
-One question we have is, why are you here?<br>
-Most folk are in uni, you’ve no refutin<br>
-you were kicked out after second year!<br>
-Now the Engineering grad, Sophia Newton.<br>
-Your namesake, Isaac, was a man convicted,<br>
-constructed calculus; but no computin,<br>
-not even Isaac’s, could’ve e’er predicted<br>
-you’d drop the Eng for creative writing!<br>
-now that’s what I would call a self-inflicted<br>
-inflection point! It must be quite enlightening,<br>
-but that doesn’t excuse when you give us an earful.<br>
-The blood boils in our veins, the rage heightening,<br>
-and you’re an American, that makes me fearful.<br>
-What’s your secret? You have us knackered!<br>
-What are you on to always be so cheerful?<br>
-Now we approach the topic of Merzbacher.<br>
-Wait, she’s not here? Abandoned ship?<br>
-She says she’s informatics: so she’s a hacker?<br>
-She has strong views, she lets her anger rip.<br>
-Poor George got an earful, full of future advice,<br>
-but why hasn’t she been on another club trip?<br>
-We’re cruel to focus on this list of vice;<br>
-the fact remains: she’s headstrong and nice.<br>
-
-On Skye, a lady gave her poles to Sasha,<br>
-which was really nice - I mean just the best -<br>
-but Sasha really didn’t have to flash her.<br>
-Quick history lesson: way back, RBS<br>
-led the banking system to self-destruct<br>
-and left taxpayers to pick up the mess.<br>
-Since then, the name’s so irredeemably fucked<br>
-they’ve had to ditch the brand once and for all.<br>
-There’s one lassie who I need not instruct<br>
-What, these days, the Royal Bank is called<br>
-cos NatWest’s nasty history of scandal<br>
-didn’t stop Booth from working there at all.<br>
-Nothing motivates her more than to trample<br>
-upon the working class. They set her free.<br>
-She sank the pound quicker than the Belgrano,<br>
-because ‘there is no such thing as society,’<br>
-that’s how it is, is it? All right, I see.<br>
-
-Now, coming all the way from Glenmore Lodge,<br>
-it’s Ellie’s turn! We have done what we can,<br>
-although I’m scared what she’ll put in my squash.<br>
-She wasn’t into Benji, but listen man,<br>
-you’re lucky that you dodged her drunken benders.<br>
-You’ll wake up in a tent in Kyrgystan,<br>
-as for how you got there, no-one remembers,<br>
-and if you’d known you’d be sleeping next to Ellie,<br>
-you would’ve brought some fucking ear defenders.<br>
-She’ll wrap you in bubblewrap, from your ears to your belly,<br>
-cotton clothes for none, and no complaining,<br>
-applying safety to the max, spare socks in your wellies.<br>
-She’s always at her Mountain Leader training,<br>
-practicing her night nav in the locale,<br>
-pursuing QMDs - unless it’s raining.<br>
-But some water should not scare our gal!<br>
-She’s had much experience with the wet as of late:<br>
-after all, she got on well with our navy pal.<br>
-What was the age of that particular first mate?<br>
-Older than your ex - always part of the plan?<br>
-Ah, of course! He was a spry twenty-eight!<br>
-Youth’s for the losers, let’s get you a real man,<br>
-mature and rugged, but kind and astute?<br>
-Just make sure he’s not as old as your gran.<br>
-One request we all have is you ditch the uke:<br>
-never have strings been pluckèd quite so shitely;<br>
-we would all much rather be hit by a nuke.<br>
-And please shut up about your nice society.<br>
-We are all glad you had a fun summer,<br>
-but bringing it up throws us right back to sobriety.<br>
-To lose you of course would be a bummer:<br>
-that is, for your carefully groomed newcomers.<br>
-
-Now time for the main woman, El Presidente!<br>
-To here, it’s been like getting stones to bleed,<br>
-but in Isla Burslem’s case we’ve material aplenty!<br>
-As Holy Scripture says, ‘let those who lead<br>
-well be worthy of double honour,’ so<br>
-your bit is double length – it’s quite the screed!<br>
-I’ll start off with her brilliant boyfriend – oh!<br>
-Not boyfriend! Friend? To me this rather smacks<br>
-of low commitment, but what do I know?<br>
-So far, he’s disappointing, but on track.<br>
-What’s he up to Isla: seven minutes? neat!<br>
-Despite that, he is never holding back<br>
-your blossoming romance with Dr Peat.<br>
-Don’t deny it, that launch was pretty hard!<br>
-It’s fifth base next: that’s photos of his feet.<br>
-It’s fair to say her reputation’s marred.<br>
-We all regret that we did once anoint<br>
-her President: her premiership’s ill-starred.<br>
-Hey - you’re meant to be in charge of this joint!<br>
-You’re seldom seen cos of the mountaineering<br>
-meets that you’re always on. You’d made your point<br>
-before you chose to go off disappearing<br>
-to <em>New Zealand</em>… we get the message! Plus<br>
-we’ve had enough of all your domineering:<br>
-maybe it’s time we put you on a bus!<br>
-Nah, I’m just joking. All I’ve said’s refutable.<br>
-But the boys, we mean this next bit, all of us,<br>
-so stop me Isla if this isn’t suitable<br>
-but honestly we think your mum is beautiful.<br>
-
-Alas, I have to bring an end to this rhyme.<br>
-I know it wasn’t much, in our defence,<br>
-the fact you used ChatGPT’s a crime.<br>
-I hope I’ve not caused over much offence<br>
-don’t worry, that is it, I’ve said my bit,<br>
-so I’ll turn from the ladies to the gents.<br>
-Yeah, don’t look away now, we wrote this shit!<br>
-I see you looking at your laces, Chris!<br>
-Wit without real goodwill is not legit,<br>
-so boys, don’t send sincerity to piss!<br>
-Why did God say he’d take our hearts of stone<br>
-and give us hearts of flesh? For this, for this!<br>
-Here is flesh of our flesh, bone of our bone;<br>
-love, and love nothing more but God alone.<br>
diff --git a/src/content/blog/2024/03/30/easter.md b/src/content/blog/2024/03/30/easter.md
deleted file mode 100644
index 9735220..0000000
--- a/src/content/blog/2024/03/30/easter.md
+++ /dev/null
@@ -1,98 +0,0 @@
----
-title: Why Easter is the best week of the year
-description: >-
- Based on a talk given to my colleagues at
- <a href="https://www.scottlogic.co.uk">Scott Logic</a> for Maundy
- Thursday, 2024.
-pubDate:
- year: 2024
- month: 03
- day: 30
----
-
-As you might have noticed, it is Easter this week! So I'd like to take five or
-five minutes of your time to share why I – and about two billion other humans
-going about the place just now – think Easter is the best week of the year. And
-it's got something to do with a special Christian ritual called Communion.
-
-Communion, at its heart, is about as simple a ritual as you can get. You get
-together with a bunch of other people. You share some bread, and you share some
-wine.
-
-And it’s because of this ritual that so many people regard Easter as the best
-week of the year. I want to explain to you why that is, and more than that, I
-want to convince you that Easter is the best week of the year for you, too!
-
-If you’ve passed by _The Hub_ at the top of Johnstone Terrace here in
-Edinburgh recently, you might have notice the banner which is draped over
-the railings just now – reading, ‘RITUALS THAT UNITE US.’
-
-Now, that might seem like an odd idea. But wouldn’t that be great, if we
-actually had a ritual which could unite us? Because the world could surely do
-with a bit more unity right now. The world seems so divided, and sometimes it
-seems like there’s no hope for real unity.
-
-We can see that in our politics. We’re divided about foreign policy, about
-taxation policy, about trade policy, about environmental policy.
-
-And the conflicts that we have in this country seem pretty trivial when we
-remember the conflicts that are playing out in other parts of the world right
-now. In Israel and Gaza. In Sudan. In Russia and Ukraine.
-
-And there’s plenty of conflict happening on the small scale, too. Often it’s the
-smallest-scale conflicts which hurt us the most deeply. Your landlord pushes you
-around. That friend you trusted like no-one else in the world lets you down. The
-partner or spouse you loved like no-one else in the world – you end up fighting.
-
-It’s possible that you’re going to be reading this right now with a heavy heart
-because of a broken relationship in their life. And doesn’t that hurt more than
-anything else we know?
-
-When the world is groaning so heavily under the weight of conflict, and some
-banner on _The Hub_ tells us a ritual can unite us, that seems so out of
-proportion to the scale of the problem, doesn’t it? What can a ritual do? A bit
-of old superstition? An excuse to divide people, maybe – what can a ritual do
-to unite us?
-
-Well, two thousand years ago, a man had a meal with his friends. Together, they
-shared a meal of bread and wine – which, in that time and place, was the most
-ordinary meal imaginable.
-
-And yet, in that most ordinary event imaginable, something was happening which
-was totally unimaginable. As this man, Jesus, shared the elements of this meal,
-he made some extraordinary statements about what he was doing: ‘take, eat, this
-is my body’ – ‘drink this, all of you; this is my blood of the new covenant.’
-(The word ‘covenant’ means a promise.)
-
-He told them he wasn’t just giving them bread and wine, he was giving his body
-and his blood, and a promise.
-
-Before Jesus ate another meal, he was flogged and nailed to a cross. His blood
-was spilt and his body broken, even to death.
-
-And yet, that wasn’t the end of the Easter story. Because three days later,
-mourners turned up at Jesus’ tomb to pay their respects, and found the tomb
-empty, the stone rolled away. Then they became the first of crowds of
-incredulous eyewitnesses to see Jesus, the same Jesus who was killed on a cross,
-alive.
-
-Some magic trick, right? But this matters a hell of a lot more than just some
-magic trick. Because Jesus became the first person in history to prove that you
-really can both have your cake and eat it. He gave his life, and lived! As a
-result, we can have his life and our own. We can join with Jesus through the
-ritual of Communion which he established, and thereby, through Jesus’ body, join
-together with everyone else who takes part in that ritual, as one body. Then we
-can start living our brand-new, full-fat, original-recipe life overflowing with
-generosity where we too can both give our life to others and enjoy it ourselves.
-Indeed, Jesus taught us and showed us that it’s precisely by giving our lives to
-others that we get to truly live ourselves.
-
-This is why, in spite of all the division which persists in the world today, two
-billion people regard this week as the best week of the year. Two billion
-people, from every nation on Earth, speaking thousands of languages, of every
-age and culture and gender and race, who defy the divisions of this world to
-insist on joining together as one body in Jesus.
-
-Because Jesus’ new covenant, his promise to all of us, is that in an apparently
-hopelessly divided world, there exists real hope for unity. And that’s why
-Easter is the best week of the year.
diff --git a/src/content/blog/2024/04/10/tracking_pixels.md b/src/content/blog/2024/04/10/tracking_pixels.md
deleted file mode 100644
index 15ccc55..0000000
--- a/src/content/blog/2024/04/10/tracking_pixels.md
+++ /dev/null
@@ -1,35 +0,0 @@
----
-title: Tracking pixels
-description: Concerning a notice in the privacy policy of an HR app
-pubDate:
- year: 2024
- month: 04
- day: 10
----
-
-I recently made the mistake of reading the privacy policy of the HR app my
-employer uses. Take this choice excerpt:
-
-> **Tracking Pixels**
->
-> We may place tracking pixels in our Applicant Tracking System (ATS). These
-> pixels are used for analytics purposes, including to track statistical
-> information around when an email sent to you is opened.
-
-Translation:
-
-> We reserve the right to know whether you have read our emails, how long you
-> spent reading them, at what time and in what physical location you read them,
-> and any other information we can get our hands on. We reserve the right to do
-> this as soon as you open an email, without asking for your permission first,
-> and ask for your forgiveness later. That is, if you ever find out: which you
-> won't, because we also reserve the right to hide this information in a Privacy
-> Policy which we know you won't read, and we design our data-harvesting monster
-> to be completely undetectable to anyone except determined experts, on purpose.
-> We reserve the right to leave this data lying unused in a data warehouse where
-> someone might steal it, and we also reserve the right to use it, if we can
-> think of something satisfactorily dastardly to do with it. On the bright side,
-> we probably won't, so having your data leaked to hackers and fraudsters is
-> probably the worst you have to worry about. Unless we sell your data to
-> advertisers, or a ~black hole of stolen data~ Large Language Model. Oh yeah,
-> we probably reserve the right to do that, too. We doubt anyone will ever check.
diff --git a/src/content/config.ts b/src/content/config.ts
deleted file mode 100644
index 58dbc00..0000000
--- a/src/content/config.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineCollection, z } from 'astro:content';
-
-const dateSchema = z.object({
- year: z.number(),
- month: z.number(),
- day: z.number(),
-});
-
-const blog = defineCollection({
- type: 'content',
- schema: z.object({
- title: z.string(),
- description: z.string(),
- pubDate: dateSchema,
- updatedDate: z.optional(dateSchema),
- }),
-});
-
-export const collections = { blog };
diff --git a/src/env.d.ts b/src/env.d.ts
deleted file mode 100644
index acef35f..0000000
--- a/src/env.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-/// <reference path="../.astro/types.d.ts" />
-/// <reference types="astro/client" />
diff --git a/src/layouts/BlogPost.astro b/src/layouts/BlogPost.astro
deleted file mode 100644
index b709356..0000000
--- a/src/layouts/BlogPost.astro
+++ /dev/null
@@ -1,50 +0,0 @@
----
-import type { CollectionEntry } from 'astro:content';
-import BaseHead from '../components/BaseHead.astro';
-import FormattedDate from '../components/FormattedDate.astro';
-
-type Props = CollectionEntry<'blog'>['data'];
-
-const { title, description, pubDate, updatedDate } = Astro.props;
-
-const canonicalUrl = new URL(Astro.url.pathname, Astro.site);
-
-const pubDateStr = `${pubDate.year}-${pubDate.month}-${pubDate.day}`;
-const updatedDateStr = updatedDate ?
- `${updatedDate.year}-${updatedDate.month}-${updatedDate.day}`
- : pubDateStr;
----
-
-<html lang="en">
- <head>
- <BaseHead title={`${title} | joeac’s blog`} description={description} />
- <link rel="stylesheet" href="/css/blog.css">
- </head>
-
- <body>
- <article class="h-entry">
- <aside>
- <span>
- This is a blog post by
- <a class="p-author h-card h-card--minimal" href="/">Joe Carstairs</a>.
- </span>
- { updatedDate
- ? (
- <span>Updated: <FormattedDate date={updatedDateStr} className="dt-updated"/>.</span>
- <span>Originally published: <FormattedDate date={pubDateStr} className="dt-published"/>.</span>
- ) : <span>Published: <FormattedDate date={pubDateStr} className="dt-published"/>.</span>
- }
- <span>Go back to his <a href="/blog">blog</a> if you like.</span>
- <span><a class="u-url uid" href={canonicalUrl}>Permalink</a></span>
- </aside>
-
- <h1 class="h-name">{title}</h1>
-
- <p class="p-summary" set:html={description} />
-
- <div class="e-content">
- <slot />
- </div>
- </article>
- </body>
-</html>
diff --git a/src/layouts/Page.astro b/src/layouts/Page.astro
deleted file mode 100644
index 4e5f3bb..0000000
--- a/src/layouts/Page.astro
+++ /dev/null
@@ -1,17 +0,0 @@
----
-import BaseHead from "../components/BaseHead.astro";
-
-const { title, description } = Astro.props;
----
-
-<!DOCTYPE html>
-<html lang="en-GB">
- <head>
- <BaseHead title={title} description={description} />
- </head>
-
- <body>
- <slot />
- </body>
-</html>
-
diff --git a/src/pages/blog/[...slug].astro b/src/pages/blog/[...slug].astro
deleted file mode 100644
index 800c534..0000000
--- a/src/pages/blog/[...slug].astro
+++ /dev/null
@@ -1,20 +0,0 @@
----
-import { type CollectionEntry, getCollection } from 'astro:content';
-import BlogPost from '../../layouts/BlogPost.astro';
-
-export async function getStaticPaths() {
- const posts = await getCollection('blog');
- return posts.map((post) => ({
- params: { slug: post.slug },
- props: post,
- }));
-}
-type Props = CollectionEntry<'blog'>;
-
-const post = Astro.props;
-const { Content } = await post.render();
----
-
-<BlogPost {...post.data}>
- <Content />
-</BlogPost> \ No newline at end of file
diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro
deleted file mode 100644
index 0c617bd..0000000
--- a/src/pages/blog/index.astro
+++ /dev/null
@@ -1,17 +0,0 @@
----
-import BaseHead from '../../components/BaseHead.astro';
-import { SITE_TITLE, SITE_DESCRIPTION } from '../../consts';
-import BlogFeed from '../../components/BlogFeed.astro';
----
-
-<!doctype html>
-<html lang="en">
- <head>
- <BaseHead title={SITE_TITLE} description={SITE_DESCRIPTION} />
- </head>
- <body>
- <main>
- <BlogFeed headingLevel={1} />
- </main>
- </body>
-</html>
diff --git a/src/pages/error.astro b/src/pages/error.astro
deleted file mode 100644
index fc84122..0000000
--- a/src/pages/error.astro
+++ /dev/null
@@ -1,14 +0,0 @@
----
-import Page from '../layouts/Page.astro';
----
-
-<Page title="Got lost?" description="Error page for Joe's personal website">
- <main>
- <h1>Got lost?</h1>
-
- <p>
- If you’re on this page, something’s probably gone wrong. Try going to
- my <a href="/">homepage</a> instead.
- </p>
- </main>
-</Page>
diff --git a/src/pages/index.astro b/src/pages/index.astro
deleted file mode 100644
index 74cf934..0000000
--- a/src/pages/index.astro
+++ /dev/null
@@ -1,11 +0,0 @@
----
-import BlogFeed from '../components/BlogFeed.astro';
-import Me from '../components/Me.astro';
-import { SITE_TITLE, SITE_DESCRIPTION } from '../consts';
-import Page from '../layouts/Page.astro';
----
-
-<Page title={SITE_TITLE} description={SITE_DESCRIPTION}>
- <Me />
- <BlogFeed hideAuthor />
-</Page> \ No newline at end of file
diff --git a/src/pages/rss.xml.js b/src/pages/rss.xml.js
deleted file mode 100644
index 79da596..0000000
--- a/src/pages/rss.xml.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import rss from '@astrojs/rss';
-import { getCollection } from 'astro:content';
-import { SITE_TITLE, SITE_DESCRIPTION } from '../consts';
-
-export async function GET(context) {
- const posts = await getCollection('blog');
- return rss({
- title: SITE_TITLE,
- description: SITE_DESCRIPTION,
- site: context.site,
- items: posts.map((post) => ({
- ...post.data,
- link: `/blog/${post.slug}/`,
- pubDate: new Date(post.data.pubDate.year, post.data.pubDate.month - 1, post.data.pubDate.day),
- })),
- });
-}