57 | 58 | 89 |
{contents}126 | {/if} 127 | ``` 128 | 129 | The code for this app is [available on GitHub](https://github.com/ghostdevv/tauri-file-reader) if you want to check it out. 130 | 131 | # Building 132 | 133 | You can build your app as a [Windows Installer](https://tauri.app/v1/guides/building/windows), [MacOS Bundle](https://tauri.app/v1/guides/building/macos), [Debian Package](https://tauri.app/v1/guides/building/debian), or an [App Image](https://tauri.app/v1/guides/distribution/linux#appimage). All the build decisions are managed through your `tauri.conf.json`, so you don't have to use an external tool or mess around with cli flags. 134 | 135 | Tauri doesn't fully support [cross-platform compliation](https://tauri.app/v1/guides/building/cross-platform) (i.e. building for Windows on Linux). The recommended workflow is to use [CI/CD such as GitHub actions](https://tauri.app/v1/guides/building/cross-platform#tauri-github-action). 136 | 137 | Building your Tauri app is as simple as `npm run tauri build`! 138 | 139 | # Conclusion 140 | 141 | Tauri is great for building cross platform applications. It's light weight, comes with all kinds of APIs and features for powering your app, and supports using web technology, making it super easy to use. If you want to get started, check out [the official guides](https://tauri.app/v1/guides/), and for support you can [join the Tauri Discord](https://discord.com/invite/tauri), or [my Discord The Dev Lounge](https://discord.gg/2Vd4wAjJnm). 142 | -------------------------------------------------------------------------------- /src/content/blog/creating-a-rss-feed-with-sanity-and-svelte-kit.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: blog 3 | title: Creating a RSS feed with Sanity and Svelte Kit 4 | excerpt: Read this post to learn how to leverage Svelte Kit endpoints, along with a CMS such as sanity to create a RSS feed for your blog. 5 | image: $assets/posts/rss-sanity-sveltekit.webp 6 | postedAt: 1643897820000 7 | --- 8 | 9 | > This post has been updated for SvelteKit 1.0 and Sanity js 6 10 | 11 | The other day [I decided that I wanted to start using an rss reader](https://twitter.com/onlyspaceghost/status/1487032568100839428). Since RSS is awesome I thought it only makes sense that I add it to my site. This post will go over how I did this, so you can add it to your blog! I will be using Sanity as my CMS but you can use any data source that you like. 12 | 13 | # Dependencies 14 | 15 | The first step is to install the `rss` package to your Svelte Kit project. If you are not using Sanity don't install `groq` or `@sanity/client` 16 | 17 | ```bash 18 | npm i @types/rss rss @sanity/client groq -D 19 | ``` 20 | 21 | # Creating your endpoint 22 | 23 | We need a rss.xml endpoint that users can add to their RSS readers. In your routes folder create a file called `rss.xml/+server.js`. 24 | 25 | Next we need to structure our endpoint, lets start by importing our dependencies and creating our GET function. 26 | 27 | ```js 28 | // Only import these two if you are using Sanity 29 | import { createClient } from '@sanity/client'; 30 | import groq from 'groq'; 31 | 32 | import RSS from 'rss'; 33 | 34 | export async function GET() {} 35 | ``` 36 | 37 | # Creating your feed 38 | 39 | Now we have our endpoint file, we need to create our feed, there are many options you can add to your feed to customise it. In this example I will only show the required ones, [checkout the other options here](https://www.npmjs.com/package/rss#feedoptions). 40 | 41 | ```js 42 | const feed = new RSS({ 43 | title: 'GHOSTDev blog', // The title of our rss feed 44 | site_url: 'https://ghostdev.xyz', // Our base site url 45 | feed_url: 'https://ghostdev.xyz/rss.xml', // This links to our endpoint 46 | }); 47 | ``` 48 | 49 | # Adding your content 50 | 51 | Now we have our feed we need to fetch our data, this is where Sanity comes in. I will assume that your post data has a `title`, `excerpt` (description), `timestamp`, and `slug` field. 52 | 53 | ```js 54 | const sanity = createClient({ 55 | projectId: '', // Sanity Project ID 56 | dataset: '', // Sanity DataSet 57 | useCdn: true, 58 | }); 59 | 60 | const query = groq` 61 | *[_type == 'post']{ 62 | title, 63 | excerpt, 64 | timestamp, 65 | 66 | "slug": slug.current, 67 | "image": image.asset -> url, 68 | } | order(timestamp desc) 69 | `; 70 | 71 | const posts = await sanity.fetch(query); 72 | ``` 73 | 74 | Once we have our data we can add it to our feed. You can view all possible fields you can have [here](https://www.npmjs.com/package/rss#itemoptions) 75 | 76 | ```js 77 | for (const post of posts) 78 | feed.item({ 79 | title: post.title, 80 | description: post.excerpt, 81 | date: post.timestamp, 82 | url: `https://ghostdev.xyz/posts/${post.slug}`, 83 | }); 84 | ``` 85 | 86 | # Finishing up 87 | 88 | We are just about done! The last step is returning the rss data from your endpoint. We will indent it to make it readable 89 | 90 | ```js 91 | return { 92 | body: feed.xml({ indent: true }), 93 | }; 94 | ``` 95 | 96 | # End Result 97 | 98 | Thank you for reading this post! Below is the end result of what we created incase you want to copy and paste it. Don't forget to add links to your RSS endpoint on your site, and if this post helped you share it on twitter 99 | 100 | ```js 101 | // Only import these two if you are using Sanity 102 | import { createClient } from '@sanity/client'; 103 | import groq from 'groq'; 104 | 105 | import RSS from 'rss'; 106 | 107 | const sanity = createClient({ 108 | projectId: '', // Sanity Project ID 109 | dataset: '', // Sanity DataSet 110 | useCdn: true, 111 | }); 112 | 113 | export async function GET() { 114 | const feed = new RSS({ 115 | title: 'GHOSTDev blog', // The title of our rss feed 116 | site_url: 'https://ghostdev.xyz', // Our base site url 117 | feed_url: 'https://ghostdev.xyz/rss.xml', // This links to our endpoint 118 | }); 119 | 120 | const query = groq` 121 | *[_type == 'post']{ 122 | title, 123 | excerpt, 124 | timestamp, 125 | 126 | "slug": slug.current, 127 | "image": image.asset -> url, 128 | } | order(timestamp desc) 129 | `; 130 | 131 | const posts = await sanity.fetch(query); 132 | 133 | for (const post of posts) 134 | feed.item({ 135 | title: post.title, 136 | description: post.excerpt, 137 | date: post.timestamp, 138 | url: `https://ghostdev.xyz/posts/${post.slug}`, 139 | }); 140 | 141 | return new Response(feed.xml({ indent: true }), { 142 | status: 200, 143 | headers: { 144 | 'Content-Type': 'application/xml', 145 | }, 146 | }); 147 | } 148 | ``` 149 | -------------------------------------------------------------------------------- /src/content/blog/home-assistant-green.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: blog 3 | title: Home Assistant Green 4 | excerpt: My experience with the latest Home Assistant hardware from Nabu Casa 5 | image: $assets/posts/home-assistant-green/thumbnail.png 6 | postedAt: 1722579812403 7 | attribution: Images of the Home Assistant Green in the thumbnail background, and under the "What is it?" heading belong to Home Assistant. 8 | --- 9 | 10 | [Home Assistant](https://www.home-assistant.io/) is the most popular open source home automation software. Think Google Home or Apple Homekit but under your control, running in your house, and powered by a worldwide community of developers. It serves as the central hub of your smart home, allowing you to control, monitor, and automate your devices. Coming in strong with nearly 350,000 active installs and just under 3000 official integrations. It can be installed on any system from a spare computer, to a raspberry pi. Home Assistant is governed by the [Open Home Foundation](https://www.openhomefoundation.org/), so it's here to stay. I won't go any more into the specifics of how Home Assistant works and what you can do with it in this post - but [let me know](https://ghostdev.xyz/contact) if that's something you would be interested in. 11 | 12 | I've been running Home Assistant on a Raspberry Pi 3 for some time now and it's been working great, however, when I noticed the [Home Assistant Green](https://www.home-assistant.io/green/) last November I had to try it out. 13 | 14 | ## What is it? 15 | 16 |  17 | 18 | The Green is the perfect device for non-technical users; it's ready to go out of the box and has everything you need. It's has a small form factor in a translucent plastic housing with a heatsink base. It's powered by a Rockchip RK3566 SoC with a quad-core Arm Cortext-A55 CPU and includes: 32gb of non-upgradable storage, 4gb of memory, 2 USB 2.0 A ports, Gigabit networking, a HDMI port for diagnostics, and a MicroSD slot for backups. 19 | 20 | Home Assistant can easily run on hardware you already own, so if you're a more technical user who has time to tinker with your own home lab, Home Assistant Green might not be for you. The Green costs £86 (\~$110) which is high considering a 4gb Raspberry Pi 4 with and a memory card costs around £60 (\~$76). That's without considering the long list of powerful (and cheaper) [Raspberry Pi alternatives](https://www.youtube.com/watch?v=uJvCVw1yONQ). Regardless of what option you chose, you'll also likely need a Zigbee & Thread/Matter radio, which if you choose the [Home Assistant Connect ZBT-1](https://www.home-assistant.io/connectzbt1) (formerly SkyConnect) costs £31 (~$40). That brings the total for your smart home hub to around £91 - 117 (\~$115 - 149). 21 | 22 | Despite it's price point, I think the Green is incredible and its value is in its simplicity. It's beautifully designed, with a good unboxing experience, and is powered by the best home automation software ootb. It's super important that alternatives to navigating the nightmare that is cloud based IoT is easy to access for the average consumer. Devices like the Green are lowering the barrier to entry for non-technical users. While I am confident that they could get it running on a Pi, they shouldn't need to, especially considering that using a proprietary cloud-based alternative is "free". 23 | 24 | ## Home Assistant Yellow 25 | 26 | It's worth mentioning the predecesor of the Green: The Yellow (I'm sensing a theme here...). The Yellow was released in 2021 and is still available. Historically, the primary drawback to the Yellow has been it's reliance on the [PI Compute Module 4](https://www.raspberrypi.com/products/compute-module-4/?variant=raspberry-pi-cm4001000) which have been super hard to get [until recently](https://www.pcworld.com/article/1939160/at-last-the-raspberry-pi-shortage-is-finally-coming-to-an-end.html). This increased the barrier to entry significantly, by requiring you to source a CM4 and install it. There are still some benefits if you would like an integrated Zigbee radio, power over ethernet, or expandable storage (via an m.2 slot). I'd only recommend this device if you want to support Nabu Casa and Home Assistant, but at that point you might as well just [support them directly](https://www.openhomefoundation.org/organization/#support-our-work). 27 | 28 | ## Unboxing & Setup 29 | 30 | It comes in a well designed box with all the peripherals that you would need to get it running: an ethernet cable, a universal power supply, a sticker, a manual you're not going to read, and legal crap. 31 | 32 |  33 |  34 | 35 | The Green fits in super nicely with my home lab: 36 | 37 |  38 | 39 | I also ordered the [Connect ZBT-1](https://www.home-assistant.io/connectzbt1/) which came with a usb extension cable to help mitigate [USB 3.x interference](https://www.home-assistant.io/integrations/zha#zigbee-interference-avoidance-and-network-rangecoverage-optimization) with the Zigbee radio. 40 | 41 |  42 | 43 | The setup was simple - once you see a yellow led blinking on the Green you can navigate to `http://homeassistant.local:8123` and follow the graphical setup wizard. It was able to detect all devices on my network pretty well, including the zigbee/thread radio provided by the Connect ZBT-1. There is a super detailed setup guide [available here](https://green.home-assistant.io/) if you're interested in a deep dive. 44 | 45 |  46 | -------------------------------------------------------------------------------- /src/content/blog/moquettes.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: blog 3 | title: Moquettes 4 | excerpt: Moquettes have been used on public transport around the world for over 100 years. Find out what they are and why in this post... 5 | image: $assets/moquettes/moquettes.png 6 | postedAt: 1687943365983 7 | --- 8 | 9 | Moquettes have been used on public transport around the world for over 100 years. There's a good chance you've sat on a Moquette covered seat; I am as I write this now! Moquettes are an extremely durable, woven fabric that's hard to stain. This makes them the perfect material for the millions of passengers that need somewhere to sit. The history of the Moquette is interesting since, while it's a dull topic at first glance, they're integral part of our transport networks. 10 | 11 | ## Manufacturing 12 | 13 | Originally hand woven in France, the word "Moquette" comes from the french word for carpet. In parts of Yorkshire UK, they're still produced using traditional techniques. A Moquette is woven using the Jacquard technique, made from about 85% wool and 15% nylon. 14 | 15 | Moquettes for London Transport take time to make. Just 1 meter of the Moquette fabric used on the Bakerloo Line requires nearly _eleven kilometres_ of yarn. The yarn is dyed different colours and transferred to over 3000 bobbins ready to be put through a loom. The new fabric is then steam finished and cropped to give it a crisp, clear face. Finally, it's soaked in a flame retardant solution before being dried out and sent off to be used on our transport network. 16 | 17 | ## Designs/Patterns 18 | 19 | The designs/patterns are easily my favourite part about Moquettes. Getting the design right is paramount to the transport experience. It's quite incredible how the right combination of patterns and colours can have such a significant influence on the mood of your travel. A nice added benefit of the Moquettes design is that it makes it harder to see the wear and tear you'd naturally expect over time. 20 | 21 | ## A brief history 22 | 23 | I'm going to specifically focusing on the patterns seen in London since it's probably the most well documented use going all the way back to the 1920s. The first Moquette pattern was called Lozenge, commissioned by the Underground Group in 1923. It quickly became the standard pattern and was produced by three major Moquette manufacturers. 24 | 25 |  26 | 27 | ### Routemaster Moquette 28 | 29 | In the '50s, Douglas Scott was commissioned to design the now iconic Routemaster busses, with the first prototype being created in 1954. He carefully chose the colours of the interior, and in 1961, a Moquette featuring the maroon, yellow, and green of the interior was introduced. 30 | 31 |  32 | 33 | ### The Victoria Line 34 | 35 | Professor Misha Black worked as the design consultant for the Victoria Line in 1964. Marianne Straub, Jacqueline Groag, and the Orbit Design Group were comissioned to create some new Moquette designs for the line. Unfortunately, the designs were never used due to time pressures. Some pre-existing blue and green designs were used instead, featured both on the rail and the road. 36 | 37 |  38 | 39 | ### The Moquette Identity 40 | 41 | During the 1990s, the London Underground experimented with giving each line its own Moquette, rather than using pre-existing designs on its trains. The designs attempted to incorporate the colours of both the line and carriage, similar to the work Douglas did for the Routemaster bus. For example the following design was using on the red branded Central Line: 42 | 43 |  44 | 45 | ### Moquettes Today 46 | 47 | The designs and colours of Moquettes have changed over time, but the tradition of distinctive designs still lives. It's always a treat to go on a new train or bus, see the Moquette designs used, and think of the amount of people who helped craft the atmosphere of the moments spent in the vehicle. 48 | 49 | ## My Favourite Moquette 50 | 51 | My favourite Moquette design was made around 2011 and is still featured on the District (Green), Circle (Yellow), Metropolitan (Magenta), and Hammersmith & City Lines (Pink). Its design is simple but beautiful, bringing together the four colours of the lines it serves. It's an amazing easter egg for those of us who are enthusiasts or regular travellers of those lines. 52 | 53 |  54 | 55 | ## Sources 56 | 57 | - https://en.wikipedia.org/wiki/Moquette 58 | - https://www.ltmuseum.co.uk/collections/stories/design/history-moquette 59 | - https://dataportal.orr.gov.uk/statistics/usage/passenger-rail-usage/ 60 | - https://www.ltmuseum.co.uk/collections/collections-online/vehicle-parts/item/1997-2993-128 61 | - https://en.wikipedia.org/wiki/AEC_Routemaster 62 | - https://www.ltmuseum.co.uk/collections/projects/moquette-project 63 | - https://youtu.be/BebTORlFqAs 64 | -------------------------------------------------------------------------------- /src/content/blog/working-with-reduced-motion-in-svelte.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: blog 3 | title: Working with reduced motion in Svelte 4 | excerpt: Working with reduced motion and Svelte transitions can be easy. In this post I cover how we can adapt our website for those who prefer reduced motion, and how to use svelte-reduced-motion to make your transitions accessible. 5 | image: $assets/posts/reduced-motion.webp 6 | postedAt: 1651016520000 7 | --- 8 | 9 | Accessibility on the web is important. It's why frameworks like Svelte have accessibility warnings built in, and why it's a metric in tools such as lighthouse. You want the ability to control the look and feel of your website for those who use assistive technology, or just want a better experience on the web. 10 | 11 | Animations in Svelte are powerful, but for those who prefer reduced motion, some aren't ideal. A solution to this problem isn't exactly new. [Geoff Rich published a blog post](https://geoffrich.net/posts/svelte-prefers-reduced-motion-store/) on it back in March 2021. However, I'm lazy and don't want to implement this on every project. This led me to make `svelte-reduced-motion`. 12 | 13 | I recommend reading this awesome [CSS Tricks Article by Eric Bailey](https://css-tricks.com/introduction-reduced-motion-media-query). It goes in depth about the benefits people can get from sites that support reduced motion and the `prefers-reduced-motion` media query. 14 | 15 | # Getting Started 16 | 17 | As per usual, let's install the dependency. 18 | 19 | ```bash 20 | npm install svelte-reduced-motion -D 21 | ``` 22 | 23 | # Transitions 24 | 25 | To make it easy, we provide a way to use any of Svelte's built-in transitions out of the box. Later you will learn how you can create custom ones too! By default, all transitions will fall back to `fade` when reduced motion is requested. 26 | 27 | ```svelte 28 | 31 | 32 |
Reduced Motion: {$reducedMotion ? 'enabled' : 'disabled'}
81 | ``` 82 | 83 | # Conclusion 84 | 85 | Prefers reduced motion is another accessibility item we have to consider in Svelte. CSS provides us with all the tools, and combined with `svelte-reduced-motion`, we can easily add this consideration to our Svelte projects. 86 | -------------------------------------------------------------------------------- /src/content/config.ts: -------------------------------------------------------------------------------- 1 | import { defineCollection, z } from 'astro:content'; 2 | import { tags } from '../lib/components/posts/tags'; 3 | 4 | export const collections = { 5 | blog: defineCollection({ 6 | type: 'content', 7 | schema: ({ image }) => 8 | z.object({ 9 | tag: z.enum(tags), 10 | title: z.string().trim().min(1), 11 | excerpt: z.string().trim().min(1), 12 | image: image(), 13 | postedAt: z.number(), 14 | lastEdited: z.number().optional(), 15 | attribution: z.string().optional(), 16 | }), 17 | }), 18 | 19 | links: defineCollection({ 20 | type: 'data', 21 | schema: ({ image }) => 22 | z.object({ 23 | tag: z.enum(tags), 24 | title: z.string().trim().min(1), 25 | excerpt: z.string().trim().min(1), 26 | image: image(), 27 | link: z.string().url().trim().min(1), 28 | postedAt: z.number(), 29 | }), 30 | }), 31 | 32 | supporters: defineCollection({ 33 | type: 'data', 34 | schema: ({ image }) => 35 | z.object({ 36 | name: z.string().trim().min(1), 37 | active: z.boolean().optional().default(false), 38 | pfp: image(), 39 | }), 40 | }), 41 | 42 | projects: defineCollection({ 43 | type: 'data', 44 | schema: () => 45 | z.object({ 46 | name: z.string().trim().min(1), 47 | url: z.string().url().trim().min(1), 48 | star: z.boolean().optional().default(false), 49 | archived: z.boolean().optional().default(false), 50 | }), 51 | }), 52 | 53 | events: defineCollection({ 54 | type: 'data', 55 | schema: ({ image }) => 56 | z.object({ 57 | name: z.string().trim().min(1), 58 | place: z.union([ 59 | z.literal('online'), 60 | z.literal('in-person'), 61 | z.literal('hybrid'), 62 | ]), 63 | type: z.union([ 64 | z.literal('conference'), 65 | z.literal('meetup'), 66 | z.literal('stream'), 67 | ]), 68 | url: z.string().url(), 69 | thumbnail: image(), 70 | start: z.coerce.date(), 71 | end: z.coerce.date(), 72 | }), 73 | }), 74 | }; 75 | -------------------------------------------------------------------------------- /src/content/events/2021-11-17-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "We're Back! The first post-lockdown in-person Svelte Meetup!", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/svelte/events/281659208/", 6 | "thumbnail": "$assets/events/2021-11-17-svelte-london.jpg", 7 | "start": "2021-11-17T19:00:00Z", 8 | "end": "2021-11-17T23:00:00Z" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2021-12-13-sveltesummit-mini-edition-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SvelteSummit Mini Edition: London plus Christmas Party!", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/svelte/events/282241574/", 6 | "thumbnail": "$assets/events/2021-12-13-sveltesummit-mini-edition-london.jpg", 7 | "start": "2021-12-13T18:00:00Z", 8 | "end": "2021-12-13T21:00:00Z" 9 | } -------------------------------------------------------------------------------- /src/content/events/2022-03-23-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London 2022!", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/svelte/events/283610698/", 6 | "thumbnail": "$assets/events/2022-03-23-svelte-london.jpg", 7 | "start": "2022-03-23T18:00:00Z", 8 | "end": "2022-03-23T21:00:00Z" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2022-04-28-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - April 2022 Meetup", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/svelte/events/285123489/", 6 | "thumbnail": "$assets/events/2022-04-28-svelte-london.jpg", 7 | "start": "2022-04-28T18:00:00+01:00", 8 | "end": "2022-04-28T21:00:00+01:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2022-05-26-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - May 2022 Meetup", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/svelte/events/285695034/", 6 | "thumbnail": "$assets/events/2022-05-26-svelte-london.jpg", 7 | "start": "2022-05-26T18:00:00+01:00", 8 | "end": "2022-05-26T21:00:00+01:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2022-06-30-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - June 2022 Meetup", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/svelte/events/286390430/", 6 | "thumbnail": "$assets/events/2022-06-30-svelte-london.jpg", 7 | "start": "2022-06-30T18:30:00+01:00", 8 | "end": "2022-06-30T21:30:00+01:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2022-07-20-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - July 2022 Social #2🍻 Get-together", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/svelte/events/286805573/", 6 | "thumbnail": "$assets/events/2022-07-20-svelte-london.jpg", 7 | "start": "2022-07-20T19:00:00+01:00", 8 | "end": "2022-07-20T21:00:00+01:00" 9 | } -------------------------------------------------------------------------------- /src/content/events/2022-08-24-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - August 2022 Meetup", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/svelte/events/287943736/", 6 | "thumbnail": "$assets/events/2022-08-24-svelte-london.jpg", 7 | "start": "2022-08-24T18:30:00+01:00", 8 | "end": "2022-08-24T21:00:00+01:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2022-08-30-lego-software-engineering-meetup.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LEGO.com Software Engineering Meetup - The Serverless Special", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/brick-by-brick-building-lego-com/events/287876826/", 6 | "thumbnail": "$assets/events/2022-08-30-lego-software-engineering-meetup.jpg", 7 | "start": "2022-08-30T19:00:00+01:00", 8 | "end": "2022-08-30T21:00:00+01:00" 9 | } -------------------------------------------------------------------------------- /src/content/events/2022-11-24-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - November 2022 Meetup", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/svelte/events/289816187/", 6 | "thumbnail": "$assets/events/2022-11-24-svelte-london.jpg", 7 | "start": "2022-11-24T18:30:00Z", 8 | "end": "2022-11-24T21:00:00Z" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2022-12-15-plymouth-web-social-meetup.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Plymouth Web Social Meetup", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/plymouth-web/events/289667780/", 6 | "thumbnail": "$assets/events/2022-12-15-plymouth-web-social-meetup.jpg", 7 | "start": "2022-12-15T19:00:00Z", 8 | "end": "2022-12-15T21:00:00Z" 9 | } -------------------------------------------------------------------------------- /src/content/events/2023-10-24-lnug.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LNUG Meetup #101 : Svelte for node.js developers... and more. ", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/london-nodejs/events/296414214/", 6 | "thumbnail": "$assets/events/2023-10-24-lnug.jpg", 7 | "start": "2023-10-24T18:30:00+01:00", 8 | "end": "2023-10-24T21:00:00+01:00" 9 | } -------------------------------------------------------------------------------- /src/content/events/2024-03-27-indiebeers.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "IndieBeers // London Meetup #49", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/indiebeers-london-meetup-r59i9p", 6 | "thumbnail": "$assets/events/2024-03-27-indiebeers.png", 7 | "start": "2024-03-27T18:00:00+00:00", 8 | "end": "2024-03-27T23:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-03-28-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - March 2024", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/svelte-london-march-599ykl", 6 | "thumbnail": "$assets/events/2024-03-28-svelte-london.png", 7 | "start": "2024-03-28T18:30:00+00:00", 8 | "end": "2024-03-28T21:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-04-05-cityjs-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "CityJS London", 3 | "place": "in-person", 4 | "type": "conference", 5 | "url": "https://guild.host/events/cityjs-london-bw4xrm", 6 | "thumbnail": "$assets/events/2024-04-05-cityjs-london.png", 7 | "start": "2024-04-05T08:00:00+00:00", 8 | "end": "2024-04-05T16:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-04-22-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - April 2024", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/svelte-london-april-4aocw2", 6 | "thumbnail": "$assets/events/2024-04-22-svelte-london.png", 7 | "start": "2024-04-22T17:30:00+00:00", 8 | "end": "2024-04-22T20:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-05-22-lnug.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LNUG #103: Massive Node.js Monorepos + Cloud Infrastructure as Code", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/london-nodejs/events/300766887/", 6 | "thumbnail": "$assets/events/2024-05-22-lnug.jpg", 7 | "start": "2024-05-22T18:30:00+01:00", 8 | "end": "2024-05-22T21:00:00+01:00" 9 | } -------------------------------------------------------------------------------- /src/content/events/2024-05-23-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - May 2024", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/svelte-london-may-2024-y4rl06", 6 | "thumbnail": "$assets/events/2024-05-23-svelte-london.png", 7 | "start": "2024-05-23T17:00:00+00:00", 8 | "end": "2024-05-23T20:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-07-25-cloudflare-community-meetup.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Cloudflare Community Meetup - July 2024", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/london-cloudflare-community-meetup/events/302178020/", 6 | "thumbnail": "$assets/events/2024-07-25-cloudflare-community-meetup.jpg", 7 | "start": "2024-07-25T18:00:00+01:00", 8 | "end": "2024-07-25T20:30:00+01:00" 9 | } -------------------------------------------------------------------------------- /src/content/events/2024-08-13-disruptive-tech.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Disruptive Tech London - Ai-lluminations: Shedding Light on the Future of Tech💡", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/disruptive-tech-lon/events/299486653/", 6 | "thumbnail": "$assets/events/2024-08-13-disruptive-tech.jpg", 7 | "start": "2024-08-13T18:00:00+01:00", 8 | "end": "2024-08-13T20:45:00+01:00" 9 | } -------------------------------------------------------------------------------- /src/content/events/2024-08-15-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - August 2024", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/svelte-london-august-3fkry6", 6 | "thumbnail": "$assets/events/2024-08-15-svelte-london.png", 7 | "start": "2024-08-15T17:30:00+00:00", 8 | "end": "2024-08-15T19:30:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-09-21-uncodebar.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "uncodebar 10", 3 | "place": "in-person", 4 | "type": "conference", 5 | "url": "https://uncodebar.com", 6 | "thumbnail": "$assets/events/2024-09-21-uncodebar.png", 7 | "start": "2024-09-21T10:00:00+00:00", 8 | "end": "2024-09-21T17:30:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-09-25-jsmonthly.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JSMonthly September", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/jsmonthly-september-hh75tc", 6 | "thumbnail": "$assets/events/2024-09-25-jsmonthly.png", 7 | "start": "2024-09-25T17:00:00+00:00", 8 | "end": "2024-09-25T21:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-09-27-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - September 2024", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/svelte-london-september-p5wypf", 6 | "thumbnail": "$assets/events/2024-09-27-svelte-london.png", 7 | "start": "2024-09-27T17:30:00+00:00", 8 | "end": "2024-09-27T19:45:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-10-28-jsmonthly.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JSMonthly October", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/jsmonthly-october-meetup-ww0g8n", 6 | "thumbnail": "$assets/events/2024-10-28-jsmonthly.png", 7 | "start": "2024-10-28T19:00:00+00:00", 8 | "end": "2024-10-28T21:05:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-10-30-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - October 2024", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/svelte-london-october-a4jcd9", 6 | "thumbnail": "$assets/events/2024-10-30-svelte-london.png", 7 | "start": "2024-10-30T18:30:00+00:00", 8 | "end": "2024-10-30T21:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-11-07-stripe-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Stripe London November 2024 (In Person)", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/stripe-london/events/303642476/", 6 | "thumbnail": "$assets/events/2024-11-07-stripe-london.jpg", 7 | "start": "2024-11-07T18:30:00Z", 8 | "end": "2024-11-07T20:30:00Z" 9 | } -------------------------------------------------------------------------------- /src/content/events/2024-11-20-jsmonthly.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JSMonthly November", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/jsmonthly-november-meetup-4wrhm8", 6 | "thumbnail": "$assets/events/2024-11-20-jsmonthly.png", 7 | "start": "2024-11-20T18:00:00+00:00", 8 | "end": "2024-11-20T20:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2024-11-23-barcamp-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Barcamp London 13", 3 | "place": "in-person", 4 | "type": "conference", 5 | "url": "https://thirteen.barcamplondon.org", 6 | "thumbnail": "$assets/events/2024-11-23-barcamp-london.png", 7 | "start": "2024-11-23T09:30:00+00:00", 8 | "end": "2024-11-23T18:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-01-29-jsmonthly.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JSMonthly January", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/jsmonthly-january-event-ycxvud", 6 | "thumbnail": "$assets/events/2025-01-29-jsmonthly.png", 7 | "start": "2025-01-29T18:00:00+00:00", 8 | "end": "2025-01-29T21:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-01-30-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - January 2025", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/svelte-london-january-nuyf47", 6 | "thumbnail": "$assets/events/2025-01-30-svelte-london.png", 7 | "start": "2025-01-30T18:30:00+00:00", 8 | "end": "2025-01-30T21:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-02-01-fosdem.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "FOSDEM 2025", 3 | "place": "hybrid", 4 | "type": "conference", 5 | "url": "https://fosdem.org/2025", 6 | "thumbnail": "$assets/events/2025-02-01-fosdem.jpg", 7 | "start": "2025-02-01T09:30:00+01:00", 8 | "end": "2025-02-02T21:18:15+01:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-02-10-svelte-hack-winners-announcement.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte Hack 2024 Winners Announcement", 3 | "place": "online", 4 | "type": "stream", 5 | "url": "https://www.youtube.com/watch?v=NwRJvFX-lOk", 6 | "thumbnail": "$assets/events/2025-02-10-svelte-hack-winners-announcement.png", 7 | "start": "2025-02-10T16:30:00+00:00", 8 | "end": "2025-02-10T17:15:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-02-19-london-web-standards.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "London Web Standards #LWSFeb2025", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://londonwebstandards.org/events/lwsfeb2025", 6 | "thumbnail": "$assets/events/2025-02-19-london-web-standards.png", 7 | "start": "2025-02-19T19:00:00+00:00", 8 | "end": "2025-02-19T21:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-02-20-jsmonthly.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JSMonthly February", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/jsmonthly-february-meetup-0e7yql", 6 | "thumbnail": "$assets/events/2025-02-20-jsmonthly.png", 7 | "start": "2025-02-20T18:00:00+00:00", 8 | "end": "2025-02-20T20:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-02-26-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - February 2025", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/svelte-london-february-5xay1m", 6 | "thumbnail": "$assets/events/2025-02-26-svelte-london.png", 7 | "start": "2025-02-26T18:30:00+00:00", 8 | "end": "2025-02-26T20:45:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-03-06-jsmonthly.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JSMonthly Surprise Event", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/jsmonthly-surprise-event-waeyp9", 6 | "thumbnail": "$assets/events/2025-03-06-jsmonthly.webp", 7 | "start": "2025-03-06T19:00:00+00:00", 8 | "end": "2025-03-06T21:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-03-08-codebar-festival-fringe.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codebar Festival Fringe 2025", 3 | "place": "in-person", 4 | "type": "conference", 5 | "url": "https://ti.to/codebar/fringe", 6 | "thumbnail": "$assets/events/2025-03-08-codebar-festival-fringe.png", 7 | "start": "2025-03-08T18:00:00+00:00", 8 | "end": "2025-03-08T21:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-03-11-stripe-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Stripe London March 2025", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/stripe-london/events/305667592", 6 | "thumbnail": "$assets/events/2025-03-11-stripe-london.jpg", 7 | "start": "2025-03-11T18:30:00Z", 8 | "end": "2025-03-11T20:30:00Z" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-03-20-jsmonthly.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JSMonthly March Meetup", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/jsmonthly-march-meetup-sdmrxi", 6 | "thumbnail": "$assets/events/2025-03-20-jsmonthly.webp", 7 | "start": "2025-03-20T18:00:00+00:00", 8 | "end": "2025-03-20T20:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-03-27-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - March 2025", 3 | "place": "hybrid", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/svelte-london-march-4yben8", 6 | "thumbnail": "$assets/events/2025-03-27-svelte-london.png", 7 | "start": "2025-03-27T18:30:00+00:00", 8 | "end": "2025-03-27T20:45:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-03-29-state-of-the-browser.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "State of the Browser 2025", 3 | "place": "hybrid", 4 | "type": "conference", 5 | "url": "https://2025.stateofthebrowser.com", 6 | "thumbnail": "$assets/events/2025-03-29-state-of-the-browser.jpg", 7 | "start": "2025-03-29T09:30:00+00:00", 8 | "end": "2025-03-29T16:30:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-04-10-cloudflare-elevenlabs-supabase-meetup.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Cloudflare + ElevenLabs + Supabase Developer Meetup", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://lu.ma/n6hxasmm", 6 | "thumbnail": "$assets/events/2025-04-10-cloudflare-elevenlabs-supabase-meetup.png", 7 | "start": "2025-04-10T18:30:00+01:00", 8 | "end": "2025-04-10T21:00:00+01:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-04-23-svelte-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte London - April 2025", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/svelte-london-april-w318ih", 6 | "thumbnail": "$assets/events/2025-04-23-svelte-london.png", 7 | "start": "2025-04-23T18:00:00+00:00", 8 | "end": "2025-04-23T21:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-04-25-cityjs-london.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "CityJS London 2025", 3 | "place": "in-person", 4 | "type": "conference", 5 | "url": "https://london.cityjsconf.org", 6 | "thumbnail": "$assets/events/2025-04-25-cityjs-london.png", 7 | "start": "2025-04-25T17:00:00+00:00", 8 | "end": "2025-04-25T16:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-05-08-svelte-summit.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte Summit Spring 2025", 3 | "place": "hybrid", 4 | "type": "conference", 5 | "url": "https://www.sveltesummit.com", 6 | "thumbnail": "$assets/events/2025-05-08-svelte-summit.png", 7 | "start": "2025-05-08T09:30:00+00:00", 8 | "end": "2025-05-09T18:30:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-05-21-openuk-digital-meetup.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "OpenUK Digital Meet-up #7 data sovereignty", 3 | "place": "online", 4 | "type": "meetup", 5 | "url": "https://www.meetup.com/openuk/events/306642326", 6 | "thumbnail": "$assets/events/2025-05-21-openuk-digital-meetup.avif", 7 | "start": "2025-05-21T12:00:00+01:00", 8 | "end": "2025-05-21T13:30:00+01:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-05-22-jsmonthly.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JSMonthly May Meetup", 3 | "place": "in-person", 4 | "type": "meetup", 5 | "url": "https://guild.host/events/jsmonthly-may-event-k4w4l0", 6 | "thumbnail": "$assets/events/2025-05-22-jsmonthly.webp", 7 | "start": "2025-05-22T18:00:00+00:00", 8 | "end": "2025-05-22T21:00:00+00:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/events/2025-10-09-vite-conf-amsterdam.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Vite Conf 2025 Amsterdam", 3 | "place": "hybrid", 4 | "type": "conference", 5 | "url": "https://viteconf.amsterdam/", 6 | "thumbnail": "$assets/events/2025-10-09-vite-conf-amsterdam.png", 7 | "start": "2025-10-09T09:00:00+02:00", 8 | "end": "2025-10-10T18:00:00+02:00" 9 | } 10 | -------------------------------------------------------------------------------- /src/content/links/all-about-the-sirens-svelte-radio.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "All About the Sirens", 3 | "excerpt": "The Svelte Sirens go on Svelte Radio to chat about us!", 4 | "image": "$assets/posts/all-about-the-sirens-svelte-radio.png", 5 | "tag": "podcast", 6 | "link": "https://www.svelteradio.com/episodes/all-about-the-sirens", 7 | "postedAt": 1656284400000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/astro-svelte-sirens.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Astro & Svelte", 3 | "excerpt": "Astro just hit 1.0! Fred K Schott joins us to answer questions on Astro and see how you can integrate Svelte.", 4 | "image": "$assets/posts/astro-svelte.png", 5 | "tag": "youtube", 6 | "link": "https://www.youtube.com/watch?v=iYKKg-50Gm4", 7 | "postedAt": 1660676400000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/backblaze-b2-image-gallery.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Backblaze B2 Image Gallery", 3 | "excerpt": "GHOST joins Oliver's Stream to helpout with his Backblaze B2 Image Galley with Svelte", 4 | "image": "$assets/posts/oliver-b2-stream.png", 5 | "tag": "stream", 6 | "link": "https://www.twitch.tv/videos/1588401790", 7 | "postedAt": 1662925899000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/behind-the-source-sirens.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Svelte with Brittney and Willow", 3 | "excerpt": "Brittney and I go on Behind the Source by Mike Street to chat about Svelte, SvelteKit, and the Svelte Sirens.", 4 | "image": "$assets/posts/behind-the-source-sirens.png", 5 | "tag": "podcast", 6 | "link": "https://www.behindthesource.co.uk/podcasts/s02e05-svelte-with-brittney-and-willow/", 7 | "postedAt": 1668470400000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/building-a-sveltekit-adapter-for-winterjs.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Building a SvelteKit Adapter for WinterJS", 3 | "excerpt": "The stream will attempt to build an adapter for WinterJS, whilst showing off all the features of building SvelteKit adapters.", 4 | "image": "$assets/posts/building-a-sveltekit-adapter-for-winterjs.jpg", 5 | "tag": "youtube", 6 | "link": "https://www.youtube.com/watch?v=8HaAagG6V-Q", 7 | "postedAt": 1700082380000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/exploring-routify-in-svelte-kit.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Exploring Routify in Svelte Kit", 3 | "excerpt": "GHOST does her first talk on Svelte Sirens about how awesome Routify in Svelte Kit can be!", 4 | "image": "$assets/posts/routify-sveltekit-sirens.webp", 5 | "tag": "youtube", 6 | "link": "https://www.youtube.com/watch?v=epVRgjhjI7M", 7 | "postedAt": 1639764000000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/modern-web-podcast.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Exploring Svelte, Open Source, and Discord Bots with Willow (GHOST)", 3 | "excerpt": "I am interviewed by Rob Ocel from the Modern Web Podcast. We talk about Web Development, Svelte, SvelteKit, Open Source, Discord Bots, and more.", 4 | "image": "$assets/posts/modern-web-podcast.jpg", 5 | "tag": "podcast", 6 | "link": "https://www.youtube.com/watch?v=7KAUQa76Vfw", 7 | "postedAt": 1694784310000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/routes-for-svelte-with-routify.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Routes for Svelte with Routify", 3 | "excerpt": "Jake and I go on the Coding Cat Podcast to talk about using Routify and Svelte", 4 | "image": "$assets/posts/routes-for-svelte-with-routify.jpg", 5 | "tag": "podcast", 6 | "link": "https://codingcat.dev/podcast/2-23-routes-for-svelte-with-routify", 7 | "postedAt": 1660927800000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/routify-3-svelte-radio.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Routify 3 with Jake and Willow", 3 | "excerpt": "Jake and I go on Svelte Radio to talk about what's new with Routify 3 beta", 4 | "image": "$assets/posts/routify-3-svelte-radio.png", 5 | "tag": "podcast", 6 | "link": "https://www.svelteradio.com/episodes/routify-3-with-jake-and-willow", 7 | "postedAt": 1632351600000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/sirens-form-actions.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Sirens: Form Actions", 3 | "excerpt": "Kev joins the Sirens again to chat about Form actions in SvelteKit and create a new form for speaker submissions on SvelteSirens.dev.", 4 | "image": "$assets/posts/sirens-form-actions.png", 5 | "tag": "stream", 6 | "link": "https://www.youtube.com/watch?v=2OISk5-EHek", 7 | "postedAt": 1669822200000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/svelte-london-sveltekit-and-pocketbase.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Svelte London: SvelteKit & Pocketbase", 3 | "excerpt": "Every side project starts out with a question: \"What's the BEST tech stack\" - how silly! there's no answer right... Meet Pocketbase, an open source go backend providing you everything you need for your app (except users).", 4 | "image": "$assets/posts/svelte-london-sveltekit-and-pocketbase.png", 5 | "tag": "stream", 6 | "link": "https://www.youtube.com/live/EggM2qMzqdU?t=1700s", 7 | "postedAt": 1716579540000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/threlte-sirens-stream.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Threlte: Declarative Threejs for Svelte", 3 | "excerpt": "In this Svelte Sirens stream Alex Warnes will teach us about Threlte: Declarative Threejs for Svelte.", 4 | "image": "$assets/posts/threlte-declarative-threejs.png", 5 | "tag": "youtube", 6 | "link": "https://www.youtube.com/watch?v=dnclxsoRO_E", 7 | "postedAt": 1668456000000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/links/upgrading-sveltekit-sirens.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Upgrading SvelteKit", 3 | "excerpt": "GHOST joins Brittney and Kev to update the Svelte Sirens website and showcase upgrading your SvelteKit projects", 4 | "image": "$assets/posts/upgrading-sveltekit.png", 5 | "tag": "stream", 6 | "link": "https://www.youtube.com/watch?v=vzeZskhjoeQ", 7 | "postedAt": 1664283600000 8 | } 9 | -------------------------------------------------------------------------------- /src/content/projects/backblaze-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "BackBlaze CLI", 3 | "url": "https://github.com/ghostdevv/backblaze-cli", 4 | "archived": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/bereal-rs.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bereal-rs", 3 | "url": "https://github.com/ghostdevv/bereal-rs" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/cloudflare-pages-cleanup.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloudflare-pages-cleanup", 3 | "url": "https://github.com/ghostdevv/cloudflare-pages-cleanup" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/create-routify.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Create Routify", 3 | "url": "https://github.com/roxiness/create-routify" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/dashargs.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "DashArgs", 3 | "url": "https://github.com/ghoststools/dashargs", 4 | "archived": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/discord-rss.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "discord-rss", 3 | "url": "https://github.com/ghostdevv/discord-rss" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/djs-ticketsystem.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "djs-ticketsystem", 3 | "url": "https://github.com/ghoststools/djs-ticketsystem", 4 | "archived": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/esm-sh-browser-extension.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "esm.sh browser extension", 3 | "url": "https://github.com/ghostdevv/esm.sh-extension" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/extractinator.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Extractinator", 3 | "url": "https://github.com/ghostdevv/extractinator" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/fw-fanctrl-revived-gnome-shell-extension.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Framework Fan Control Gnome Extension", 3 | "url": "https://extensions.gnome.org/extension/7864/framework-fan-control" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/ghosts-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "GHOSTs Tools", 3 | "url": "https://github.com/ghostdevv/ghoststools" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/ghostsui.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "GHOSTSUi", 3 | "url": "https://github.com/ghostdevv/ghostsui" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/github-1s-button.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Github 1s Button", 3 | "url": "https://github.com/ghostdevv/github1s-button" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/greset.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "greset", 3 | "url": "https://www.npmjs.com/package/greset" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/gwordle.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Wordle Solver", 3 | "url": "https://github.com/ghostdevv/gwordle", 4 | "archived": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/jellycommands.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JellyCommands", 3 | "url": "https://github.com/ghostdevv/jellycommands", 4 | "star": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/kjua-revived.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kjua-revived", 3 | "url": "https://github.com/ghostdevv/kjua-revived" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/linode-bucket-delete.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "linode-bucket-delete", 3 | "url": "https://github.com/ghostdevv/linode-bucket-delete", 4 | "archived": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/linode-object-upload.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "linode-object-upload", 3 | "url": "https://github.com/ghostdevv/linode-object-upload", 4 | "archived": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/mneumonic-worker.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Mneumonic Worker", 3 | "url": "https://github.com/ghostdevv/mnemonic-worker" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/mykv.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "MyKV", 3 | "url": "https://github.com/ghostdevv/mykv", 4 | "archived": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/neru.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Neru", 3 | "url": "https://github.com/NeruJS/neru" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/remark-slug-anchor.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remark-slug-anchor", 3 | "url": "https://www.npmjs.com/package/remark-slug-anchor" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/request-bin.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "request-bin", 3 | "url": "https://github.com/ghostdevv/request-bin", 4 | "star": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/rollup-obfuscator.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rollup-obfuscator", 3 | "url": "https://github.com/ghoststools/rollup-obfuscator" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/routify.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Routify", 3 | "url": "https://routify.dev/" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/rpilocator-webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rpilocator webhooks", 3 | "url": "https://github.com/ghostdevv/rpilocator-webhooks" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/sass-hex-rgb.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sass-hex-rgb", 3 | "url": "https://github.com/ghostdevv/sass-hex-rgb" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/shire.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Shire", 3 | "url": "https://github.com/ghostdevv/shire" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/short.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Short", 3 | "url": "https://github.com/ghostdevv/short" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/sourcebin-js.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Sourcebin JavaScript SDK", 3 | "url": "https://github.com/ghoststools/sourcebin" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/station-quest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Station Quest", 3 | "url": "https://github.com/ghostdevv/station-quest", 4 | "star": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/svelte-body.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte Body", 3 | "url": "https://www.npmjs.com/package/svelte-body" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/svelte-check-action.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-check-action", 3 | "url": "https://github.com/ghostdevv/svelte-check-action", 4 | "star": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/svelte-copy.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte Copy", 3 | "url": "https://github.com/ghostdevv/svelte-copy" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/svelte-hamburgers.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte Hamburgers", 3 | "url": "https://github.com/ghostdevv/svelte-hamburgers" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/svelte-mount.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte Mount", 3 | "url": "https://github.com/ghostdevv/svelte-mount" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/svelte-reduced-motion.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte Reduced Motion", 3 | "url": "https://github.com/ghostdevv/svelte-reduced-motion" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/projects/svelte-turnstile.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Svelte Turnstile", 3 | "url": "https://github.com/ghostdevv/svelte-turnstile", 4 | "star": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Tasks", 3 | "url": "https://github.com/ghostdevv/tasks", 4 | "archived": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/projects/tst.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TST", 3 | "url": "https://github.com/ghostdevv/tst" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/supporters/alfie.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Alfie", 3 | "pfp": "$assets/sponsors/alfie.webp" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/supporters/braden-wiggins.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Braden Wiggins", 3 | "pfp": "$assets/sponsors/brady.webp", 4 | "active": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/supporters/cain.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Cain", 3 | "pfp": "$assets/sponsors/cain.webp" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/supporters/christophermc.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ChristopherMc", 3 | "pfp": "$assets/sponsors/christophermc.webp" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/supporters/dusan-malusev.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Dusan Malusev", 3 | "pfp": "$assets/sponsors/dusan.webp" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/supporters/gen-ashley.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Gen Ashley", 3 | "pfp": "$assets/sponsors/gen-ashley.webp" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/supporters/jazza.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Jazza", 3 | "pfp": "$assets/sponsors/jazza.webp", 4 | "active": true 5 | } 6 | -------------------------------------------------------------------------------- /src/content/supporters/kevin-åberg-kultalahti.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Kevin Åberg Kultalahti", 3 | "pfp": "$assets/sponsors/kevin.webp" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/supporters/scott-spence.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Scott Spence", 3 | "pfp": "$assets/sponsors/scott-spence.webp" 4 | } 5 | -------------------------------------------------------------------------------- /src/content/supporters/stefan-bogdanović.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Stefan Bogdanović", 3 | "pfp": "$assets/sponsors/stefan.webp" 4 | } 5 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | ///35 | {post.excerpt} 36 |
37 |19 | Posted {@render date(postedAt)}{lastEdited ? ',' : ''} 20 | 21 | {#if lastEdited} 22 | updated {@render date(lastEdited)} 23 | {/if} 24 |
25 | 26 | 34 | -------------------------------------------------------------------------------- /src/lib/components/posts/Posts.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { type Tag, tags } from '$lib/components/posts/tags'; 3 | import { getPosts } from '$lib/posts'; 4 | import PostCard from './PostCard.astro'; 5 | 6 | interface Props { 7 | filter?: Tag; 8 | } 9 | 10 | let posts = await getPosts(); 11 | 12 | if (tags.includes(Astro.props.filter!)) { 13 | posts = posts.filter((post) => post.tag == Astro.props.filter); 14 | } 15 | --- 16 | 17 |😱 You found my secret branding page!
29 |
19 |
29 |
40 |
47 |
52 |
59 |
17 | Thank you to everyone who's supported my work or is thinking about 18 | it! I'd also encourage you to checkout your other favourite tools 19 | sponsorship pages, or donate to a collective such as 20 | Anthony Fu's which share 21 | the donations in the community. 22 |
23 | 24 | 45 |An incomplete list of events I'm attending, or have attended.
15 |
17 | Checkout what I've been creating below, come chat with me on
18 |
25 |
19 | This list contains all of my projects, and isn't sorted very 20 | meaningfully yet. At the very least I've highlighted my current 21 | favourites in blue! 22 |
23 |