diff --git a/package.json b/package.json
index 454f374..2e10dd4 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,7 @@
"dev": "astro dev",
"start": "pnpm build && node ./run-server.mjs",
"build": "astro build",
- "preview": "astro preview",
+ "preview": "pnpm build && wrangler pages dev ./dist",
"astro": "astro",
"cloud-build": "pnpm build && wrangler pages deploy dist"
},
diff --git a/src/content/blog/v0-0-10.mdx b/src/content/blog/v0-0-10.mdx
new file mode 100644
index 0000000..c032782
--- /dev/null
+++ b/src/content/blog/v0-0-10.mdx
@@ -0,0 +1,44 @@
+---
+draft: false
+title: "Doras v0.0.10 Is Here!"
+snippet: "Twitch integration, new save button, oAuth implementation, and more!"
+image: { src: "https://cdn.doras.to/doras/user/05c5db48-cfba-49d7-82a1-5b4a3751aa40-0.5804055978205598.webp", alt: "Person playing video games" }
+publishDate: "2023-11-29"
+category: "Releases"
+author: "Tommy Lundy"
+authorURL: "https://doras.to/tommerty"
+tags: [updates, doras, v0.0.10]
+---
+
+# We got some sparkling new updates for you! 🚀
+
+## New Save Button 💾
+
+Thanks [@braaimeesterza](https://doras.to/braaimeesterza) for your [suggestion](https://github.com/doras-to/doras/issues/39)!👌 \
+The new save button is to help you save your changes when you're editing your profile. It's a small change but it's a nice one that was very much needed!
+
+
+
+The new save button only appears when there's changes to save, and isn't visible when there's no changes. This is to help keep the UI clean and not have too many buttons on the screen at once.
+
+## Twitch Panel Image 💥
+
+This was something I dreamed up, and super happy to have completed it! Basically, you can generate an image from your profile for your Twitch panel that's sized correctly to automatically direct your users to your Doras profile. This is a great way to get more people to check out all your links and blocks! We have a full blog post on this that you can check out [here](https://doras.to/blog/twitch-panel).
+
+
+
+## oAuth Stuff 🔐
+
+We've now provided a way for users to sign in via their [Twitch](https://twitch.tv), [Discord](https://discord.gg), or [GitHub](https://github.com) accounts! If you already have an account, you can also use this if one of these services uses the same email address as your Doras account. This is a great way to get started with Doras if you don't want to create an account with an email address and password.
+
+
+
+## Find Updates Easier 📖
+
+We've introduced the "Megaphone window" in the top right of the [dashboard](https://admin.doras.to). This will show you the latest updates to Doras, and will also show you what's coming next! This is a great way to keep up to date with what's happening with Doras.
+
+
+
+## What's Coming Next? 🤔
+
+We're focusing on getting ready for the open beta, and a lot of time and resources will be applied to such! This means working on features like the link shortening tools, custom domains, and figuring out some payment provider things to those interested in joining Doras Pro. **Don't worry though,** Doras will always be free to use, and we'll always have a free tier for Doras with the majority of features. We're also working on some other cool things that we'll be announcing soon, so stay tuned!
diff --git a/src/pages/rss-releases.xml.js b/src/pages/rss-releases.xml.js
new file mode 100644
index 0000000..e9d9fe5
--- /dev/null
+++ b/src/pages/rss-releases.xml.js
@@ -0,0 +1,28 @@
+import rss from '@astrojs/rss';
+import { getCollection } from 'astro:content';
+
+export async function GET(context) {
+ let blog = await getCollection('blog');
+
+ // Filter posts by category
+ const updates = blog.filter(post => post.data.category === 'Releases');
+
+ // Sort posts by publishDate in descending order
+ const sortedUpdates = updates.sort((a, b) => new Date(b.data.publishDate) - new Date(a.data.publishDate));
+
+ return rss({
+ title: "Doras Releases",
+ description: "Track all the latest releases of Doras.to",
+ site: context.site,
+ items: sortedUpdates.map((post) => ({
+ title: post.data.title,
+ pubDate: post.data.publishDate,
+ description: post.data.snippet,
+ author: post.data.author,
+ category: post.data.category,
+ // Compute RSS link from post `slug`
+ // This example assumes all posts are rendered as `/blog/[slug]` routes
+ link: `/blog/${post.slug}/`,
+ })),
+ });
+}
\ No newline at end of file
diff --git a/src/pages/rss-updates.xml.js b/src/pages/rss-updates.xml.js
new file mode 100644
index 0000000..4f4355f
--- /dev/null
+++ b/src/pages/rss-updates.xml.js
@@ -0,0 +1,28 @@
+import rss from '@astrojs/rss';
+import { getCollection } from 'astro:content';
+
+export async function GET(context) {
+ let blog = await getCollection('blog');
+
+ // Filter posts by category
+ const updates = blog.filter(post => post.data.category === 'Updates');
+
+ // Sort posts by publishDate in descending order
+ const sortedUpdates = updates.sort((a, b) => new Date(b.data.publishDate) - new Date(a.data.publishDate));
+
+ return rss({
+ title: "The Doras Blog - Updates",
+ description: "Get all the latest updates from Doras",
+ site: context.site,
+ items: sortedUpdates.map((post) => ({
+ title: post.data.title,
+ pubDate: post.data.publishDate,
+ description: post.data.snippet,
+ author: post.data.author,
+ category: post.data.category,
+ // Compute RSS link from post `slug`
+ // This example assumes all posts are rendered as `/blog/[slug]` routes
+ link: `/blog/${post.slug}/`,
+ })),
+ });
+}
\ No newline at end of file