This commit is contained in:
Ben Allfree 2025-07-22 08:47:09 -07:00
parent b03fa83f03
commit d5e850041e
26 changed files with 362 additions and 93 deletions

View File

@ -1,5 +0,0 @@
---
'pockethost': minor
---
Add blog functionality with dynamic promo banner integration and content management features

View File

@ -1,5 +0,0 @@
---
'pockethost': patch
---
Add db migration support for multiple custom domains per instance

View File

@ -1,5 +0,0 @@
---
'pockethost': patch
---
Fix various issues including empty instance name validation, blog link typos, avatar digest errors, promo banner links, and delete button functionality

View File

@ -1,5 +0,0 @@
---
'pockethost': patch
---
Improve console logger browser compatibility and optimize breadcrumb handling for better debugging

View File

@ -1,5 +0,0 @@
---
'pockethost': minor
---
Implement automated custom domains with Cloudflare integration and multiple domain support per instance

View File

@ -1,5 +0,0 @@
---
'pockethost': minor
---
Enhance dashboard UI with improved layout constraints, instance title cosmetics, user subscription logging, and subdomain text truncation

View File

@ -1,5 +0,0 @@
---
'pockethost': patch
---
update MOTHERSHIP_URL formatting to include subdomain and trim path segments

View File

@ -1,5 +0,0 @@
---
'pockethost': patch
---
Fix firewall health check endpoints and improve HTTP status code responses for better monitoring

View File

@ -1,5 +0,0 @@
---
'pockethost': patch
---
Improve instance shutdown handling, add HandleInstanceResolve API, and enhance Docker container startup timing

View File

@ -1,5 +0,0 @@
---
'pockethost': patch
---
Improve logging consistency across services, enhance error messaging, and add container launch timing for better debugging

View File

@ -1,5 +0,0 @@
---
'pockethost': minor
---
Add MothershipMirrorService with event handlers for improved data synchronization

View File

@ -1,5 +0,0 @@
---
'pockethost': major
---
Implement hard paywall system with subscription management, billing integration, and user access controls

View File

@ -1,5 +0,0 @@
---
'pockethost': minor
---
Add subscription quantity management, billing integration improvements, and enhanced user account controls with suspension support

View File

@ -1,5 +0,0 @@
---
'pockethost': patch
---
Migrate to tsx for CLI execution, remove winston logging, update to SvelteKit 3 and Vite 6, and improve build tooling

View File

@ -1,5 +0,0 @@
---
'pockethost': patch
---
Update supported PocketBase versions, improve package hashes, and enhance deployment workflow with Wrangler integration

View File

@ -1,5 +0,0 @@
---
'pockethost': minor
---
Add webhooks support to PocketHost for scheduled and event-driven operations

View File

