diff --git a/.github/workflows/publish-dashboard.yaml b/.github/workflows/publish-dashboard.yaml
index fdf31a12..0dda06bb 100644
--- a/.github/workflows/publish-dashboard.yaml
+++ b/.github/workflows/publish-dashboard.yaml
@@ -5,9 +5,12 @@ on:
paths:
- .github/workflows/publish-dashboard.yaml
- packages/dashboard/**
+ - package.json
+ - pnpm-lock.yaml
env:
PUBLIC_APEX_DOMAIN: ${{ vars.PUBLIC_APEX_DOMAIN }}
+ MAIN_BRANCH: v0/main
jobs:
publish:
@@ -47,13 +50,13 @@ jobs:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
- projectName: pockethost-dashboard
- directory: ./dist/dashboard
+ projectName: pockethost-lander
+ directory: ./packages/dashboard/build
branch: ${{ github.head_ref || github.ref_name }}
wranglerVersion: '3'
- name: Discord feature branch notification
- if: github.ref_name != 'v0/main'
+ if: github.ref_name != env.MAIN_BRANCH
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
@@ -61,9 +64,9 @@ jobs:
args: '**DASHBOARD PREVIEW** ${{ steps.deployment.outputs.url }} was generated by ${{ github.actor }} in [${{ env.GIT_COMMIT_SHORT_SHA }}](https://github.com/${{ github.repository}}/commit/${{ github.sha }}) on [${{ github.repository}}#${{ github.ref_name }}](https://github.com/${{ github.repository}}/tree/${{ github.ref_name }}) with memo `${{ env.GIT_COMMIT_MESSAGE_SUBJECT }}`'
- name: Discord live branch notification
- if: github.ref_name == 'v0/main'
+ if: github.ref_name == env.MAIN_BRANCH
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
- args: '**DASHBOARD LIVE** https://app.pockethost.io ([permalink](${{ steps.deployment.outputs.url }})) was updated by ${{ github.actor }} in [${{ env.GIT_COMMIT_SHORT_SHA }}](https://github.com/${{ github.repository}}/commit/${{ github.sha }}) on [${{ github.repository}}#${{ github.ref_name }}](https://github.com/${{ github.repository}}/tree/${{ github.ref_name }}): `${{ env.GIT_COMMIT_MESSAGE_SUBJECT }}`'
+ args: '**DASHBOARD LIVE** https://pockethost.io ([permalink](${{ steps.deployment.outputs.url }})) was updated by ${{ github.actor }} in [${{ env.GIT_COMMIT_SHORT_SHA }}](https://github.com/${{ github.repository}}/commit/${{ github.sha }}) on [${{ github.repository}}#${{ github.ref_name }}](https://github.com/${{ github.repository}}/tree/${{ github.ref_name }}): `${{ env.GIT_COMMIT_MESSAGE_SUBJECT }}`'
diff --git a/.github/workflows/publish-lander.yaml b/.github/workflows/publish-lander.yaml
deleted file mode 100644
index e8589a66..00000000
--- a/.github/workflows/publish-lander.yaml
+++ /dev/null
@@ -1,69 +0,0 @@
-name: Publish Lander to Cloudflare Pages
-
-on:
- push:
- paths:
- - .github/workflows/publish-lander.yaml
- - packages/lander/**
-
-env:
- PUBLIC_APEX_DOMAIN: ${{ vars.PUBLIC_APEX_DOMAIN }}
-
-jobs:
- publish:
- runs-on: ubuntu-latest
- permissions:
- contents: read
- deployments: write
- name: Publish to Cloudflare Pages
- steps:
- - name: Checkout
- uses: actions/checkout@v4.1.1
-
- - name: pnpm
- uses: pnpm/action-setup@v3.0.0
- with:
- version: 9.9.0
-
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4
- with:
- node-version: 20.x
- cache: 'pnpm'
-
- - name: Prepare build
- run: |
- pnpm i
- cd packages/lander
- pnpm build
-
- - name: Expose git commit data
- uses: rlespinasse/git-commit-data-action@v1.5.0
-
- - name: Publish to Cloudflare Pages
- uses: cloudflare/pages-action@v1.5.0
- id: deployment
- with:
- apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
- gitHubToken: ${{ secrets.GITHUB_TOKEN }}
- accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
- projectName: pockethost-lander
- directory: ./dist/lander
- branch: ${{ github.head_ref || github.ref_name }}
- wranglerVersion: '3'
-
- - name: Discord feature branch notification
- if: github.ref_name != 'v0/main'
- env:
- DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
- uses: Ilshidur/action-discord@master
- with:
- args: '**LANDER PREVIEW** ${{ steps.deployment.outputs.url }} was generated by ${{ github.actor }} in [${{ env.GIT_COMMIT_SHORT_SHA }}](https://github.com/${{ github.repository}}/commit/${{ github.sha }}) on [${{ github.repository}}#${{ github.ref_name }}](https://github.com/${{ github.repository}}/tree/${{ github.ref_name }}) with memo `${{ env.GIT_COMMIT_MESSAGE_SUBJECT }}`'
-
- - name: Discord live branch notification
- if: github.ref_name == 'v0/main'
- env:
- DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
- uses: Ilshidur/action-discord@master
- with:
- args: '**LANDER LIVE** https://pockethost.io ([permalink](${{ steps.deployment.outputs.url }})) was updated by ${{ github.actor }} in [${{ env.GIT_COMMIT_SHORT_SHA }}](https://github.com/${{ github.repository}}/commit/${{ github.sha }}) on [${{ github.repository}}#${{ github.ref_name }}](https://github.com/${{ github.repository}}/tree/${{ github.ref_name }}): `${{ env.GIT_COMMIT_MESSAGE_SUBJECT }}`'
diff --git a/.github/workflows/publish-superadmin.yaml b/.github/workflows/publish-superadmin.yaml
deleted file mode 100644
index e1841757..00000000
--- a/.github/workflows/publish-superadmin.yaml
+++ /dev/null
@@ -1,69 +0,0 @@
-name: Publish Superadmin to Cloudflare Pages
-
-on:
- push:
- paths:
- - .github/workflows/publish-superadmin.yaml
- - packages/superadmin/**
-
-env:
- PUBLIC_APEX_DOMAIN: ${{ vars.PUBLIC_APEX_DOMAIN }}
-
-jobs:
- publish:
- runs-on: ubuntu-latest
- permissions:
- contents: read
- deployments: write
- name: Publish to Cloudflare Pages
- steps:
- - name: Checkout
- uses: actions/checkout@v4.1.1
-
- - name: pnpm
- uses: pnpm/action-setup@v3.0.0
- with:
- version: 9.9.0
-
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4
- with:
- node-version: 20.x
- cache: 'pnpm'
-
- - name: Prepare build
- run: |
- pnpm i
- cd packages/superadmin
- pnpm build
-
- - name: Expose git commit data
- uses: rlespinasse/git-commit-data-action@v1.5.0
-
- - name: Publish to Cloudflare Pages
- uses: cloudflare/pages-action@v1.5.0
- id: deployment
- with:
- apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
- gitHubToken: ${{ secrets.GITHUB_TOKEN }}
- accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
- projectName: pockethost-superadmin
- directory: ./dist/superadmin
- branch: ${{ github.head_ref || github.ref_name }}
- wranglerVersion: '3'
-
- - name: Discord feature branch notification
- if: github.ref_name != 'v0/main'
- env:
- DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
- uses: Ilshidur/action-discord@master
- with:
- args: '**SUPERADMIN PREVIEW** ${{ steps.deployment.outputs.url }} was generated by ${{ github.actor }} in [${{ env.GIT_COMMIT_SHORT_SHA }}](https://github.com/${{ github.repository}}/commit/${{ github.sha }}) on [${{ github.repository}}#${{ github.ref_name }}](https://github.com/${{ github.repository}}/tree/${{ github.ref_name }}) with memo `${{ env.GIT_COMMIT_MESSAGE_SUBJECT }}`'
-
- - name: Discord live branch notification
- if: github.ref_name == 'v0/main'
- env:
- DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
- uses: Ilshidur/action-discord@master
- with:
- args: '**SUPERADMIN LIVE** https://superadmin.pockethost.io ([permalink](${{ steps.deployment.outputs.url }})) was updated by ${{ github.actor }} in [${{ env.GIT_COMMIT_SHORT_SHA }}](https://github.com/${{ github.repository}}/commit/${{ github.sha }}) on [${{ github.repository}}#${{ github.ref_name }}](https://github.com/${{ github.repository}}/tree/${{ github.ref_name }}): `${{ env.GIT_COMMIT_MESSAGE_SUBJECT }}`'
diff --git a/.rizzdown/.gitignore b/.rizzdown/.gitignore
deleted file mode 100644
index 2d357cff..00000000
--- a/.rizzdown/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-openai-secret-key
\ No newline at end of file
diff --git a/.rizzdown/blog/audience.md b/.rizzdown/blog/audience.md
deleted file mode 100644
index 9c3893b3..00000000
--- a/.rizzdown/blog/audience.md
+++ /dev/null
@@ -1 +0,0 @@
-The primary audience is software developers, specifically web and nodejs programmers. Lots of interest in cloud services and avoiding writing backends. Many of our users use SvelteKit, React, Vercel, Firebase, and Supabase. My audience does NOT like puffery or flowery language. They like technical inspiration and spending time with tools that will enhance their ability to touch the lives of others with their creations.
diff --git a/.rizzdown/blog/author.md b/.rizzdown/blog/author.md
deleted file mode 100644
index bb692da6..00000000
--- a/.rizzdown/blog/author.md
+++ /dev/null
@@ -1 +0,0 @@
-I run a site called pockethost.io. I am a Typescript and nodejs programmer. I'm pretty experienced, but I focus mostly on backend stuff and I know I'm not the best at frontend ui/ux. I have a passion for open source projects and for helping people make their own creations reach people. I have a lot of experience and am seasoned, yet very patient with newcomers. I like to teach. I like to encourage people. I love to learn. I don't trust horses, and I like jiu jitsu.
diff --git a/.rizzdown/blog/style.md b/.rizzdown/blog/style.md
deleted file mode 100644
index 7c107b12..00000000
--- a/.rizzdown/blog/style.md
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a blog for web and mobile app developers. They are interested in BaaS, as this is our central product. They tend to be well-versed in Typescript and JavaScript, but only have 2-5 years of experience. They like making little apps and inventions to serve specific verticals that they find interesting. They like open source, and they like independence and sovereignty. The blog should have a factual tone with no embellishments. You can include up to one pop culture reference per article, but it should not be a central point.
-
-Use third person language. Do not refer to 'we' or use colloquialisms. Avoid phrases like "squashed pesky bugs" and playful language. Be direct, to the point, and do not attempt to introduce personality into the prose.
diff --git a/.rizzdown/blog/subject.md b/.rizzdown/blog/subject.md
deleted file mode 100644
index 4ed89fa9..00000000
--- a/.rizzdown/blog/subject.md
+++ /dev/null
@@ -1,46 +0,0 @@
-pockethost.io is a hosted version of the open source project named PocketHost (licensed under the MIT open source license) which is based on the PocketBase open source project.
-
-PocketBase is essentially a REST API and admin UI over a SQLite database. PocketBase is written in golang. It provides user management, logging, REST security, as well as an advanced SQLite schema editor and data editor.
-
-PocketHost is a multitenant 'one click' hosting and deployment service for PocketBase. Users can create accounts, create projects with uniquely named subdomains off the pockethost.io apex domain. This way, they don't have to do any setup to get PocketBase running. Our motto is "Up and running in 30 seconds with zero config". As you might imagine, preparing PocketBase for production use takes a lot of Linux administration skills. SSL, DNS, Domain management, CNAMES, Docker containers, restarting on errors, SMTP, etc. PocketHost does all this for the user. We have a Discord channel to provide support and collect feature ideas.
-
-PocketHost has been received very positively by the community and has over 400 stars. It is used by many hobbyist developers as well as live applications.
-
-### Overview
-
-PocketHost hosts your [PocketBase](https://pocketbase.io) projects, so you don't have to. Create a project like you would in Firebase and Supabase and let PocketHost do the rest.
-
-PocketHost is a cloud hosting platform for PocketBase. You can use it to instantly provision a PocketBase backend for your latest project. Features include:
-
-- Create unlimited PocketBase projects, each with a custom subdomain
-- Each instance runs on a subdomain of `pockethost.io`
-- Access your PocketBase instance using the PocketBase JavaScript SDK as easily as `new PocketBase('https://my-project.pockethost.io')`
-- Run your instance in an ultra-beefy shared environment
-
-### Focus on your app
-
-Get a live PocketBase instance in 10 seconds with no backend setup:
-
-1. Create an account at pockethost.io
-2. Provision your first PocketBase instance
-3. Connect from anywhere
-
-```ts
-import PocketBase from 'pocketbase'
-
-const client = new PocketBase(`https://harvest.pockethost.io`)
-```
-
-### Batteries Included
-
-Here's all the Linux/devops stuff that PocketHost does for you:
-
-- Email and DKIM+SPF and more
-- DNS jargon: MX, TXT, CNAME
-- SSL cert provisioning and management
-- Storage
-- Volume mounts
-- Cloud computing or VPS deployment
-- CDN and static asset hosting
-- Amazon AWS
-- Lots more - scaling, firewalls, DDoS defense, user security, log rotation, patches, updates, build tools, CPU architectures, multitenancy, on and on
diff --git a/.rizzdown/docs/audience.md b/.rizzdown/docs/audience.md
deleted file mode 100644
index 9c3893b3..00000000
--- a/.rizzdown/docs/audience.md
+++ /dev/null
@@ -1 +0,0 @@
-The primary audience is software developers, specifically web and nodejs programmers. Lots of interest in cloud services and avoiding writing backends. Many of our users use SvelteKit, React, Vercel, Firebase, and Supabase. My audience does NOT like puffery or flowery language. They like technical inspiration and spending time with tools that will enhance their ability to touch the lives of others with their creations.
diff --git a/.rizzdown/docs/author.md b/.rizzdown/docs/author.md
deleted file mode 100644
index bb692da6..00000000
--- a/.rizzdown/docs/author.md
+++ /dev/null
@@ -1 +0,0 @@
-I run a site called pockethost.io. I am a Typescript and nodejs programmer. I'm pretty experienced, but I focus mostly on backend stuff and I know I'm not the best at frontend ui/ux. I have a passion for open source projects and for helping people make their own creations reach people. I have a lot of experience and am seasoned, yet very patient with newcomers. I like to teach. I like to encourage people. I love to learn. I don't trust horses, and I like jiu jitsu.
diff --git a/.rizzdown/docs/style.md b/.rizzdown/docs/style.md
deleted file mode 100644
index b9bab807..00000000
--- a/.rizzdown/docs/style.md
+++ /dev/null
@@ -1 +0,0 @@
-This prose is technical documentation. It should have an edgy, modern voice that is fun-loving but accurate.
diff --git a/.rizzdown/docs/subject.md b/.rizzdown/docs/subject.md
deleted file mode 100644
index 4ed89fa9..00000000
--- a/.rizzdown/docs/subject.md
+++ /dev/null
@@ -1,46 +0,0 @@
-pockethost.io is a hosted version of the open source project named PocketHost (licensed under the MIT open source license) which is based on the PocketBase open source project.
-
-PocketBase is essentially a REST API and admin UI over a SQLite database. PocketBase is written in golang. It provides user management, logging, REST security, as well as an advanced SQLite schema editor and data editor.
-
-PocketHost is a multitenant 'one click' hosting and deployment service for PocketBase. Users can create accounts, create projects with uniquely named subdomains off the pockethost.io apex domain. This way, they don't have to do any setup to get PocketBase running. Our motto is "Up and running in 30 seconds with zero config". As you might imagine, preparing PocketBase for production use takes a lot of Linux administration skills. SSL, DNS, Domain management, CNAMES, Docker containers, restarting on errors, SMTP, etc. PocketHost does all this for the user. We have a Discord channel to provide support and collect feature ideas.
-
-PocketHost has been received very positively by the community and has over 400 stars. It is used by many hobbyist developers as well as live applications.
-
-### Overview
-
-PocketHost hosts your [PocketBase](https://pocketbase.io) projects, so you don't have to. Create a project like you would in Firebase and Supabase and let PocketHost do the rest.
-
-PocketHost is a cloud hosting platform for PocketBase. You can use it to instantly provision a PocketBase backend for your latest project. Features include:
-
-- Create unlimited PocketBase projects, each with a custom subdomain
-- Each instance runs on a subdomain of `pockethost.io`
-- Access your PocketBase instance using the PocketBase JavaScript SDK as easily as `new PocketBase('https://my-project.pockethost.io')`
-- Run your instance in an ultra-beefy shared environment
-
-### Focus on your app
-
-Get a live PocketBase instance in 10 seconds with no backend setup:
-
-1. Create an account at pockethost.io
-2. Provision your first PocketBase instance
-3. Connect from anywhere
-
-```ts
-import PocketBase from 'pocketbase'
-
-const client = new PocketBase(`https://harvest.pockethost.io`)
-```
-
-### Batteries Included
-
-Here's all the Linux/devops stuff that PocketHost does for you:
-
-- Email and DKIM+SPF and more
-- DNS jargon: MX, TXT, CNAME
-- SSL cert provisioning and management
-- Storage
-- Volume mounts
-- Cloud computing or VPS deployment
-- CDN and static asset hosting
-- Amazon AWS
-- Lots more - scaling, firewalls, DDoS defense, user security, log rotation, patches, updates, build tools, CPU architectures, multitenancy, on and on
diff --git a/.rizzdown/release/audience.md b/.rizzdown/release/audience.md
deleted file mode 100644
index 9c3893b3..00000000
--- a/.rizzdown/release/audience.md
+++ /dev/null
@@ -1 +0,0 @@
-The primary audience is software developers, specifically web and nodejs programmers. Lots of interest in cloud services and avoiding writing backends. Many of our users use SvelteKit, React, Vercel, Firebase, and Supabase. My audience does NOT like puffery or flowery language. They like technical inspiration and spending time with tools that will enhance their ability to touch the lives of others with their creations.
diff --git a/.rizzdown/release/author.md b/.rizzdown/release/author.md
deleted file mode 100644
index bb692da6..00000000
--- a/.rizzdown/release/author.md
+++ /dev/null
@@ -1 +0,0 @@
-I run a site called pockethost.io. I am a Typescript and nodejs programmer. I'm pretty experienced, but I focus mostly on backend stuff and I know I'm not the best at frontend ui/ux. I have a passion for open source projects and for helping people make their own creations reach people. I have a lot of experience and am seasoned, yet very patient with newcomers. I like to teach. I like to encourage people. I love to learn. I don't trust horses, and I like jiu jitsu.
diff --git a/.rizzdown/release/style.md b/.rizzdown/release/style.md
deleted file mode 100644
index a1f203c6..00000000
--- a/.rizzdown/release/style.md
+++ /dev/null
@@ -1 +0,0 @@
-This is a blog post announcing a new version of our open source project, PocketHost. It should have an intelligently humorous opening paragraph followed by a dry, accurate, meticulous description of changes and updates, and why they are important. You can casually mathematically or logically clever notions with hidden meanings.
diff --git a/.rizzdown/release/subject.md b/.rizzdown/release/subject.md
deleted file mode 100644
index 4ed89fa9..00000000
--- a/.rizzdown/release/subject.md
+++ /dev/null
@@ -1,46 +0,0 @@
-pockethost.io is a hosted version of the open source project named PocketHost (licensed under the MIT open source license) which is based on the PocketBase open source project.
-
-PocketBase is essentially a REST API and admin UI over a SQLite database. PocketBase is written in golang. It provides user management, logging, REST security, as well as an advanced SQLite schema editor and data editor.
-
-PocketHost is a multitenant 'one click' hosting and deployment service for PocketBase. Users can create accounts, create projects with uniquely named subdomains off the pockethost.io apex domain. This way, they don't have to do any setup to get PocketBase running. Our motto is "Up and running in 30 seconds with zero config". As you might imagine, preparing PocketBase for production use takes a lot of Linux administration skills. SSL, DNS, Domain management, CNAMES, Docker containers, restarting on errors, SMTP, etc. PocketHost does all this for the user. We have a Discord channel to provide support and collect feature ideas.
-
-PocketHost has been received very positively by the community and has over 400 stars. It is used by many hobbyist developers as well as live applications.
-
-### Overview
-
-PocketHost hosts your [PocketBase](https://pocketbase.io) projects, so you don't have to. Create a project like you would in Firebase and Supabase and let PocketHost do the rest.
-
-PocketHost is a cloud hosting platform for PocketBase. You can use it to instantly provision a PocketBase backend for your latest project. Features include:
-
-- Create unlimited PocketBase projects, each with a custom subdomain
-- Each instance runs on a subdomain of `pockethost.io`
-- Access your PocketBase instance using the PocketBase JavaScript SDK as easily as `new PocketBase('https://my-project.pockethost.io')`
-- Run your instance in an ultra-beefy shared environment
-
-### Focus on your app
-
-Get a live PocketBase instance in 10 seconds with no backend setup:
-
-1. Create an account at pockethost.io
-2. Provision your first PocketBase instance
-3. Connect from anywhere
-
-```ts
-import PocketBase from 'pocketbase'
-
-const client = new PocketBase(`https://harvest.pockethost.io`)
-```
-
-### Batteries Included
-
-Here's all the Linux/devops stuff that PocketHost does for you:
-
-- Email and DKIM+SPF and more
-- DNS jargon: MX, TXT, CNAME
-- SSL cert provisioning and management
-- Storage
-- Volume mounts
-- Cloud computing or VPS deployment
-- CDN and static asset hosting
-- Amazon AWS
-- Lots more - scaling, firewalls, DDoS defense, user security, log rotation, patches, updates, build tools, CPU architectures, multitenancy, on and on
diff --git a/assets/Flounder's Annual Badge.png b/assets/Flounder's Annual Badge.png
new file mode 100644
index 00000000..9d8ff415
Binary files /dev/null and b/assets/Flounder's Annual Badge.png differ
diff --git a/docs/introduction.md b/docs/introduction.md
index 09646756..6dde5174 100644
--- a/docs/introduction.md
+++ b/docs/introduction.md
@@ -6,10 +6,10 @@ PocketHost hosts your [PocketBase](https://pocketbase.io) projects, so you don't
PocketHost is a cloud hosting platform for PocketBase. You can use it to instantly provision a PocketBase backend for your latest project. Features include:
-- Create unlimited PocketBase projects, each with a custom subdomain
+- Create PocketBase projects, each with a custom subdomain
- Each instance runs on a subdomain of `pockethost.io`
-- Access your PocketBase instance using the PocketBase JavaScript SDK as easily as
-`new PocketBase('https://my-project.pockethost.io')`
+- Access your PocketBase instance using the PocketBase JavaScript SDK as easily as
+ `new PocketBase('https://my-project.pockethost.io')`
- Run your instance in an ultra-beefy shared environment.
## 🎯 Focus on your app
@@ -26,7 +26,7 @@ import PocketBase from 'pocketbase'
const client = new PocketBase(`https://harvest.pockethost.io`)
```
-## 🔋Batteries Included
+## 🔋Batteries Included
Here's all the Linux/DevOps stuff that PocketHost does for you:
@@ -38,4 +38,4 @@ Here's all the Linux/DevOps stuff that PocketHost does for you:
- Cloud computing or VPS deployment
- CDN and static asset hosting
- Amazon AWS
-- Lots more - scaling, firewalls, DDoS protection, user security, log retention, patches, updates, build tools, CPU architectures, multitenancy, and the list goes on
\ No newline at end of file
+- Lots more - scaling, firewalls, DDoS protection, user security, log retention, patches, updates, build tools, CPU architectures, multitenancy, and the list goes on
diff --git a/package.json b/package.json
index b73d401c..1f5ec897 100644
--- a/package.json
+++ b/package.json
@@ -9,11 +9,9 @@
"lint": "prettier -c \"./**/*.{ts,js,cjs,svelte,json}\"",
"lint:fix": "prettier -w \"./**/*.{ts,js,cjs,svelte,json}\"",
"dev:cli": "cd packages/pockethost && pnpm dev",
- "dev:lander": "cd packages/lander && pnpm start",
"dev:dashboard": "cd packages/dashboard && pnpm dev",
"dev:superadmin": "cd packages/superadmin && pnpm dev",
"prod:cli": "cd packages/pockethost && pnpm start",
- "plop": "plop --no-progress",
"nofile": "cat /proc/sys/fs/file-nr",
"mail": "tsx ./packages/pockethost/src/cli/sendmail.ts"
},
@@ -65,13 +63,11 @@
"ncp": "^2.0.0",
"nodemon": "^3.0.3",
"ora": "^7.0.1",
- "plop": "^4.0.0",
"postinstall-postinstall": "^2.1.0",
"prettier": "^3.0.3",
"prettier-plugin-jsdoc": "^1.3.0",
"prettier-plugin-organize-imports": "^3.2.3",
"prettier-plugin-svelte": "^3.0.3",
- "rizzdown": "^0.0.7",
"svelte": "^4.2.2",
"tslib": "^2.6.2",
"tsx": "^3.14.0",
@@ -80,7 +76,8 @@
},
"pnpm": {
"patchedDependencies": {
- "eventsource@2.0.2": "patches/eventsource@2.0.2.patch"
+ "eventsource@2.0.2": "patches/eventsource@2.0.2.patch",
+ "@sveltejs/enhanced-img": "patches/@sveltejs__enhanced-img.patch"
}
}
}
diff --git a/packages/dashboard/.force-build b/packages/dashboard/.force-build
deleted file mode 100644
index 73131b36..00000000
--- a/packages/dashboard/.force-build
+++ /dev/null
@@ -1,3 +0,0 @@
-# Modify this file to force a build
-
-asd
diff --git a/packages/dashboard/marked.config.js b/packages/dashboard/marked.config.js
index 5507bea4..db0cb49c 100644
--- a/packages/dashboard/marked.config.js
+++ b/packages/dashboard/marked.config.js
@@ -1,3 +1,4 @@
+import fancyImage from '$src/lib/fancyImage'
import hljs from 'highlight.js'
const highlight = (code, lang) => {
@@ -5,4 +6,4 @@ const highlight = (code, lang) => {
return hljs.highlight(code, { language: lang }).value
}
-export default { highlight }
+export default { highlight, fancyImage }
diff --git a/packages/dashboard/package.json b/packages/dashboard/package.json
index 85e1c1b9..903d3273 100644
--- a/packages/dashboard/package.json
+++ b/packages/dashboard/package.json
@@ -5,40 +5,49 @@
"main": "./src/app.html",
"scripts": {
"check:types": "svelte-check",
- "preview": "npx http-server@latest ../../dist/dashboard -P \"http://localhost:8080?\"",
+ "preview": "npx http-server@latest ./build -P \"http://localhost:8080?\"",
"dev": "vite dev",
"build": "NODE_ENV=production vite build",
"lint": "prettier --check .",
- "format": "prettier --write ."
+ "format": "prettier --write .",
+ "postbuild": "svelte-sitemap --domain https://pockethost.io"
},
"type": "module",
"devDependencies": {
- "@microsoft/fetch-event-source": "https://github.com/pockethost/fetch-event-source.git#ebe3b7122647b48b93fd11effbbfb915d98956b0",
- "pockethost": "workspace:../pockethost",
- "@s-libs/micro-dash": "^16.1.0",
- "@sveltejs/adapter-static": "^2.0.3",
- "@sveltejs/kit": "^1.25.2",
- "@tailwindcss/typography": "^0.5.10",
- "@types/bootstrap": "^5.2.6",
- "@types/d3-scale": "^4.0.3",
- "@types/d3-scale-chromatic": "^3.0.0",
- "@types/js-cookie": "^3.0.2",
- "autoprefixer": "^10.4.16",
+ "@fortawesome/free-brands-svg-icons": "^6.6.0",
+ "@fortawesome/free-regular-svg-icons": "^6.6.0",
+ "@fortawesome/free-solid-svg-icons": "^6.6.0",
+ "@microsoft/fetch-event-source": "github:pockethost/fetch-event-source#ebe3b7122647b48b93fd11effbbfb915d98956b0",
+ "@s-libs/micro-dash": "^18.0.0",
+ "@sveltejs/adapter-static": "^3.0.5",
+ "@sveltejs/enhanced-img": "^0.3.8",
+ "@sveltejs/kit": "^2.6.2",
+ "@sveltejs/vite-plugin-svelte": "^3.1.2",
+ "@tailwindcss/typography": "^0.5.15",
+ "@types/bootstrap": "^5.2.10",
+ "@types/d3-scale": "^4.0.8",
+ "@types/d3-scale-chromatic": "^3.0.3",
+ "@types/js-cookie": "^3.0.6",
+ "autoprefixer": "^10.4.20",
"boolean": "^3.2.0",
- "chart.js": "4.4.0",
"d3-scale": "^4.0.2",
- "d3-scale-chromatic": "^3.0.0",
- "daisyui": "^4.4.23",
- "date-fns": "^2.30.0",
- "highlight.js": "^11.8.0",
- "sass": "^1.68.0",
- "svelte": "^4.2.1",
- "svelte-chartjs": "3.1.2",
- "svelte-check": "^3.5.2",
- "svelte-highlight": "^7.3.0",
- "svelte-preprocess": "^5.0.4",
- "tailwindcss": "^3.3.3",
- "vite": "^4.4.9",
- "@pockethost/plugin-console-logger": "workspace:*"
+ "d3-scale-chromatic": "^3.1.0",
+ "daisyui": "^4.12.12",
+ "date-fns": "^4.1.0",
+ "highlight.js": "^11.10.0",
+ "just-camel-case": "^6.2.0",
+ "mdsvex": "^0.12.3",
+ "mdsvex-enhanced-images": "^0.2.2",
+ "pockethost": "workspace:^",
+ "sass": "^1.79.4",
+ "svelte": "^4.2.19",
+ "svelte-check": "^4.0.4",
+ "svelte-fa": "^4.0.3",
+ "svelte-highlight": "^7.7.0",
+ "svelte-preprocess": "^6.0.3",
+ "svelte-sitemap": "^2.6.0",
+ "tailwindcss": "^3.4.13",
+ "unist-util-visit": "^5.0.0",
+ "vite": "^5.4.8"
}
}
diff --git a/packages/dashboard/src/app.css b/packages/dashboard/src/app.css
index f390fb05..94d386dd 100644
--- a/packages/dashboard/src/app.css
+++ b/packages/dashboard/src/app.css
@@ -10,5 +10,14 @@
}
.prose :where(p):not(:where([class~='not-prose'], [class~='not-prose'] *)) {
- @apply mt-0 mb-0;
+ @apply mt-2 mb-2;
+}
+
+.docs-content img {
+ @apply border-accent rounded-lg border;
+}
+
+.prose :where(li):not(:where([class~='not-prose'], [class~='not-prose'] *)) {
+ @apply mt-0 mb-0;
+ line-height: 1.5em;
}
diff --git a/packages/dashboard/src/app.html b/packages/dashboard/src/app.html
index 89040c73..9ecdc56b 100644
--- a/packages/dashboard/src/app.html
+++ b/packages/dashboard/src/app.html
@@ -7,19 +7,9 @@
-
-
-
-
-
-
%sveltekit.head%
-
- You're on the Legacy plan. Everything works, but you can't create new
- projects. Unlock more features by supporting PocketHost. This plan may
- be sunset eventually.
-
- Super elite! The Founder's Edition is our way of saying thanks
- for supporting PocketHost in these early days. Choose between
- lifetime and annual options.
-
diff --git a/packages/dashboard/src/routes/account/Card.svelte b/packages/dashboard/src/routes/(app)/account/Card.svelte
similarity index 95%
rename from packages/dashboard/src/routes/account/Card.svelte
rename to packages/dashboard/src/routes/(app)/account/Card.svelte
index 0159ecc7..a516f79d 100644
--- a/packages/dashboard/src/routes/account/Card.svelte
+++ b/packages/dashboard/src/routes/(app)/account/Card.svelte
@@ -65,8 +65,8 @@
{/each}
{#if !upgradable}
- To change to this plan, contact @noaxis on Discordcontact support
{/if}
{/if}
diff --git a/packages/dashboard/src/routes/account/Check.svelte b/packages/dashboard/src/routes/(app)/account/Check.svelte
similarity index 100%
rename from packages/dashboard/src/routes/account/Check.svelte
rename to packages/dashboard/src/routes/(app)/account/Check.svelte
diff --git a/packages/dashboard/src/routes/account/FAQItem.svelte b/packages/dashboard/src/routes/(app)/account/FAQItem.svelte
similarity index 100%
rename from packages/dashboard/src/routes/account/FAQItem.svelte
rename to packages/dashboard/src/routes/(app)/account/FAQItem.svelte
diff --git a/packages/dashboard/src/routes/account/FAQSection.svelte b/packages/dashboard/src/routes/(app)/account/FAQSection.svelte
similarity index 97%
rename from packages/dashboard/src/routes/account/FAQSection.svelte
rename to packages/dashboard/src/routes/(app)/account/FAQSection.svelte
index 263b51d6..bf47fc1b 100644
--- a/packages/dashboard/src/routes/account/FAQSection.svelte
+++ b/packages/dashboard/src/routes/(app)/account/FAQSection.svelte
@@ -1,6 +1,6 @@
+ import { PLAN_NAMES, SubscriptionType } from 'pockethost'
+ import { userStore } from '$util/stores'
+ import { onMount } from 'svelte'
+ import PricingCard from '$src/routes/(static)/pricing/PricingCard.svelte'
+
+ export let priceMonthly: [number, string?, number?] = [
+ 359,
+ 'once, use forever',
+ 299,
+ ]
+ export let priceAnnually: [number, string?, number?] = [
+ 159,
+ 'year (save 55%)',
+ 99,
+ ]
+ export let comingSoonText = ''
+ export let comingSoon = false
+ export let startDate: Date | null = null
+
+
+
diff --git a/packages/dashboard/src/routes/(app)/dashboard/+page.svelte b/packages/dashboard/src/routes/(app)/dashboard/+page.svelte
new file mode 100644
index 00000000..8dfff11f
--- /dev/null
+++ b/packages/dashboard/src/routes/(app)/dashboard/+page.svelte
@@ -0,0 +1,42 @@
+
+
+
+ Dashboard - PocketHost
+
+
+
diff --git a/packages/dashboard/src/routes/app/instances/[instanceId]/Toggle.svelte b/packages/dashboard/src/routes/(app)/instances/[instanceId]/Toggle.svelte
similarity index 78%
rename from packages/dashboard/src/routes/app/instances/[instanceId]/Toggle.svelte
rename to packages/dashboard/src/routes/(app)/instances/[instanceId]/Toggle.svelte
index 340f782a..0d408a1f 100644
--- a/packages/dashboard/src/routes/app/instances/[instanceId]/Toggle.svelte
+++ b/packages/dashboard/src/routes/(app)/instances/[instanceId]/Toggle.svelte
@@ -1,10 +1,9 @@
-
- Admin Sync
-
+Admin Sync
- Your instance will have an admin login that matches your pockethost.io login.
+ Admin Sync ensures that your instance always has an admin account that matches the login credentials of your pockethost.io account.
-
+
diff --git a/packages/dashboard/src/routes/app/instances/[instanceId]/delete/+page.svelte b/packages/dashboard/src/routes/(app)/instances/[instanceId]/delete/+page.svelte
similarity index 95%
rename from packages/dashboard/src/routes/app/instances/[instanceId]/delete/+page.svelte
rename to packages/dashboard/src/routes/(app)/instances/[instanceId]/delete/+page.svelte
index 006e8beb..3047b9b0 100644
--- a/packages/dashboard/src/routes/app/instances/[instanceId]/delete/+page.svelte
+++ b/packages/dashboard/src/routes/(app)/instances/[instanceId]/delete/+page.svelte
@@ -2,7 +2,6 @@
import { goto } from '$app/navigation'
import Card from '$components/cards/Card.svelte'
import CardHeader from '$components/cards/CardHeader.svelte'
- import { DOCS_URL } from '$src/env'
import { client } from '$src/pocketbase-client'
import { globalInstancesStore } from '$util/stores'
import { instance } from '../store'
@@ -48,7 +47,7 @@
delete newInstances[id]
return newInstances
})
- goto('/')
+ goto('/dashboard')
})
.catch((error) => {
console.error(error)
@@ -64,9 +63,7 @@
}
-
- Delete Instance
-
+Delete Instance
{#if !maintenance}
- import Card from '$components/cards/Card.svelte'
import CardHeader from '$components/cards/CardHeader.svelte'
- import { DOCS_URL } from '$src/env'
import { client } from '$src/pocketbase-client'
import { instance } from '../store'
import ErrorMessage from '../settings/ErrorMessage.svelte'
@@ -22,7 +20,7 @@
}
-Dev Mode
+Dev Mode
Starting with PocketBase v0.20.1, your instance will show debugging output in
diff --git a/packages/dashboard/src/routes/app/instances/[instanceId]/domain/+page.svelte b/packages/dashboard/src/routes/(app)/instances/[instanceId]/domain/+page.svelte
similarity index 60%
rename from packages/dashboard/src/routes/app/instances/[instanceId]/domain/+page.svelte
rename to packages/dashboard/src/routes/(app)/instances/[instanceId]/domain/+page.svelte
index f9b0cef3..598dcf7f 100644
--- a/packages/dashboard/src/routes/app/instances/[instanceId]/domain/+page.svelte
+++ b/packages/dashboard/src/routes/(app)/instances/[instanceId]/domain/+page.svelte
@@ -1,9 +1,8 @@
-
- Custom Domain (CNAME)
-
+
+
+ Custom Domain (CNAME)
+
-
- Use a custom domain (CNAME) with your PocketHost instance.
-
+
+
diff --git a/packages/dashboard/src/routes/(static)/docs/+page.md b/packages/dashboard/src/routes/(static)/docs/+page.md
new file mode 100644
index 00000000..5fa3ab56
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/+page.md
@@ -0,0 +1,49 @@
+# Welcome to PocketHost
+
+PocketHost is a hosting platform tailored for developers, indie hackers, makers, and small businesses using [PocketBase](https://pocketbase.io/) for their web and mobile applications. It offers a streamlined, efficient, and scalable solution to deploy and manage PocketBase instances without the complexities of setting up and maintaining your own servers.
+
+Founded by [Ben Allfree](https://github.com/benallfree) in 2021, PocketHost was born out of the need for a simpler way to handle PocketBase deployments. Tired of the repetitive process of setting up PocketBase every time he started a new project, Ben created PocketHost to save time and effort—not just for himself but for the entire developer community.
+
+## **Simplicity and Ease of Use**
+
+- **Quick Deployment**: Launch your PocketBase instances in minutes without dealing with server configurations.
+- **User-Friendly Interface**: Manage your projects effortlessly through an intuitive dashboard.
+
+## **Scalability and Performance**
+
+- **Dynamic Resource Allocation**: Your application scales automatically based on its needs, ensuring optimal performance.
+- **Docker Containerization**: Each instance runs in an isolated Docker container for enhanced security and efficiency.
+- **High Efficiency**: Our innovative architecture allows thousands of instances to run on a single VPS.
+
+## **Cost-Effective Solutions**
+
+- **Flexible Pricing**: Choose from our Free Tier, Pro Tier, or limited-time Lifetime Offers to suit your budget.
+- **Fair Use Policy**: Enjoy generous project limits, storage, bandwidth, and CPU based on fair use.
+- **No Hidden Fees**: Transparent pricing with no unexpected charges.
+
+## **Community and Support**
+
+- **Growing User Base**: Join over 10,000 users who trust PocketHost for their hosting needs.
+- **Open Source Commitment**: PocketHost is completely open-source under the MIT License, encouraging community contributions and transparency.
+- **Special Acknowledgments**: Benefit from the support and advice of industry experts like Gani at [PocketBase](https://pocketbase.io/).
+
+## **Security and Reliability**
+
+- **Isolated Environments**: Docker containerization ensures your data is isolated and secure.
+- **Innovative Technology**: Leveraging cutting-edge solutions for resource management and scalability.
+- **Regular Updates**: Continuous improvements and updates to keep your applications running smoothly.
+
+## Who Should Use PocketHost?
+
+- **Indie Hackers and Makers**: Perfect for those who want to focus on building and innovating without the hassle of server management.
+- **Small Businesses**: An affordable solution that scales with your business needs.
+- **Developers**: Ideal for deploying prototypes, proofs of concept, or full-scale applications quickly.
+- **Educators and Students**: A great tool for learning and teaching web and mobile application development.
+
+## Key Features
+
+- **Generous Project Limits**: Create and manage multiple projects within our fair use guidelines.
+- **Fair Use Resources**: Generous allocation of storage, bandwidth, and CPU based on fair use.
+- **Flexible Plans**: From free forever plans to premium subscriptions and exclusive lifetime offers.
+- **Easy Integration**: Seamlessly integrate with PocketBase and other tools.
+- **Community Support**: Access to a community of like-minded developers and comprehensive documentation.
diff --git a/packages/dashboard/src/routes/(static)/docs/accessing/+page.md b/packages/dashboard/src/routes/(static)/docs/accessing/+page.md
new file mode 100644
index 00000000..52c8d8cb
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/accessing/+page.md
@@ -0,0 +1,15 @@
+# Accessing an Instance
+
+Your PocketBase instance managed by PocketHost can be accessed in several ways:
+
+1. `.pockethost.io`
+2. `.pockethost.io`
+3. [FTP access](/docs/ftp) for direct file management
+
+Each PocketHost instance is assigned a permanent UUID, and a unique subdomain that you can customize and update at any time.
+
+> **Example:** I use PocketHost to run the backend for my web game, Harvest. I created a PocketHost instance and chose the subdomain `harvest`, making it accessible at `https://harvest.pockethost.io`. Since instances can be [renamed](/docs/rename-instance/), PocketHost also assigns a permanent UUID. In this case, the UUID is `mfsicdp6ia1zpiu`, so the instance is always accessible at `https://mfsicdp6ia1zpiu.pockethost.io`, regardless of subdomain changes.
+
+Custom domains are supported at the Pro level, and we manage SSL certificates for you. Learn more about setting up custom domains [here](/docs/custom-domains).
+
+For direct file access, you can use [FTP access](/docs/ftp) to manage files like backups, uploads, and logs directly on your instance.
diff --git a/packages/dashboard/src/routes/(static)/docs/account-creation/+page.md b/packages/dashboard/src/routes/(static)/docs/account-creation/+page.md
new file mode 100644
index 00000000..ed1cb4f3
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/account-creation/+page.md
@@ -0,0 +1,15 @@
+# Account Creation
+
+Create your PocketHost account to deploy and manage your PocketBase instances.
+
+## Steps
+
+1. **Sign Up**: Go to [pockethost.io](https://pockethost.io) and provide a valid email and password.
+2. **Email Verification**: Check your email for a verification link and click it.
+ - **Note**: Unverified accounts and their instances are deleted after **7 days**.
+3. **Start Using PocketHost**: Once verified, you're all set to create and manage your instances.
+
+## Important
+
+- **Email Changes**: To change your email, visit our [Support Page](/support). Re-verification is required.
+- **Verification Required**: You cannot use instances until your email is verified.
diff --git a/packages/dashboard/src/routes/(static)/docs/admin-sync/+page.md b/packages/dashboard/src/routes/(static)/docs/admin-sync/+page.md
new file mode 100644
index 00000000..0d3596b5
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/admin-sync/+page.md
@@ -0,0 +1,19 @@
+# Admin Sync
+
+Admin Sync ensures that your instance always has an admin account that matches the login credentials of your pockethost.io account.
+
+## Enabling Admin Sync
+
+
+
+When Admin Sync is enabled, your pockethost.io account credentials are automatically copied as an admin login to your instance before it launches.
+
+If you update your pockethost.io credentials while an instance is running, the new credentials will not be synced until the instance is restarted. To apply the changes immediately, [power down the instance](/docs/power) and relaunch it.
+
+By default, Admin Sync is enabled, ensuring that when an instance is created, it has an admin account matching your pockethost.io login. This security feature prevents unauthorized users from creating the initial admin account.
+
+## Disabling Admin Sync
+
+
+
+When Admin Sync is disabled, your pockethost.io credentials will no longer be copied to your instance in future launches.
diff --git a/packages/dashboard/src/routes/(static)/docs/admin-sync/2024-10-06-09-11-52.png b/packages/dashboard/src/routes/(static)/docs/admin-sync/2024-10-06-09-11-52.png
new file mode 100644
index 00000000..f3ab1b04
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/admin-sync/2024-10-06-09-11-52.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/admin-sync/2024-10-06-14-34-37.png b/packages/dashboard/src/routes/(static)/docs/admin-sync/2024-10-06-14-34-37.png
new file mode 100644
index 00000000..872b8af2
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/admin-sync/2024-10-06-14-34-37.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/admin-sync/2024-10-06-14-34-55.png b/packages/dashboard/src/routes/(static)/docs/admin-sync/2024-10-06-14-34-55.png
new file mode 100644
index 00000000..9b64e8ba
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/admin-sync/2024-10-06-14-34-55.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/backup-restore/+page.md b/packages/dashboard/src/routes/(static)/docs/backup-restore/+page.md
new file mode 100644
index 00000000..cc0c91b9
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/backup-restore/+page.md
@@ -0,0 +1,38 @@
+# Backing Up and Restoring
+
+PocketBase offers built-in backup and restore features, making it easy to secure your data and recover from potential issues. However, there are important considerations and alternative methods to ensure your backups are safe and reliable.
+
+## Backup and Restore via Admin
+
+PocketBase has a simple backup and restore feature available directly from the admin panel. You can create backups of your instance's data and restore from those backups when needed.
+
+
+
+- **No need to power off**: You can perform backups and restores through the admin panel without powering off your instance, ensuring minimal disruption to your application.
+
+However, if your instance becomes unresponsive or the admin interface is inaccessible, you may need to use alternative methods for backing up and restoring.
+
+## Backup and Restore via FTP
+
+If the admin panel’s backup and restore feature is unavailable or your instance is unresponsive, you can manually back up your data via [FTP](/docs/ftp). This allows you to access all PocketBase files, including the database and uploads, so you can create manual backups and restore them if necessary.
+
+## S3 and Scheduled Backups
+
+Automating your backups is a recommended practice, especially as your instance grows in complexity and usage. However, there are some important caveats:
+
+- **Hibernation**: If your instance is in [hibernation](/docs/limits), automated backups may fail to execute. Waking up the instance on a schedule will not trigger any missed backup intervals. As your instance becomes busier, hibernation will become less frequent, minimizing this issue. To learn more, see [S3](/docs/s3) and [Limits](/docs/limits).
+
+- **S3 backups**: Backing up to S3 (or another external storage solution) is highly recommended. Using S3 allows you to conserve your PocketHost storage space for critical resources such as your database and logs, which cannot be stored elsewhere. Files such as uploads and backups, on the other hand, can easily live on S3.
+
+- **FTP access to backups**: Note that backups stored in S3 are **not** accessible via FTP. You will need to manage these backups directly through S3 or your chosen storage provider.
+
+## Best Practices
+
+To ensure your data is always secure:
+
+1. **Regularly back up** your instance using the admin panel or automated methods like S3.
+2. **Use external storage** (e.g., S3) for backups and file uploads to avoid consuming valuable PocketHost storage space.
+3. If automating backups, ensure your instance is awake and running during scheduled backup intervals.
+4. Keep in mind that **manual FTP backups** are available if your instance becomes inaccessible via the admin panel.
+
+By following these practices, you can maintain a reliable backup strategy and ensure your data is safe.
diff --git a/packages/dashboard/src/routes/(static)/docs/backup-restore/2024-10-06-15-45-55.png b/packages/dashboard/src/routes/(static)/docs/backup-restore/2024-10-06-15-45-55.png
new file mode 100644
index 00000000..e12c8d19
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/backup-restore/2024-10-06-15-45-55.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/create/+page.md b/packages/dashboard/src/routes/(static)/docs/create/+page.md
new file mode 100644
index 00000000..d0bbaeda
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/create/+page.md
@@ -0,0 +1,7 @@
+# Creating an Instance
+
+
+
+Each PocketHost instance runs on its own unique subdomain. To create a new instance, simply go to [Create New Instance](/instances/new).
+
+Choose a unique name for your instance, and that’s it! Your new PocketBase instance will be up and running in no time.
diff --git a/packages/dashboard/src/routes/(static)/docs/create/2024-10-06-14-33-11.png b/packages/dashboard/src/routes/(static)/docs/create/2024-10-06-14-33-11.png
new file mode 100644
index 00000000..293a21ee
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/create/2024-10-06-14-33-11.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/custom-binaries/+page.md b/packages/dashboard/src/routes/(static)/docs/custom-binaries/+page.md
new file mode 100644
index 00000000..0551f963
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/custom-binaries/+page.md
@@ -0,0 +1,7 @@
+# Custom Binaries
+
+Custom PocketBase binaries are currently not supported due to security concerns.
+
+If you're interested in this feature, please reach out to [support](/support) and make your case.
+
+As an alternative, you can [extend PocketBase via JavaScript](/docs/js).
diff --git a/packages/dashboard/src/routes/(static)/docs/custom-domains/+page.md b/packages/dashboard/src/routes/(static)/docs/custom-domains/+page.md
new file mode 100644
index 00000000..000b9799
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/custom-domains/+page.md
@@ -0,0 +1,36 @@
+# Custom Domains
+
+PocketHost instances can use a custom domain (CNAME) instead of the default `*.pockethost.io` (Pro feature only).
+
+## Overview
+
+
+
+We recommend using Cloudflare, as they support [CNAME flattening](https://developers.cloudflare.com/dns/cname-flattening/), which allows you to use a root domain like `mydomain.com` instead of a subdomain like `foo.mydomain.com`.
+
+After configuring your CNAME, navigate to the Settings tab of your instance in the PocketHost Dashboard to add your custom domain (Pro feature only).
+
+To complete the setup and verify the domain, you will need to contact [PocketHost Support](/support). This is also required any time you change the domain.
+
+## Transferring Name Server Control Without Moving the Domain
+
+A common misconception is that you need to transfer your domain from its current registrar to manage DNS settings with Cloudflare. However, this is not the case. You can retain your domain at your current registrar and simply transfer name server control to Cloudflare. Here's how:
+
+1. Sign up for a Cloudflare account and add your domain.
+2. Cloudflare will provide you with two name servers (NS records).
+3. Update your domain's name server records at your current registrar to point to the Cloudflare name servers.
+4. Once updated, you can manage your DNS settings, including adding a CNAME for your PocketHost instance, via Cloudflare while keeping your domain at your original registrar.
+
+This process allows you to take advantage of Cloudflare's DNS management and features, such as CNAME flattening, without transferring your domain away from your registrar.
+
+## CNAME Flattening
+
+CNAME flattening is a feature provided by Cloudflare that allows you to point a root domain (e.g., `mydomain.com`) to another domain, such as your PocketHost instance, which typically requires a CNAME record. Normally, CNAME records are only supported on subdomains (e.g., `foo.mydomain.com`), but Cloudflare’s CNAME flattening lets you use a root domain for the same purpose.
+
+By enabling CNAME flattening, you can set up your custom domain to resolve directly to your PocketHost instance, even if it's on the root level, ensuring a seamless experience for users accessing your site.
+
+## Static Files and Custom Domains
+
+When you set up a custom domain with PocketHost, all static files in the `pb_public` directory of your instance will also be served through your custom domain. These static files are accessible over HTTPS, providing a secure and reliable solution for serving static sites and assets. This is an ideal setup for static site generation (SSG) projects or simple static websites.
+
+With this configuration, you can host static files like HTML, CSS, and JavaScript directly on your PocketHost instance and deliver them through your custom domain, complete with SSL encryption, without the need for an external hosting provider.
diff --git a/packages/dashboard/src/routes/(static)/docs/custom-domains/2024-10-06-15-07-14.png b/packages/dashboard/src/routes/(static)/docs/custom-domains/2024-10-06-15-07-14.png
new file mode 100644
index 00000000..168b38ca
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/custom-domains/2024-10-06-15-07-14.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/delete/+page.md b/packages/dashboard/src/routes/(static)/docs/delete/+page.md
new file mode 100644
index 00000000..00f13064
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/delete/+page.md
@@ -0,0 +1,17 @@
+# Deleting an Instance
+
+Deleting an instance will immediately power it down and permanently remove all associated data.
+
+Before you can delete an instance, it must first be [powered off](/docs/power).
+
+Once deleted, the following will be permanently erased:
+
+- Your subdomain
+- All files in `pb_data/*`
+- All files in `pb_public/*`
+- All files in `pb_migrations/*`
+- All files in `pb_static/*`
+
+
+
+
diff --git a/packages/dashboard/src/routes/(static)/docs/delete/2024-10-06-14-43-21.png b/packages/dashboard/src/routes/(static)/docs/delete/2024-10-06-14-43-21.png
new file mode 100644
index 00000000..e48dd626
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/delete/2024-10-06-14-43-21.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/delete/2024-10-06-14-43-44.png b/packages/dashboard/src/routes/(static)/docs/delete/2024-10-06-14-43-44.png
new file mode 100644
index 00000000..60ca1d61
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/delete/2024-10-06-14-43-44.png differ
diff --git a/packages/lander/content/docs/usage/dev-mode.md b/packages/dashboard/src/routes/(static)/docs/dev-mode/+page.md
similarity index 68%
rename from packages/lander/content/docs/usage/dev-mode.md
rename to packages/dashboard/src/routes/(static)/docs/dev-mode/+page.md
index d0df79ac..e608e68d 100644
--- a/packages/lander/content/docs/usage/dev-mode.md
+++ b/packages/dashboard/src/routes/(static)/docs/dev-mode/+page.md
@@ -1,8 +1,6 @@
----
-title: Dev Mode
-category: usage
-description: Dev Mode shows PocketBase debugging output to the instance logs
----
+# Dev Mode
+
+
Begining with PocketBase 0.20.1, you may supply a `--dev` flag to make PocketBase output debugging information to the console.
diff --git a/packages/dashboard/src/routes/(static)/docs/dev-mode/2024-10-06-14-36-37.png b/packages/dashboard/src/routes/(static)/docs/dev-mode/2024-10-06-14-36-37.png
new file mode 100644
index 00000000..8cd6967e
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/dev-mode/2024-10-06-14-36-37.png differ
diff --git a/packages/lander/content/docs/usage/errors.md b/packages/dashboard/src/routes/(static)/docs/errors.md
similarity index 100%
rename from packages/lander/content/docs/usage/errors.md
rename to packages/dashboard/src/routes/(static)/docs/errors.md
diff --git a/packages/dashboard/src/routes/(static)/docs/faq/+page.md b/packages/dashboard/src/routes/(static)/docs/faq/+page.md
new file mode 100644
index 00000000..fa8695e1
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/faq/+page.md
@@ -0,0 +1,96 @@
+# FAQ
+
+## About
+
+### What is PocketHost?
+
+[PocketHost](https://github.com/pockethost/pockethost) is an open-source, multitenant hosting platform designed for deploying and managing PocketBase backends. Licensed under the MIT license, PocketHost was created by [benallfree](https://github.com/benallfree) and is maintained by a community of contributors. Ben built PocketHost to simplify hosting for his personal and client projects, eliminating the need to set up hosting from scratch every time.
+
+The goal of PocketHost is to provide a Firebase/Supabase-like experience where users can instantly provision new PocketBase instances.
+
+In addition to hosting, PocketHost supports services like backup, restore, SFTP access, static file hosting, and Node.js cloud workers. It aims to deliver a turnkey solution for quickly deploying small and medium-sized PocketBase projects with minimal setup.
+
+### What is pockethost.io?
+
+[pockethost.io](https://pockethost.io) is the official hosting service powered by the open-source PocketHost project, also maintained by [benallfree](https://github.com/benallfree).
+
+### What are the long-term plans?
+
+PocketHost was created to serve the PocketBase community, combining the sovereignty benefits of self-hosting with the convenience of managed hosting.
+
+Development priorities are driven by personal and community needs, and contributions from everyone are encouraged.
+
+PocketHost has a 10-year endowment to offer free hosting for hobby and low- to mid-volume projects. We are also experimenting with a paid tier for power users. Future revenue streams may include professional services, enterprise setups, customization, and priority support.
+
+Rest assured, you can always export your instance data and self-host if needed.
+
+## Data, Privacy, and Security
+
+### How stable is it?
+
+pockethost.io and PocketHost are highly stable, with over 99.9% uptime. Any outages are documented in [the system health megathread](https://discord.com/channels/1128192380500193370/1179852349011939439).
+
+### How often does my data get backed up?
+
+Data is backed up daily by us. You can also back up your data anytime using SFTP.
+
+### Is my data safe and secure?
+
+Yes, your data on pockethost.io is as secure as it would be on your own server—potentially more so, given that our infrastructure is rigorously tested. Access to the pockethost.io infrastructure is secured via SSH with RSA-2048 encryption.
+
+While the data volume is not encrypted at the OS level (see [#143](https://github.com/benallfree/pockethost/issues/143) for details), the VPS itself is encrypted by Digital Ocean. You can always back up and download your data via SFTP using your pockethost.io credentials.
+
+### Can I import data into PocketHost?
+
+Yes, data import is possible via [SFTP](/docs/ftp/).
+
+### How do I migrate away from PocketHost and host PocketBase on my own?
+
+You can use the SFTP feature to download and transfer all your data.
+
+## Pricing, Limits, and Usage Restrictions
+
+### How much does the service cost?
+
+PocketHost offers a free tier that is free forever, along with experimental paid tiers for power users.
+
+### What is the pockethost.io free tier and its restrictions?
+
+The free tier includes:
+
+- Fair Use of CPU, bandwidth, and storage
+- Up to 25 projects
+- Connect your instance at `your-instance.pockethost.io`
+
+In practice, 99.9% of projects stay within our fair use guidelines. If your project exceeds the limits, we will work with you to transition to a more suitable plan.
+
+### What paid plans are available?
+
+We offer a paid plan that includes:
+
+- Expanded Fair Use CPU, bandwidth, and storage
+- 250 projects
+- Priority support
+- Access to additional premium features as they are introduced
+
+### Can I run multiple projects on PocketHost?
+
+Yes! You can provision as many PocketBase instances as you need. The free tier allows up to 25 projects, while the paid plan allows for 250 projects.
+
+## PocketBase
+
+### How does outgoing email work?
+
+Currently, you need to configure your own outgoing email service (SES recommended). We are tracking future plans for built-in SMTP support [#24](https://github.com/benallfree/pockethost/issues/24) and discussing options [#154](https://github.com/benallfree/pockethost/discussions/154).
+
+### How does S3 storage work?
+
+You can set up S3 storage just like with a standalone PocketBase instance, though it’s often unnecessary, as our infrastructure already handles static asset hosting efficiently.
+
+### What versions of PocketBase do you support, and how do I upgrade?
+
+We support all versions of PocketBase. New versions are picked up automatically, and your instance will be upgraded with patch releases. However, upgrades across major versions are locked by default. Contact us if you wish to perform a major upgrade.
+
+### Can I host custom PocketBase binaries or a custom Node.js backend?
+
+Custom backend code is supported via `pb_hooks`. Support for custom PocketBase binaries and custom Node.js backends is in development.
diff --git a/packages/dashboard/src/routes/(static)/docs/ftp/+page.md b/packages/dashboard/src/routes/(static)/docs/ftp/+page.md
new file mode 100644
index 00000000..322fdb0a
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/ftp/+page.md
@@ -0,0 +1,35 @@
+# FTP Access
+
+PocketHost provides Secure FTP (FTPS) access to all your PocketBase files.
+
+## Accessing via FTP
+
+Use the FTP address provided via `ftp.pockethost.io`. You log in with your pockethost.io username and password.
+
+
+
+
+
+Upon login, you'll see a directory for each instance associated with your account. Inside each instance directory, you'll find the following:
+
+| Directory Name | Description | Instructions |
+| --------------- | ---------------------------------------------- | ---------------------------------------------------------------------------------- |
+| pb_data | The PocketBase data directory | [View details](https://pocketbase.io/docs/going-to-production/) |
+| pb_data/backups | The PocketBase database backups | [View details](https://pocketbase.io/docs/going-to-production/#backup-and-restore) |
+| pb_data/storage | The PocketBase uploaded file storage directory | [View details](https://pocketbase.io/docs/files-handling/) |
+| pb_public | The directory for public static files | [View details](https://pocketbase.io/docs) |
+| pb_migrations | The PocketBase migrations directory | [View details](https://pocketbase.io/docs/migrations/) |
+| pb_hooks | The PocketBase JS hooks directory | [View details](https://pocketbase.io/docs/js-overview/) |
+
+## Recommended FTP Clients
+
+### GUI
+
+- [FileZilla](https://filezilla-project.org/) – A robust GUI frontend available for all platforms.
+- [ftp-simple](https://marketplace.visualstudio.com/items?itemName=humy2833.ftp-simple) – A VSCode plugin for managing FTP access.
+
+### CLI
+
+- [ftp](https://ftp.gnu.org/)
+- [wget](https://www.gnu.org/software/wget/) \[[Homebrew](https://formulae.brew.sh/formula/wget)]
+- [lftp](https://lftp.yar.ru/) \[[Homebrew](https://formulae.brew.sh/formula/lftp)]
diff --git a/packages/dashboard/src/routes/(static)/docs/ftp/2024-10-06-14-54-04.png b/packages/dashboard/src/routes/(static)/docs/ftp/2024-10-06-14-54-04.png
new file mode 100644
index 00000000..b647f8cd
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ftp/2024-10-06-14-54-04.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ftp/2024-10-06-14-55-02.png b/packages/dashboard/src/routes/(static)/docs/ftp/2024-10-06-14-55-02.png
new file mode 100644
index 00000000..729bd143
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ftp/2024-10-06-14-55-02.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/getting-started/+page.md b/packages/dashboard/src/routes/(static)/docs/getting-started/+page.md
new file mode 100644
index 00000000..1f97ed92
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/getting-started/+page.md
@@ -0,0 +1,78 @@
+# Getting Started with PocketHost
+
+Welcome to PocketHost! This guide will help you set up your first PocketBase instance and get you familiar with the basics of our platform. Let's dive in!
+
+## 1. Create a PocketHost Account
+
+The first step is to create a free account on PocketHost.
+
+- **Sign Up**: Visit [pockethost.io/get-started](https://pockethost.io/get-stated).
+- **Email Verification**: Provide a valid email address and verify it through the confirmation email sent to you.
+- **Account Setup**: Complete your profile setup, and you're ready to go!
+
+_For detailed instructions, see [Account Creation](/docs/account-creation)._
+
+## 2. Choose an Instance Name
+
+After logging in, you can create a new PocketBase instance.
+
+- **Auto-Assigned Name**: If you prefer, you can let PocketHost assign a random, unique name to your instance.
+- **Custom Name**: You can also choose a custom name that reflects your project or brand.
+
+**Note**: Instance names must be unique and comply with our naming guidelines.
+
+_Learn more in [Choosing an Instance Name](#)._
+
+## 3. Accessing the Instance Admin Interface
+
+Once your instance is created, you can access the PocketBase admin UI.
+
+- **Admin URL**: Navigate to `https://.pockethost.io/_`
+ - Replace `` with your instance name.
+- **Login**: Use the default admin credentials provided during instance creation.
+
+**Example**:
+
+```plaintext
+https://myapp.pockethost.io/_
+```
+
+_For more details, visit [Accessing the Admin Interface](#)._
+
+## 4. Exploring the Instance Dashboard
+
+PocketHost provides a user-friendly dashboard to manage your instances.
+
+- **Dashboard Access**: Log in to your PocketHost account and go to the [Dashboard](https://pockethost.io/dashboard).
+- **Instance Management**: From the dashboard, you can:
+ - Start, stop, or restart instances.
+ - View instance status and resource usage.
+ - Configure settings and access logs.
+
+_See [Using the PocketHost Dashboard](#) for an in-depth guide._
+
+## 5. Exploring the Instance via FTP
+
+For advanced management, you can access your instance files via FTP.
+
+- **FTP Credentials**: Obtain your FTP username and password from the dashboard.
+- **FTP Client**: Use any standard FTP client (like FileZilla or WinSCP) to connect.
+ - **Host**: `.pockethost.io`
+ - **Port**: `21`
+- **File Management**: Upload, download, or modify files as needed.
+
+_Detailed instructions are available in [FTP Access and File Management](#)._
+
+---
+
+**Next Steps**:
+
+Now that you're set up, you can start building your application!
+
+- **Configure Your Database**: Set up collections and records in the admin UI.
+- **Integrate with Your App**: Connect your PocketBase instance to your web or mobile application.
+- **Deploy Updates**: Use FTP or the admin UI to manage your instance files.
+
+---
+
+_Happy building with PocketHost!_
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/+page.md b/packages/dashboard/src/routes/(static)/docs/gs-gmail/+page.md
new file mode 100644
index 00000000..ab6be8be
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/gs-gmail/+page.md
@@ -0,0 +1,94 @@
+# Setting up a new email domain in Google Suite
+
+The process of setting up a new email domain in Google Suite involves several steps. In this guide, we will walk you through the process, from adding the domain to activating Gmail and setting up a catch-all email. By following these steps, you'll be able to configure your email domain effectively and ensure smooth communication within your organization. Let's get started!
+
+
+
+
+
+- [Add the domain](#add-the-domain)
+- [Domain Verification](#domain-verification)
+- [Activating Gmail](#activating-gmail)
+- [Adding a Catch-All Email](#adding-a-catch-all-email)
+- [Test Your Email Setup](#test-your-email-setup)
+- [Add a Sender Account to Gmail](#add-a-sender-account-to-gmail)
+
+
+
+## Add the domain
+
+Go to the [domains admin](https://admin.google.com/ac/domains/manage) and add a new domain.
+
+
+
+Set up an "alias domain," which involves a verification step where you need to update your DNS records. Otherwise, you may have to do the following steps manually.
+
+
+
+## Domain Verification
+
+If you're using Cloudflare as your DNS manager, Google will automatically recognize it and add the necessary DNS records.
+
+
+
+
+
+Then, wait for domain verification to complete. It should be fast.
+
+
+
+## Activating Gmail
+
+
+
+
+
+Once again, Cloudflare makes it easy and automatic. Otherwise, this may involve manual steps if Google is not integrated with your DNS provider.
+
+
+
+
+
+## Adding a Catch-All Email
+
+I set up a catch-all email so that any email sent to `@pocodex.dev` is routed to `ben@pocodex.dev` if the specific email address doesn’t exist. This is optional, but you might want to consider what happens to unrecognized email addresses in your setup.
+
+[This Google help article](https://apps.google.com/supportwidget/articlehome) covers it, but here it is below too:
+
+I like to go to [Default Routing](https://admin.google.com/ac/apps/gmail/defaultrouting) and add a rule:
+
+
+
+Use a regex to match the entire domain like `@pocodex\.dev$`. I also like to prepend `[CATCHALL] - ` to the subject so I know that it wasn't sent to my "real" address.
+
+
+
+Redirect the emails to your "real" email address:
+
+
+
+Finally, make sure you only perform this on unrecognized email addresses.
+
+
+
+
+
+## Test Your Email Setup
+
+Send an email to yourself using the new domain to ensure that everything is working correctly.
+
+You may need to wait a bit for the MX records to propagate. Just because Google says everything is verified doesn't mean the Internet at large has received the memo.
+
+
+
+If you want to be extra sure, try sending from a completely different email provider like Proton or AOL.
+
+Once you receive messages, you're all set!
+
+## Add a Sender Account to Gmail
+
+Sometimes you might want to send email FROM your domain, such as replies or customer messages. To do that, go to your user settings in Gmail and add an account:
+
+
+
+
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-04-47.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-04-47.png
new file mode 100644
index 00000000..ace04230
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-04-47.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-06-15.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-06-15.png
new file mode 100644
index 00000000..757cc7dd
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-06-15.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-07-10.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-07-10.png
new file mode 100644
index 00000000..cb08b380
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-07-10.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-07-35.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-07-35.png
new file mode 100644
index 00000000..0cc2fb0a
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-07-35.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-11-38.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-11-38.png
new file mode 100644
index 00000000..3571acf0
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-11-38.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-12-14.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-12-14.png
new file mode 100644
index 00000000..78bee4b8
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-12-14.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-12-59.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-12-59.png
new file mode 100644
index 00000000..6d80d89f
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-12-59.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-14-04.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-14-04.png
new file mode 100644
index 00000000..27efc115
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-14-04.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-15-06.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-15-06.png
new file mode 100644
index 00000000..e0f5862e
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-15-06.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-21-45.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-21-45.png
new file mode 100644
index 00000000..a6135904
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-21-45.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-24-55.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-24-55.png
new file mode 100644
index 00000000..bb53075e
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-24-55.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-25-14.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-25-14.png
new file mode 100644
index 00000000..c27deb21
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-25-14.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-25-59.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-25-59.png
new file mode 100644
index 00000000..c1a746e3
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-25-59.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-39-27.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-39-27.png
new file mode 100644
index 00000000..0e4b69d1
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-39-27.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-51-48.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-51-48.png
new file mode 100644
index 00000000..3d882f30
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-51-48.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-56-56.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-56-56.png
new file mode 100644
index 00000000..7b8fe3a3
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-56-56.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-57-35.png b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-57-35.png
new file mode 100644
index 00000000..07c7bc2d
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/gs-gmail/2024-09-08-19-57-35.png differ
diff --git a/packages/lander/content/docs/usage/hooks.md b/packages/dashboard/src/routes/(static)/docs/hooks.md
similarity index 98%
rename from packages/lander/content/docs/usage/hooks.md
rename to packages/dashboard/src/routes/(static)/docs/hooks.md
index aff5de38..7e388abb 100644
--- a/packages/lander/content/docs/usage/hooks.md
+++ b/packages/dashboard/src/routes/(static)/docs/hooks.md
@@ -39,9 +39,9 @@ onAfterBootstrap((e) => {
const name = 'Hooks!'
const fxTest = config.hello(name)
- console.log('App initialized!')
+ console.log('Instance initialized!')
console.log(`fxTest: ${fxTest}`)
- console.log(`App name: ${JSON.stringify(config)}`)
+ console.log(`Instance name: ${JSON.stringify(config)}`)
})
```
diff --git a/packages/lander/content/docs/usage/instances/index.md b/packages/dashboard/src/routes/(static)/docs/instances/index.md
similarity index 100%
rename from packages/lander/content/docs/usage/instances/index.md
rename to packages/dashboard/src/routes/(static)/docs/instances/index.md
diff --git a/packages/lander/content/docs/overview/introduction.md b/packages/dashboard/src/routes/(static)/docs/introduction.md
similarity index 73%
rename from packages/lander/content/docs/overview/introduction.md
rename to packages/dashboard/src/routes/(static)/docs/introduction.md
index c31e7e19..b4408b45 100644
--- a/packages/lander/content/docs/overview/introduction.md
+++ b/packages/dashboard/src/routes/(static)/docs/introduction.md
@@ -1,14 +1,3 @@
----
-title: Introduction
-category: overview
-date: 2023-12-01
-description: PocketHost, a powerful cloud hosting platform for PocketBase,
- allows you to create unlimited projects quickly and easily. With no backend
- setup required, it manages all the Linux/devops tasks, from email and DNS
- jargon to SSL management and CDN hosting, so developers can solely focus on
- building their apps.
----
-
# 👋 Welcome to PocketHost
## Overview
@@ -17,7 +6,7 @@ PocketHost hosts your [PocketBase](https://pocketbase.io) projects, so you don't
PocketHost is a cloud hosting platform for PocketBase. You can use it to instantly provision a PocketBase backend for your latest project. Features include:
-- Create unlimited PocketBase projects, each with a custom subdomain or custom vanity domain
+- Create PocketBase projects, each with a custom subdomain or custom vanity domain
- Each instance runs on a subdomain of `pockethost.io`
- Access your PocketBase instance using the PocketBase JavaScript SDK as easily as `new PocketBase('https://my-project.pockethost.io')`
- Run your instance in an ultra-beefy shared environment
diff --git a/packages/dashboard/src/routes/(static)/docs/js/+page.md b/packages/dashboard/src/routes/(static)/docs/js/+page.md
new file mode 100644
index 00000000..951a384b
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/js/+page.md
@@ -0,0 +1,214 @@
+# Extending PocketBase via JavaScript
+
+PocketBase can be [extended via JavaScript](https://pocketbase.io/docs/js-overview/) using server-side scripts that allow you to customize and enhance the functionality of your application. These scripts are executed within the PocketBase server using a JavaScript Virtual Machine (JSVM) powered by [Goja](https://github.com/dop251/goja), a JavaScript interpreter written in Go.
+
+However, it's important to understand that the PocketBase JSVM environment differs from typical JavaScript environments like the Browser API or Node.js. This guide will help you understand these differences and how to work effectively within the PocketBase JSVM environment.
+
+
+
+
+
+- [Differences from Browser and Node.js APIs](#differences-from-browser-and-nodejs-apis)
+- [Missing Browser APIs](#missing-browser-apis)
+- [Process Object and Environment Variables](#process-object-and-environment-variables)
+- [No Promises or Asynchronous Code](#no-promises-or-asynchronous-code)
+- [CommonJS Modules Supported](#commonjs-modules-supported)
+- [Supported ECMAScript Features](#supported-ecmascript-features)
+- [Limitations in Feature Support](#limitations-in-feature-support)
+- [Handling Absence of Node.js Standard Modules](#handling-absence-of-nodejs-standard-modules)
+
+
+
+---
+
+## Differences from Browser and Node.js APIs
+
+The PocketBase JSVM environment does not include the full set of Browser APIs or Node.js APIs. Many global objects and functions that you might expect in those environments are not available.
+
+## Missing Browser APIs
+
+- **`window` and `document` Objects**: Since the scripts run on the server, there is no Document Object Model (DOM) to interact with.
+- **Web APIs**: Functions like `fetch`, `alert`, `setTimeout`, and `setInterval` are not available.
+- **Event Listeners**: DOM event handling methods are absent.
+- **`require()` Support**: The `require()` function is supported in the PocketBase JSVM for loading modules. However, Node.js’s built-in modules (e.g., `fs`, `http`, `path`) are not available.
+- **No Node.js Standard Modules**: Code relying on core Node.js modules like `fs`, `http`, or `path` will not work in the PocketBase environment.
+
+ **Example of Unsupported Code:**
+
+ ```javascript
+ // This will NOT work in PocketBase
+ const fs = require('fs') // Node.js module not available
+ ```
+
+ There is an ongoing project, [pocketbase-node](https://www.npmjs.com/package/pocketbase-node), which aims to create a compatible subset of Node.js standard modules, making it easier to port Node.js code to the PocketBase JSVM.
+
+- **Custom Modules**: You can use `require()` to load your own modules within the PocketBase environment. All modules you want to use must be explicitly provided by your codebase.
+
+ **Example of Supported Code:**
+
+ ```javascript
+ // This works if you provide your own 'utils.js' file
+ const utils = require('./utils')
+ ```
+
+## Process Object and Environment Variables
+
+- **`process.env` Shim**: While the full `process` module is not available, PocketBase provides a shim for `process.env`. You can use `process.env` to access environment variables, similar to how you would in Node.js.
+
+ **Example:**
+
+ ```javascript
+ const dbHost = process.env.DB_HOST || 'localhost'
+ ```
+
+ However, the rest of the `process` object is not supported.
+
+## No Promises or Asynchronous Code
+
+Goja, the JavaScript engine used by PocketBase, does not support Promises or asynchronous code. All code executed within the JSVM is synchronous.
+
+### Implications:
+
+- **No `Promise` Objects**: You cannot create or handle Promises.
+- **No `async`/`await` Syntax**: Asynchronous functions and the `await` keyword are not recognized.
+- **Synchronous Operations Only**: All operations must be handled synchronously.
+
+**Example of Unsupported Code:**
+
+```javascript
+// This will NOT work in PocketBase JSVM
+async function fetchData() {
+ const response = await fetch('https://api.example.com/data')
+ return response.json()
+}
+```
+
+## CommonJS Modules Supported
+
+PocketBase's Goja environment **does support CommonJS modules** via `require()`. This means you can organize your code into separate files and load them with `require()`. However, as mentioned earlier, Node.js’s built-in modules are not available, and all custom modules must be provided by you.
+
+### Example of CommonJS Support:
+
+```javascript
+// utils.js
+function greet(name) {
+ return `Hello, ${name}`
+}
+
+module.exports = { greet }
+```
+
+```javascript
+// main.js
+const utils = require('./utils')
+console.log(utils.greet('PocketBase'))
+```
+
+## Supported ECMAScript Features
+
+Goja provides support for most of ECMAScript 2020 (ES11) and ES6 features, meaning you can use many modern JavaScript syntactic elements and functionalities.
+
+### Supported Features Include:
+
+- **Arrow Functions**:
+
+ ```javascript
+ const add = (a, b) => a + b
+ ```
+
+- **Classes and Inheritance**:
+
+ ```javascript
+ class Person {
+ constructor(name) {
+ this.name = name
+ }
+ }
+
+ class Employee extends Person {
+ constructor(name, id) {
+ super(name)
+ this.id = id
+ }
+ }
+ ```
+
+- **Template Literals**:
+
+ ```javascript
+ const greeting = `Hello, ${name}!`
+ ```
+
+- **Destructuring Assignment**:
+
+ ```javascript
+ const { x, y } = point
+ const [first, second] = array
+ ```
+
+- **Default Parameters**:
+
+ ```javascript
+ function multiply(a, b = 1) {
+ return a * b
+ }
+ ```
+
+- **Spread and Rest Operators**:
+
+ ```javascript
+ const arr1 = [1, 2]
+ const arr2 = [...arr1, 3, 4] // Spread operator
+
+ function sum(...numbers) {
+ // Rest operator
+ return numbers.reduce((a, b) => a + b, 0)
+ }
+ ```
+
+- **Let and Const Declarations**:
+
+ ```javascript
+ let count = 0
+ const PI = 3.1416
+ ```
+
+- **Maps and Sets**:
+
+ ```javascript
+ const map = new Map()
+ map.set('key', 'value')
+
+ const set = new Set()
+ set.add(1)
+ ```
+
+- **Symbol Type**:
+
+ ```javascript
+ const sym = Symbol('description')
+ ```
+
+- **Optional Chaining**:
+
+ ```javascript
+ const street = user?.address?.street
+ ```
+
+- **Nullish Coalescing Operator**:
+
+ ```javascript
+ const value = input ?? defaultValue
+ ```
+
+## Limitations in Feature Support
+
+While Goja supports many ECMAScript features, there may be some limitations:
+
+- **No BigInt Support**: The `BigInt` type is not supported.
+- **No Intl Object**: Internationalization features are unavailable.
+- **Limited Regular Expressions**: Some advanced regex features may not be fully supported.
+
+## Handling Absence of Node.js Standard Modules
+
+Since Node.js core modules are not available, you need to ensure that your code does not rely on them. If you need functionality provided by those modules, consider looking at [pocketbase-node](https://www.npmjs.com/package/pocketbase-node), which aims to provide a subset of Node.js modules compatible with PocketBase’s JSVM environment.
diff --git a/packages/dashboard/src/routes/(static)/docs/limits/+page.md b/packages/dashboard/src/routes/(static)/docs/limits/+page.md
new file mode 100644
index 00000000..f25e9aba
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/limits/+page.md
@@ -0,0 +1,36 @@
+# Limits
+
+PocketHost enforces several limits to ensure a fair and reliable experience for all users. Below are the key limitations and guidelines for usage.
+
+## Rate Limiting
+
+Rate limiting is imposed by **Cloudflare**, which restricts requests to **50 requests per 10 seconds per IP**. If you're making numerous requests from the client side, we recommend using the [Bottleneck NPM package](https://www.npmjs.com/package/bottleneck) to manage and throttle requests efficiently.
+
+In special cases, such as during conferences or events where a large amount of traffic originates from a single IP, we have ways to expand or bypass these rate limits. If this applies to you, please contact [PocketHost Support](/support).
+
+In general, exceeding the rate limit often indicates a coding issue. Another option is to write custom routes using [JS Hooks](/docs/programming) to perform bulk fetching and filtering server-side, which can be difficult to manage effectively on the client side.
+
+## Hibernation
+
+To conserve resources, PocketHost instances may enter a **hibernation** state during periods of inactivity. When in hibernation, your instance won't immediately respond to incoming requests but will wake up when a new request is received.
+
+### Important Caveats:
+
+- **Scheduled Tasks and Backups**: Automated tasks like scheduled backups may fail to execute if the instance is in hibernation at the scheduled time. Waking up the instance on a schedule will not trigger any missed intervals. This is generally less of an issue as your instance grows and becomes more active.
+- **Instance Waking**: While the instance will wake up for new requests, the first request after hibernation may experience a delay as the instance restarts.
+
+## Usage Limits
+
+In addition to rate limits, we monitor:
+
+- **Bandwidth** (both ingress and egress)
+- **Storage**
+- **CPU Usage**
+
+We operate under a **Fair Use Policy** as outlined in our [Terms of Service](/terms). This means your usage is acceptable as long as it aligns with that of other users. If your usage significantly exceeds typical levels, we may contact you to discuss a resolution.
+
+In extreme cases, if the issue cannot be resolved and it negatively impacts other users, your instance may be suspended. In severe cases, we may be forced to delete data without providing a backup. While this is rare (it has only happened once due to an abusive situation), it’s important to stay within reasonable usage limits.
+
+## Prohibited Content
+
+Our [Terms of Service](/terms) also outline additional limits, including restrictions on prohibited content and usage. Be sure to review these guidelines to ensure your instance complies with our policies.
diff --git a/packages/dashboard/src/routes/(static)/docs/logs/+page.md b/packages/dashboard/src/routes/(static)/docs/logs/+page.md
new file mode 100644
index 00000000..c09bd100
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/logs/+page.md
@@ -0,0 +1,9 @@
+# Logging
+
+You can view live logs while your PocketHost instance is running. `console.log` output from `pb_hooks` scripts will also appear in these logs.
+
+
+
+For enhanced logging, use [Dev mode](/docs/dev-mode).
+
+These logs are also accessible in the logging area of your PocketBase admin dashboard.
diff --git a/packages/dashboard/src/routes/(static)/docs/logs/2024-10-06-14-38-49.png b/packages/dashboard/src/routes/(static)/docs/logs/2024-10-06-14-38-49.png
new file mode 100644
index 00000000..07531ffb
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/logs/2024-10-06-14-38-49.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/power/+page.md b/packages/dashboard/src/routes/(static)/docs/power/+page.md
new file mode 100644
index 00000000..2d1400c8
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/power/+page.md
@@ -0,0 +1,25 @@
+# Power
+
+## Power On
+
+
+
+To power on the instance, follow these steps:
+
+1. Open the instance management console.
+2. Locate the power button and click on it.
+3. The instance is now active.
+
+Once powered on, your PocketBase instance will be able to receive requests and respond accordingly.
+
+## Power Off
+
+
+
+To power off the instance, follow these steps:
+
+1. Open the instance management console.
+2. Locate the power button and click on it.
+3. Wait for the instance to shut down.
+
+When the instance is powered off, no requests will be answered.
diff --git a/packages/dashboard/src/routes/(static)/docs/power/2024-10-06-14-32-05.png b/packages/dashboard/src/routes/(static)/docs/power/2024-10-06-14-32-05.png
new file mode 100644
index 00000000..9b348e0a
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/power/2024-10-06-14-32-05.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/power/2024-10-06-14-32-38.png b/packages/dashboard/src/routes/(static)/docs/power/2024-10-06-14-32-38.png
new file mode 100644
index 00000000..5e9cdbc1
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/power/2024-10-06-14-32-38.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/pricing-ethos/+page.md b/packages/dashboard/src/routes/(static)/docs/pricing-ethos/+page.md
new file mode 100644
index 00000000..cd19f23b
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/pricing-ethos/+page.md
@@ -0,0 +1,61 @@
+# Pricing Ethos
+
+At PocketHost, we believe in keeping things simple and transparent. Our pricing is designed to support indie hackers, makers, and small businesses. We offer flexible plans to suit your needs, including a Free Tier, a Pro Tier, and occasionally, limited Lifetime Offers during our bootstrapping phase.
+
+## Free Tier
+
+**Free Forever**
+
+Our Free Tier is perfect for getting started with PocketHost without any upfront costs. It includes:
+
+- **Multiple Projects**: Create up to 25 projects as you need.
+- **Generous Resources**: Fair use of storage, bandwidth, and CPU.
+- **Essential Features**: Access to the core functionalities of PocketHost.
+
+The Free Tier is ideal for prototypes, personal projects, or exploring what PocketHost has to offer.
+
+## Pro Tier
+
+**Enhanced Capacity and Access**
+
+For those who need more, our Pro Tier offers expanded capabilities:
+
+- **All Free Tier Benefits**: Plus additional resources.
+- **Priority Support**: Get help when you need it.
+- **Advanced Features**: Unlock premium functionalities.
+
+**Subscription Options**:
+
+- **Monthly Plan**: Flexibility to pay as you go.
+- **Annual Plan**: Save more with yearly billing.
+
+Our Pro Tier remains a great deal for users who require extra power and support for their growing projects.
+
+## Lifetime Offers
+
+**Limited Supply During Bootstrapping**
+
+Occasionally, we offer Lifetime Plans as part of our bootstrapping efforts:
+
+- **One-Time Payment**: Enjoy Pro Tier benefits without recurring fees.
+- **Limited Availability**: Offered in limited quantities and sold on a first-come, first-served basis.
+- **Non-Transferable**: Cannot be pro-rated, transferred, used retroactively, reserved, or purchased in advance.
+
+**Please Note**:
+
+- Once sold out, Lifetime Offers are gone forever.
+- Timing is everything—if you can wait and catch one of these deals, it's an incredible opportunity.
+
+Many users opt for our standard Pro Tier, which continues to provide excellent value even when Lifetime Offers are unavailable.
+
+## Fair Use Policy
+
+**Unlimited Doesn't Mean Infinite**
+
+While we offer ample limits for projects, storage, bandwidth, and CPU, all usage is subject to our [Fair Use Policy](/terms):
+
+- **Fair Use Basis**: Use resources similarly to the average active app on our platform.
+- **Resource Management**: Your app scales up or down based on its needs.
+- **Good Citizenship**: Be mindful of resource consumption to ensure a positive experience for all users.
+
+For more details, please refer to our Fair Use Policy in the [Terms of Service](/terms).
diff --git a/packages/dashboard/src/routes/(static)/docs/programming/+page.md b/packages/dashboard/src/routes/(static)/docs/programming/+page.md
new file mode 100644
index 00000000..fa8114b6
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/programming/+page.md
@@ -0,0 +1,28 @@
+# Programming and Extending PocketBase with JSVM
+
+PocketBase is not just a simple backend solution—it offers powerful capabilities for extending its functionality through JavaScript, specifically using the **Goja engine** and its **JSVM** (JavaScript Virtual Machine). This allows developers to add custom logic, plugins, and server-side rendering to their applications, making PocketBase a highly versatile platform.
+
+## A Growing Ecosystem
+
+The **PocketBase ecosystem** is expanding rapidly, making it easier to enhance your applications in a modular and scalable way. Two key projects that contribute to this growing ecosystem are:
+
+- **[pocodex.dev](https://pocodex.dev)**: A plugin ecosystem that allows developers to share, discover, and integrate plugins into their PocketBase instances. Whether you need additional authentication features, API extensions, or other custom functionality, Pocodex provides a hub for PocketBase developers to contribute and utilize plugins.
+- **[pocketpages.dev](https://pocketpages.dev)**: A platform for building classic server-side rendered (SSR) pages with PocketBase. By leveraging PocketBase’s **JSVM** and the Goja engine, developers can serve SSR content, delivering a seamless experience for static or dynamic web pages directly from PocketBase.
+
+## Extending PocketBase with JSVM
+
+PocketBase’s **JSVM** makes it possible to run custom JavaScript code directly within your PocketBase instance. This can be used for a wide range of tasks, from extending API functionality to adding business logic that runs server-side. With the JSVM feature, you can write JavaScript code that interacts with PocketBase’s core services, hooks, and events.
+
+### Use Cases for JSVM
+
+- **Custom API Routes**: Use the JSVM to define and execute custom routes that go beyond the default PocketBase APIs. This enables more sophisticated data manipulation, custom validation, and complex business logic.
+- **Hooks and Triggers**: Integrate **JavaScript hooks** into your application to trigger actions in response to database changes, such as sending notifications when records are updated or applying complex validation before data is written.
+
+- **Plugin Support via Pocodex**: With **Pocodex**, developers can extend PocketBase's capabilities even further, utilizing existing plugins or contributing their own. The JSVM allows for plugins to be developed using JavaScript, making it easier to create reusable code modules for PocketBase.
+
+## Hosting Static and SSR Content
+
+**PocketHost** is an excellent choice for hosting both static/SSG (Static Site Generation) and SSR (Server-Side Rendered) content. With **PocketPages.dev** and similar technologies, you can combine the power of PocketBase’s JSVM and server-side rendering to deliver fully dynamic web applications.
+
+- **Static Content**: PocketHost supports static files and SSG, making it ideal for static websites or single-page applications.
+- **Server-Side Rendering (SSR)**: By using PocketPages and PocketBase’s JavaScript capabilities, you can serve SSR pages directly from your backend. This provides the advantages of SEO and faster initial page loads for dynamic content.
diff --git a/packages/dashboard/src/routes/(static)/docs/rename-instance/+page.md b/packages/dashboard/src/routes/(static)/docs/rename-instance/+page.md
new file mode 100644
index 00000000..47cd2240
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/rename-instance/+page.md
@@ -0,0 +1,7 @@
+# Rename an Instance
+
+PocketHost instances can always be accessed via their permanent link, such as `https://mfsicdp6ia1zpiu.pockethost.io`, but you can also access them through a convenient subdomain like `https://harvest.pockethost.io`.
+
+The subdomain is unique across all of PocketHost, but you can change it at any time. When you change your subdomain, the old one becomes available for others to claim. Be sure to choose wisely if you plan to release it.
+
+
diff --git a/packages/dashboard/src/routes/(static)/docs/rename-instance/2024-10-06-15-03-48.png b/packages/dashboard/src/routes/(static)/docs/rename-instance/2024-10-06-15-03-48.png
new file mode 100644
index 00000000..1a94fbc5
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/rename-instance/2024-10-06-15-03-48.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/s3/+page.md b/packages/dashboard/src/routes/(static)/docs/s3/+page.md
new file mode 100644
index 00000000..b6458c22
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/s3/+page.md
@@ -0,0 +1,35 @@
+# S3 Storage and PocketBase
+
+Using S3-compatible storage for PocketBase can help optimize your instance's resource management and portability. Here’s what you need to know about integrating S3 storage with PocketBase.
+
+
+
+## Affordable S3-Compatible Storage
+
+One highly affordable option for S3-compatible storage is **iDrive**, which offers competitive pricing and reliable service. You can configure PocketBase to use iDrive or any other S3-compatible provider to store files, backups, and other resources.
+
+## What S3 Storage Supports
+
+S3 storage works seamlessly with PocketBase for the following use cases:
+
+- **Backups**: Store PocketBase backups in S3-compatible storage to keep them off your local instance.
+- **Restores**: Use S3 storage as a source when restoring backups to your PocketBase instance.
+- **File uploads**: Move your PocketBase file uploads to S3 to free up local storage.
+
+By offloading these tasks to S3, you can reduce the burden on your PocketHost instance’s local storage.
+
+## Storage Conservation
+
+Using S3 for files like uploads and backups helps conserve your local storage for more critical data, such as **databases and logs**, which must reside on your instance. This helps your PocketHost instance run more efficiently. Learn more about storage limits in [Limits](/docs/limits).
+
+## Migrating Files to S3
+
+If you need to move a large number of files from your PocketHost instance to S3, feel free to reach out to [PocketHost Support](/support) for assistance. They can help you streamline the migration process.
+
+## Portability and Migration
+
+By storing files in S3, your PocketBase instance becomes far more **portable**. If you ever decide to migrate away from PocketHost, having your files already stored in S3 makes it easier to transition to another hosting provider.
+
+## Important Backup Consideration
+
+Be aware that **PocketBase backups do NOT include storage files** that have been moved to S3. When creating a backup, only the local database and file system are included. You’ll need to manage S3-stored files separately to ensure complete backup coverage.
diff --git a/packages/dashboard/src/routes/(static)/docs/s3/2024-10-06-15-52-14.png b/packages/dashboard/src/routes/(static)/docs/s3/2024-10-06-15-52-14.png
new file mode 100644
index 00000000..087a52da
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/s3/2024-10-06-15-52-14.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/secrets/+page.md b/packages/dashboard/src/routes/(static)/docs/secrets/+page.md
new file mode 100644
index 00000000..53050e30
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/secrets/+page.md
@@ -0,0 +1,5 @@
+# Secrets
+
+Secrets are created through the PocketHost instance dashboard and are automatically made available in the PocketBase runtime environment, including `pb_hooks`. Use secrets to securely store API keys and other sensitive information that should not be embedded in your source code.
+
+
diff --git a/packages/dashboard/src/routes/(static)/docs/secrets/2024-10-06-14-48-39.png b/packages/dashboard/src/routes/(static)/docs/secrets/2024-10-06-14-48-39.png
new file mode 100644
index 00000000..958479eb
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/secrets/2024-10-06-14-48-39.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/self-hosting/+page.md b/packages/dashboard/src/routes/(static)/docs/self-hosting/+page.md
new file mode 100644
index 00000000..1c4e3bc9
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/self-hosting/+page.md
@@ -0,0 +1,11 @@
+# Self Hosting
+
+PocketHost is designed to run full stack on your local development machine.
+
+We are working to make this as easy as possible, but currently it requires many steps to get set up. Self hosting is not recommended for the faint of heart.
+
+## Getting started
+
+```bash
+bunx pockethost --help
+```
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/+page.md b/packages/dashboard/src/routes/(static)/docs/ses/+page.md
new file mode 100644
index 00000000..4375ac80
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/ses/+page.md
@@ -0,0 +1,97 @@
+# Speedrun: Setting Up Email with Google Suite and AWS SES
+
+
+
+
+
+- [Prerequisite: Make sure you can receive emails first](#prerequisite-make-sure-you-can-receive-emails-first)
+- [Create an SES Identity](#create-an-ses-identity)
+- [Add DNS Records](#add-dns-records)
+- [Add a custom FROM domain](#add-a-custom-from-domain)
+- [Add DMARC settings](#add-dmarc-settings)
+- [Verifying the Setup](#verifying-the-setup)
+- [Submit for Approval](#submit-for-approval)
+- [Creating SMTP Credentials](#creating-smtp-credentials)
+- [Configure SMTP in PocketBase](#configure-smtp-in-pocketbase)
+
+
+
+## Prerequisite: Make sure you can receive emails first
+
+To receive emails, you'll need an email provider. I use Google Suite, but you can choose any provider you prefer.
+
+[Setting up a new email domain in Google Suite](/docs/gs-gmail).
+
+(Someone should write about how to do it using Proton.me)
+
+## Create an SES Identity
+
+Log in to your Amazon SES account and follow their getting started guide to create a FROM address and sending domain. Make sure you're in the region you prefer. This is important if you have existing domains because AWS frowns upon approving multiple sending regions.
+
+
+
+Start by creating an Identity:
+
+
+
+
+
+## Add DNS Records
+
+You'll need to add DNS records provided by SES to your DNS provider. Unlike Google Suite, you'll need to enter these values manually. They do not provide integrations with any DNS providers.
+
+
+
+**Note for Cloudflare users: If you’re using Cloudflare, make sure these records are not proxied.**
+
+
+
+## Add a custom FROM domain
+
+Deliverability is better if you add a custom FROM domain:
+
+
+
+
+
+It requires a few additional DNS entries. Note that the MX `priority` goes into a separate field, not the MX server field:
+
+
+
+
+
+## Add DMARC settings
+
+
+
+## Verifying the Setup
+
+After adding the DNS records, go back to AWS SES and wait for the domain to show as verified. Then, send a verification email. You should receive it if everything is set up correctly.
+
+
+
+
+
+If verification takes too long, go to **Identities > DKIM**, click **Edit**, then **Save** to trigger an immediate re-verification.
+
+
+
+## Submit for Approval
+
+Before you can send emails to anyone, you must submit everything for approval in AWS SES. This step is crucial to avoid issues when sending emails outside your verified domain.
+
+If you have previously had a domain approved, you may be able to skip this step. To find out, simply try sending a test message to anything with a different domain.
+
+## Creating SMTP Credentials
+
+Create SMTP credentials in the AWS SES console. These credentials will be used in your PocketBase admin panel for sending emails.
+
+
+
+## Configure SMTP in PocketBase
+
+Once you have your SMTP credentials, head over to the PocketBase admin.
+
+Enter the SMTP credentials in PocketBase's admin panel, and ensure the **SENDER** address is correctly set. If SES hasn't verified your email yet, you can test it by sending an email to `test@`, which should go through if the domain is the same.
+
+
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-03-06-20-55.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-03-06-20-55.png
new file mode 100644
index 00000000..026ac8fd
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-03-06-20-55.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-03-07-00-59.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-03-07-00-59.png
new file mode 100644
index 00000000..3f35e26c
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-03-07-00-59.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-20-29-10.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-20-29-10.png
new file mode 100644
index 00000000..b829f83e
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-20-29-10.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-20-30-52.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-20-30-52.png
new file mode 100644
index 00000000..e611dd8f
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-20-30-52.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-20-33-41.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-20-33-41.png
new file mode 100644
index 00000000..72e7c1cc
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-20-33-41.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-28-33.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-28-33.png
new file mode 100644
index 00000000..6582f3ed
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-28-33.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-32-26.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-32-26.png
new file mode 100644
index 00000000..cdbd2803
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-32-26.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-33-32.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-33-32.png
new file mode 100644
index 00000000..c4bb4420
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-33-32.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-35-46.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-35-46.png
new file mode 100644
index 00000000..4742feff
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-35-46.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-38-12.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-38-12.png
new file mode 100644
index 00000000..c8487b13
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-38-12.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-38-51.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-38-51.png
new file mode 100644
index 00000000..63da275f
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-38-51.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-41-08.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-41-08.png
new file mode 100644
index 00000000..d75c574b
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-41-08.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-42-35.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-42-35.png
new file mode 100644
index 00000000..1b4b8e0e
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-42-35.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-45-05.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-45-05.png
new file mode 100644
index 00000000..fe06b892
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-45-05.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-48-53.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-48-53.png
new file mode 100644
index 00000000..84ba105e
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-48-53.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-53-02.png b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-53-02.png
new file mode 100644
index 00000000..1990c03d
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/ses/2024-09-08-22-53-02.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/smtp/+page.md b/packages/dashboard/src/routes/(static)/docs/smtp/+page.md
new file mode 100644
index 00000000..d1735ed0
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/smtp/+page.md
@@ -0,0 +1,41 @@
+# Outgoing Email in PocketBase
+
+Reliable outgoing email is crucial for many applications, and PocketBase provides flexible options for sending emails. However, ensuring consistent and reliable email delivery can be complex due to factors like spam filters, sender reputation, and email authentication. This guide will help you navigate these challenges and recommend two trusted solutions: **Amazon SES** and **Google Suite**.
+
+## Configuring Outgoing Email in PocketBase
+
+
+
+PocketBase includes a **testing feature** to verify that your outgoing email setup is functioning correctly. You can use it to send test emails and ensure that:
+
+- Emails are delivered to the recipient’s inbox.
+- The sender’s name and email address are correctly displayed.
+
+### Steps for Testing
+
+1. Configure your outgoing email settings with your chosen service (SES, Google Suite, or another provider).
+2. Use PocketBase’s email testing feature to send a test email.
+3. Verify that the email is received and that the **From** name and email address are correct.
+4. Check if the email landed in the inbox and not the spam folder. If emails are going to spam, review your authentication setup (SPF, DKIM, etc.).
+
+This testing process helps ensure that your outgoing email configuration is working as expected before going live.
+
+## Recommended Services
+
+### Amazon SES
+
+Amazon Simple Email Service (SES) is a powerful and cost-effective email-sending platform. It’s designed for high scalability and reliability, making it a great option for handling transactional emails, password resets, and more. You can follow the setup guide at [Amazon SES](/docs/ses) to integrate it with your PocketBase instance.
+
+### Google Suite
+
+Google Suite (now known as Google Workspace) provides professional email services using your custom domain. It's ideal if you want to ensure that your emails come from a trusted provider while using Google’s secure infrastructure. You can find a step-by-step guide for integration at [Google Suite Email Setup](/docs/gs-gmail).
+
+## Complexity of Reliable Outgoing Email
+
+Sending reliable outgoing email isn’t as simple as just hitting "send." Email deliverability can be affected by:
+
+- **Spam filters**: Emails may be flagged as spam if not properly configured.
+- **Authentication**: Implementing DKIM, SPF, and DMARC protocols is essential for ensuring your emails are trusted by recipients.
+- **Sender reputation**: Consistent, high-quality email sending helps build a good sender reputation, which is vital for long-term reliability.
+
+Using trusted providers like Amazon SES and Google Suite can help you navigate these complexities by leveraging their expertise in handling email infrastructure.
diff --git a/packages/dashboard/src/routes/(static)/docs/smtp/2024-10-06-15-28-02.png b/packages/dashboard/src/routes/(static)/docs/smtp/2024-10-06-15-28-02.png
new file mode 100644
index 00000000..586abe5e
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/smtp/2024-10-06-15-28-02.png differ
diff --git a/packages/lander/content/docs/usage/usage-limits.md b/packages/dashboard/src/routes/(static)/docs/usage-limits.md
similarity index 81%
rename from packages/lander/content/docs/usage/usage-limits.md
rename to packages/dashboard/src/routes/(static)/docs/usage-limits.md
index 9911b598..452c3636 100644
--- a/packages/lander/content/docs/usage/usage-limits.md
+++ b/packages/dashboard/src/routes/(static)/docs/usage-limits.md
@@ -1,10 +1,4 @@
----
-title: Usage Limits
-category: usage
-description: PocketHost is an unlimited (fair use) bandwidth, storage, and CPU platform.
----
-
-PocketHost offers unlimited projects, storage, bandwidth, and CPU on a Fair Use basis.
+PocketHost offers generous free projects, storage, bandwidth, and CPU on a Fair Use basis.
## What is 'Fair'?
diff --git a/packages/dashboard/src/routes/(static)/docs/versions/+page.md b/packages/dashboard/src/routes/(static)/docs/versions/+page.md
new file mode 100644
index 00000000..1a22c5bd
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/docs/versions/+page.md
@@ -0,0 +1,49 @@
+# Changing PocketBase Versions
+
+PocketHost supports the latest minor release of each PocketBase version (e.g., `0.16.*`), and you can update your instance to stay on the latest release. When changing PocketBase versions, whether upgrading or downgrading, it’s important to take precautions to ensure the stability of your instance and the integrity of your data.
+
+## Upgrade Strategy
+
+Upgrading your instance to the latest version of PocketBase is straightforward but requires careful planning to avoid data loss or unexpected behavior. Here’s the recommended approach:
+
+1. [Back up your instance](/docs/backup-restore) to ensure your data is safe.
+ 
+2. **Create a second instance**: We recommend creating a second PocketHost instance and restoring your backup to it. This allows you to test the upgrade without affecting your live instance.
+3. Perform the upgrade on the second instance, ensuring all functionality is intact and working as expected.
+ 
+4. Once you are confident that everything works correctly, upgrade your main instance.
+5. [Power off your instance](/docs/power) to make it live again after the upgrade.
+
+## Automatic Upgrade Steps
+
+For most cases, automatic upgrades are possible by simply switching to the latest version:
+
+1. [Back up your instance](/docs/backup-restore).
+ 
+2. Change to the latest supported version in the PocketHost dashboard (e.g., `0.16.*`).
+ 
+3. [Power off your instance](/docs/power) and restart it to apply the changes.
+
+## Manual Upgrade Steps (Rare Cases)
+
+If the automatic upgrade results in an unresponsive instance due to database schema issues, a manual upgrade is required:
+
+1. [Back up your instance](/docs/backup-restore) via the PocketBase admin.
+2. Download your database backup from the PocketBase admin.
+3. On your local machine, follow the necessary upgrade steps according to the [PocketBase documentation](https://pocketbase.io/docs/).
+4. Perform a backup locally after completing the upgrade.
+5. [Restore](/docs/backup-restore) the upgraded backup via the live PocketBase admin.
+
+## Important Notes
+
+### Downgrading Versions
+
+**Be cautious when downgrading** – PocketBase does not officially support downgrades. While downgrades may work in some cases, there is no guarantee they will succeed without causing issues. If you attempt to downgrade and run into problems, there is no official resolution path.
+
+### Testing Before Upgrading
+
+To avoid potential disruptions, always create a second instance, restore your backup to it, and test the upgrade there first. This practice ensures you can catch any issues before applying changes to your live instance.
+
+### System Table Migrations
+
+When you upgrade to a new version, PocketBase may perform automatic migrations on system tables. These migrations are typically non-destructive, but you should proceed with caution and ensure you have a backup before applying any updates.
diff --git a/packages/dashboard/src/routes/(static)/docs/versions/2024-10-06-15-31-47.png b/packages/dashboard/src/routes/(static)/docs/versions/2024-10-06-15-31-47.png
new file mode 100644
index 00000000..7d3a7ade
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/versions/2024-10-06-15-31-47.png differ
diff --git a/packages/dashboard/src/routes/(static)/docs/versions/2024-10-06-15-36-44.png b/packages/dashboard/src/routes/(static)/docs/versions/2024-10-06-15-36-44.png
new file mode 100644
index 00000000..e880a9d3
Binary files /dev/null and b/packages/dashboard/src/routes/(static)/docs/versions/2024-10-06-15-36-44.png differ
diff --git a/packages/dashboard/src/routes/(static)/get-started/+page.svelte b/packages/dashboard/src/routes/(static)/get-started/+page.svelte
new file mode 100644
index 00000000..b2988c6f
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/get-started/+page.svelte
@@ -0,0 +1,17 @@
+
+
+
+ Home - PocketHost
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/dashboard/src/components/login-register/InstanceGeneratorWidget.svelte b/packages/dashboard/src/routes/(static)/get-started/InstanceGeneratorWidget.svelte
similarity index 81%
rename from packages/dashboard/src/components/login-register/InstanceGeneratorWidget.svelte
rename to packages/dashboard/src/routes/(static)/get-started/InstanceGeneratorWidget.svelte
index c7e4f2d0..b5e29073 100644
--- a/packages/dashboard/src/components/login-register/InstanceGeneratorWidget.svelte
+++ b/packages/dashboard/src/routes/(static)/get-started/InstanceGeneratorWidget.svelte
@@ -1,11 +1,12 @@
+
+
diff --git a/packages/dashboard/src/routes/(static)/login/confirm-account/[token]/+layout.ts b/packages/dashboard/src/routes/(static)/login/confirm-account/[token]/+layout.ts
new file mode 100644
index 00000000..9786e09d
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/login/confirm-account/[token]/+layout.ts
@@ -0,0 +1 @@
+export const prerender = false
diff --git a/packages/dashboard/src/routes/login/confirm-account/+page.svelte b/packages/dashboard/src/routes/(static)/login/confirm-account/[token]/+page.svelte
similarity index 62%
rename from packages/dashboard/src/routes/login/confirm-account/+page.svelte
rename to packages/dashboard/src/routes/(static)/login/confirm-account/[token]/+page.svelte
index 6d033b90..d93a6b46 100644
--- a/packages/dashboard/src/routes/login/confirm-account/+page.svelte
+++ b/packages/dashboard/src/routes/(static)/login/confirm-account/[token]/+page.svelte
@@ -1,38 +1,28 @@
diff --git a/packages/dashboard/src/routes/login/password-reset/+page.svelte b/packages/dashboard/src/routes/(static)/login/password-reset/+page.svelte
similarity index 100%
rename from packages/dashboard/src/routes/login/password-reset/+page.svelte
rename to packages/dashboard/src/routes/(static)/login/password-reset/+page.svelte
diff --git a/packages/dashboard/src/routes/(static)/login/password-reset/confirm/[token]/+layout.ts b/packages/dashboard/src/routes/(static)/login/password-reset/confirm/[token]/+layout.ts
new file mode 100644
index 00000000..9786e09d
--- /dev/null
+++ b/packages/dashboard/src/routes/(static)/login/password-reset/confirm/[token]/+layout.ts
@@ -0,0 +1 @@
+export const prerender = false
diff --git a/packages/dashboard/src/routes/login/password-reset/confirm/+page.svelte b/packages/dashboard/src/routes/(static)/login/password-reset/confirm/[token]/+page.svelte
similarity index 80%
rename from packages/dashboard/src/routes/login/password-reset/confirm/+page.svelte
rename to packages/dashboard/src/routes/(static)/login/password-reset/confirm/[token]/+page.svelte
index 021d1b4d..e06289ec 100644
--- a/packages/dashboard/src/routes/login/password-reset/confirm/+page.svelte
+++ b/packages/dashboard/src/routes/(static)/login/password-reset/confirm/[token]/+page.svelte
@@ -6,11 +6,10 @@
const { requestPasswordResetConfirm } = client()
let password: string = ''
- let token: string | null = ''
- let formError: string = ''
+ let formErrors: string[] = []
// Check for a token in the URL
- $: token = $page?.url?.searchParams?.get('token')
+ $: ({ token } = $page.params)
let isFormButtonDisabled: boolean = true
$: isFormButtonDisabled = password.length === 0
@@ -19,12 +18,13 @@
e.preventDefault()
// Clear out the error message
- formError = ''
+ formErrors = []
// Check for the token and block the request if it doesn't exist
if (!token) {
- formError =
- 'No token was found. Please check your email again for the link.'
+ formErrors = [
+ 'No token was found. Please check your email again for the link.',
+ ]
return
}
@@ -35,10 +35,15 @@
await requestPasswordResetConfirm(token, password)
// Hard refresh and send the user back to the login screen
- window.location.href = '/?view=login'
+ // window.location.href = '/login'
} catch (error) {
- const e = error as Error
- formError = `Something went wrong with confirming your password change. ${e.message}`
+ if (error instanceof Error) {
+ formErrors = client().parseError(error)
+ } else {
+ formErrors = [
+ 'Something went wrong with confirming your password change.',
+ ]
+ }
}
isFormButtonDisabled = false
@@ -67,7 +72,9 @@
/>