diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..89eb939
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,27 @@
+name: Deploy to Cloudflare Pages
+on: push
+jobs:
+ deploy:
+ name: Deploy
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Setup Bun
+ uses: oven-sh/setup-bun@v1
+
+ - name: Install dependencies
+ run: bun install
+
+ - name: Build site
+ run: bun run build
+
+ - name: Publish to Cloudflare Pages
+ uses: cloudflare/pages-action@v1
+ with:
+ apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
+ accountId: afdc9b319dc9eb7543f28d8e7cd900c0
+ projectName: pink
+ directory: dist/
+ gitHubToken: ${{ secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6240da8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,21 @@
+# build output
+dist/
+# generated types
+.astro/
+
+# dependencies
+node_modules/
+
+# logs
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+
+# environment variables
+.env
+.env.production
+
+# macOS-specific files
+.DS_Store
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..22a1505
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,4 @@
+{
+ "recommendations": ["astro-build.astro-vscode"],
+ "unwantedRecommendations": []
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..d642209
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,11 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "command": "./node_modules/.bin/astro dev",
+ "name": "Development server",
+ "request": "launch",
+ "type": "node-terminal"
+ }
+ ]
+}
diff --git a/astro.config.mjs b/astro.config.mjs
new file mode 100644
index 0000000..c8d8a46
--- /dev/null
+++ b/astro.config.mjs
@@ -0,0 +1,16 @@
+import { defineConfig } from "astro/config";
+import tailwind from "@astrojs/tailwind";
+import cloudflare from "@astrojs/cloudflare";
+import sitemap from "@astrojs/sitemap";
+
+import metaTags from "astro-meta-tags";
+
+// https://astro.build/config
+export default defineConfig({
+ site: "https://kot.pink",
+ output: "hybrid",
+ integrations: [tailwind(), sitemap(), metaTags()],
+ adapter: cloudflare({
+ imageService: "cloudflare",
+ }),
+});
diff --git a/bun.lockb b/bun.lockb
new file mode 100755
index 0000000..26b906d
Binary files /dev/null and b/bun.lockb differ
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..44c6419
--- /dev/null
+++ b/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "kot.pink",
+ "type": "module",
+ "version": "0.0.1",
+ "scripts": {
+ "dev": "astro dev",
+ "start": "astro dev",
+ "build": "astro build",
+ "preview": "wrangler pages dev ./dist",
+ "astro": "astro"
+ },
+ "dependencies": {
+ "@astrojs/cloudflare": "^9.0.1",
+ "@astrojs/sitemap": "^3.0.5",
+ "@astrojs/tailwind": "^5.1.0",
+ "astro": "^4.4.0",
+ "astro-meta-tags": "^0.2.1",
+ "tailwindcss": "^3.4.1"
+ },
+ "devDependencies": {
+ "wrangler": "^3.28.3"
+ }
+}
\ No newline at end of file
diff --git a/public/opengraph.webp b/public/opengraph.webp
new file mode 100644
index 0000000..3c59e3c
Binary files /dev/null and b/public/opengraph.webp differ
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..5b9b3e4
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /
+
+Sitemap: https://kot.pink/sitemap-index.xml
\ No newline at end of file
diff --git a/src/env.d.ts b/src/env.d.ts
new file mode 100644
index 0000000..f964fe0
--- /dev/null
+++ b/src/env.d.ts
@@ -0,0 +1 @@
+///