@ -1,4 +1,129 @@
<div class="docs-content prose p-5 w-full md:w-fit">
<a href="/blog"><h1>Bloggin Since 2025</h1></a>
<script lang="ts">
import { page } from '$app/stores'
import { faHome, faArrowLeft } from '@fortawesome/free-solid-svg-icons'
import Fa from 'svelte-fa'
// Check if we're on the blog index page
$: isIndexPage = $page.url.pathname === '/blog'
</script>
<div class="min-h-screen bg-base-50">
{#if !isIndexPage}
<!-- Blog post header with navigation -->
<div class="bg-base-100 border-b border-base-300 sticky top-0 z-10">
<div class="max-w-4xl mx-auto px-4 py-4">
<div class="flex items-center gap-4 mb-4">
<a href="/blog" class="btn btn-ghost btn-sm gap-2 hover:bg-primary/10 transition-colors">
<Fa icon={faArrowLeft} size="sm" />
Back to Blog
</a>
<div class="flex items-center gap-2 text-sm text-base-content/60">
<a href="/" class="hover:text-primary transition-colors">
<Fa icon={faHome} size="sm" />
</a>
<span>/</span>
<a href="/blog" class="hover:text-primary transition-colors">Blog</a>
<span>/</span>
<span class="text-base-content/80">Current Post</span>
</div>
</div>
<!-- Blog branding -->
<div class="flex items-center gap-3">
<div
class="w-10 h-10 bg-gradient-to-br from-primary to-secondary rounded-lg flex items-center justify-center"
>
<svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24">
<path
d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"
/>
</svg>
</div>
<div>
<h2 class="text-xl font-bold text-primary">PocketHost Blog</h2>
<p class="text-sm text-base-content/60">Latest updates and insights</p>
</div>
</div>
</div>
</div>
<!-- Blog post content with proper typography -->
<div class="max-w-4xl mx-auto px-4 py-8">
<article
class="prose prose-lg max-w-none prose-headings:text-base-content prose-p:text-base-content/80 prose-a:text-primary hover:prose-a:text-primary-focus prose-strong:text-base-content prose-code:text-primary prose-pre:bg-base-200 prose-blockquote:border-l-primary"
>
<slot />
</article>
<!-- Post footer -->
<div class="mt-16 pt-8 border-t border-base-300">
<div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4">
<div class="flex items-center gap-4">
<a href="/blog" class="btn btn-primary btn-outline gap-2">
<Fa icon={faArrowLeft} size="sm" />
More Posts
</a>
</div>
<div class="text-sm text-base-content/60">
<p>
Have questions? <a
href="https://discord.gg/nVTxCMEcGT"
target="_blank"
class="text-primary hover:underline">Join our Discord</a
>
</p>
</div>
</div>
</div>
</div>
{:else}
<!-- Blog index page - no additional wrapper needed -->
<slot />
{/if}
</div>
<style>
/* Custom prose styling for better readability */
:global(.prose h1) {
@apply text-3xl md:text-4xl font-bold mb-6 mt-0;
}
:global(.prose h2) {
@apply text-2xl md:text-3xl font-bold mb-4 mt-8;
}
:global(.prose h3) {
@apply text-xl md:text-2xl font-semibold mb-3 mt-6;
}
:global(.prose p) {
@apply leading-relaxed mb-4;
}
:global(.prose ul) {
@apply mb-4 pl-6;
}
:global(.prose li) {
@apply mb-2;
}
:global(.prose a) {
@apply font-medium underline-offset-2 decoration-2 hover:decoration-primary/60;
}
:global(.prose code) {
@apply bg-base-200 px-2 py-1 rounded text-sm;
}
:global(.prose blockquote) {
@apply bg-base-100 border-l-4 border-l-primary pl-4 py-2 my-4 italic;
}
/* Override prose max-width for full width content */
:global(.prose) {
max-width: none;
}
</style>

View File

@ -1,9 +0,0 @@
<script lang="ts">
import { toc } from './toc'
</script>
{#each toc as item}
## [{item.title}]({item.path})
{/each}

View File

@ -0,0 +1,141 @@
<script lang="ts">
import { toc } from './toc'
import { faCalendarAlt, faArrowRight } from '@fortawesome/free-solid-svg-icons'
import Fa from 'svelte-fa'
// Extract date from blog posts - we'll create a mapping for the major ones
const postDates: Record<string, string> = {
'/blog/pockethost-2-3-0-release': 'Jul 22, 2025',
'/blog/webhooks-launch': 'Jul 22, 2025',
'/blog/mothership-mirror-service': 'Jul 21, 2025',
'/blog/custom-domains-automation': 'Jul 19, 2025',
'/blog/kingdom': 'Jan 15, 2025',
'/blog/hard-paywall-is-live': 'Jan 10, 2025',
'/blog/announcing-dev-channel': 'Jan 8, 2025',
'/blog/hard-paywall': 'Jan 6, 2025',
'/blog/announcing-pocker': 'Dec 20, 2024',
}
const postDescriptions: Record<string, string> = {
'/blog/pockethost-2-3-0-release':
'Our biggest release yet! Introducing webhooks, automated custom domains, hard paywall, and major infrastructure improvements.',
'/blog/webhooks-launch':
'Automate your PocketBase workflows with our new webhooks feature - more reliable than cron jobs.',
'/blog/mothership-mirror-service':
'Enhanced infrastructure for better data synchronization and dashboard performance.',
'/blog/custom-domains-automation':
'Fully automated custom domain setup with Cloudflare integration and SSL certificates.',
'/blog/kingdom': 'Follow along as we build a realtime multiplayer game using PocketBase.',
'/blog/hard-paywall-is-live': 'The hard paywall is now active for new users, with existing users grandfathered in.',
'/blog/announcing-dev-channel': 'Our new YouTube channel for PocketBase tutorials and ecosystem content.',
'/blog/hard-paywall': "Why we're moving to a hard paywall model and what it means for the community.",
'/blog/announcing-pocker': 'Introducing our custom container solution for global PocketBase hosting.',
}
</script>
<svelte:head>
<title>Blog - PocketHost</title>
<meta name="description" content="Stay updated with the latest PocketHost features, tutorials, and community news." />
</svelte:head>
<div class="max-w-6xl mx-auto px-4 py-8">
<div class="mb-12 text-center">
<h1
class="text-4xl md:text-5xl font-bold mb-4 bg-gradient-to-r from-primary to-secondary bg-clip-text text-transparent"
>
Latest from PocketHost
</h1>
<p class="text-lg text-base-content/70 max-w-2xl mx-auto">
Stay updated with new features, platform improvements, and insights from the PocketHost team.
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{#each toc as item, index}
<div class="group">
<a href={item.path} class="block h-full transform transition-all duration-300 hover:scale-105 hover:shadow-xl">
<div class="card bg-base-100 shadow-lg h-full border border-base-300 hover:border-primary/30">
<div class="card-body p-6">
<!-- Featured badge for latest posts -->
{#if index < 3}
<div class="badge badge-primary badge-sm mb-3">Latest</div>
{/if}
<h2
class="card-title text-xl font-bold mb-3 group-hover:text-primary transition-colors duration-300 line-clamp-2"
>
{item.title}
</h2>
{#if postDescriptions[item.path]}
<p class="text-base-content/70 text-sm mb-4 line-clamp-3">
{postDescriptions[item.path]}
</p>
{/if}
<div class="flex items-center justify-between mt-auto">
{#if postDates[item.path]}
<div class="flex items-center gap-2 text-xs text-base-content/60">
<Fa icon={faCalendarAlt} size="sm" />
<span>{postDates[item.path]}</span>
</div>
{/if}
<div class="flex items-center gap-2 text-primary group-hover:gap-3 transition-all duration-300">
<span class="text-sm font-medium">Read more</span>
<Fa
icon={faArrowRight}
size="sm"
class="transform group-hover:translate-x-1 transition-transform duration-300"
/>
</div>
</div>
</div>
</div>
</a>
</div>
{/each}
</div>
<!-- Newsletter/Subscribe section -->
<div class="mt-16 bg-gradient-to-r from-primary/10 to-secondary/10 rounded-2xl p-8 text-center">
<h3 class="text-2xl font-bold mb-3">Stay in the Loop</h3>
<p class="text-base-content/70 mb-6 max-w-lg mx-auto">
Join our Discord community to get the latest updates and connect with other PocketHost users.
</p>
<a
href="https://discord.gg/nVTxCMEcGT"
target="_blank"
rel="noopener noreferrer"
class="btn btn-primary btn-lg gap-2 hover:scale-105 transition-transform duration-300"
>
Join Discord Community
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path
d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.010c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"
/>
</svg>
</a>
</div>
</div>
<style>
.line-clamp-2 {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.line-clamp-3 {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.bg-clip-text {
-webkit-background-clip: text;
background-clip: text;
}
</style>

View File

@ -0,0 +1,5 @@
## Automated Custom Domains with Cloudflare
_[@cap'n](https://discord.gg/nVTxCMEcGT) Jul 19, 2025_
Custom domains are out of beta and now fully automated. No more having to check with me to get custom domains approved. We're using Cloudflare's `HTTP validation` which typically takes seconds to provision and verify a custom domain. All you have to do is add a CNAME entry on your side.

View File

@ -0,0 +1,9 @@
## Enhanced Data Synchronization with MothershipMirrorService
_[@cap'n](https://discord.gg/nVTxCMEcGT) Jul 21, 2025_
PocketHost now has a `Mothership Mirror Service` that runs on the edge. It grabs all the instance and user records and caches them in memory. Then, it uses PocketBase's realtime SSE feature (live link to Mothership) to receive updates.
The result is that PocketHost edges now stay completely up to date with the Mothership without having to make any queries to it. This improves performance significantly because lookups happen locally in memory.
This improvement also positions us to begin adding more edge nodes, allowing PocketHost to expand beyond a single VPS.

View File

@ -0,0 +1,24 @@
## PocketHost 2.3.0
_[@cap'n](https://discord.gg/nVTxCMEcGT) Jul 22, 2025_
### Minor Changes
- b03fa83: Add blog functionality with dynamic promo banner integration and content management features
- b03fa83: Implement automated custom domains with Cloudflare integration and multiple domain support per instance
- b03fa83: Enhance dashboard UI with improved layout constraints, instance title cosmetics, user subscription logging, and subdomain text truncation
- b03fa83: Add MothershipMirrorService with event handlers for improved data synchronization
- b03fa83: Add subscription quantity management, billing integration improvements, and enhanced user account controls with suspension support
- b03fa83: Add webhooks support to PocketHost for scheduled and event-driven operations
### Patch Changes
- 60307e6: Add db migration support for multiple custom domains per instance
- b03fa83: Fix various issues including empty instance name validation, blog link typos, avatar digest errors, promo banner links, and delete button functionality
- b03fa83: Improve console logger browser compatibility and optimize breadcrumb handling for better debugging
- 1e02cb4: update MOTHERSHIP_URL formatting to include subdomain and trim path segments
- b03fa83: Fix firewall health check endpoints and improve HTTP status code responses for better monitoring
- b03fa83: Improve instance shutdown handling, add HandleInstanceResolve API, and enhance Docker container startup timing
- b03fa83: Improve logging consistency across services, enhance error messaging, and add container launch timing for better debugging
- b03fa83: Migrate to tsx for CLI execution, remove winston logging, and improve build tooling
- b03fa83: Update supported PocketBase versions, improve package hashes, and enhance deployment workflow with Wrangler integration

View File

@ -1,4 +1,20 @@
export const toc = [
{
title: 'PocketHost 2.3.0',
path: '/blog/pockethost-2-3-0-release',
},
{
title: 'Webhooks Support is Here',
path: '/blog/webhooks-launch',
},
{
title: 'Enhanced Data Synchronization with MothershipMirrorService',
path: '/blog/mothership-mirror-service',
},
{
title: 'Automated Custom Domains with Cloudflare',
path: '/blog/custom-domains-automation',
},
{
title: 'Building a Realtime Game: Kingdom',
path: '/blog/kingdom',

View File

@ -0,0 +1,11 @@
## Webhooks Support is Here
_[@cap'n](https://discord.gg/nVTxCMEcGT) Jul 22, 2025_
We've just launched webhooks support for PocketHost! This is a game-changer for anyone who needs scheduled operations or event-driven workflows with their PocketBase instances.
Previously, PocketBase's [job scheduling](https://pocketbase.io/docs/js-jobs-scheduling/) wouldn't work reliably on PocketHost because we hibernate inactive instances.
While the inbuilt job scheduling is still affected by hibernation, now you can add custom API endpoints and call them via our cron-based webhooks. Whatever you could do with the inbuilt PocketBase job scheduling can now be handled with webhooks instead.
Check it out in the dashboard today!

View File

@ -1,5 +1,32 @@
# pockethost
## 3.0.0
### Major Changes
- b03fa83: Implement hard paywall system with subscription management, billing integration, and user access controls
### Minor Changes
- b03fa83: Add blog functionality with dynamic promo banner integration and content management features
- b03fa83: Implement automated custom domains with Cloudflare integration and multiple domain support per instance
- b03fa83: Enhance dashboard UI with improved layout constraints, instance title cosmetics, user subscription logging, and subdomain text truncation
- b03fa83: Add MothershipMirrorService with event handlers for improved data synchronization
- b03fa83: Add subscription quantity management, billing integration improvements, and enhanced user account controls with suspension support
- b03fa83: Add webhooks support to PocketHost for scheduled and event-driven operations
### Patch Changes
- 60307e6: Add db migration support for multiple custom domains per instance
- b03fa83: Fix various issues including empty instance name validation, blog link typos, avatar digest errors, promo banner links, and delete button functionality
- b03fa83: Improve console logger browser compatibility and optimize breadcrumb handling for better debugging
- 1e02cb4: update MOTHERSHIP_URL formatting to include subdomain and trim path segments
- b03fa83: Fix firewall health check endpoints and improve HTTP status code responses for better monitoring
- b03fa83: Improve instance shutdown handling, add HandleInstanceResolve API, and enhance Docker container startup timing
- b03fa83: Improve logging consistency across services, enhance error messaging, and add container launch timing for better debugging
- b03fa83: Migrate to tsx for CLI execution, remove winston logging, and improve build tooling
- b03fa83: Update supported PocketBase versions, improve package hashes, and enhance deployment workflow with Wrangler integration
## 2.2.0
### Minor Changes

View File

@ -1,6 +1,6 @@
{
"name": "pockethost",
"version": "2.2.0",
"version": "2.3.0",
"author": {
"name": "Ben Allfree",
"url": "https://github.com/benallfree"