A modern, SEO-optimized web hosting review site built with SvelteKit 2, Svelte 5, TailwindCSS 4, and PocketBase.
- Rich Content Editor: Tiptap-based editor with custom components
- Custom Components:
- Rating cards for hosting providers
- Pros/Cons lists
- Comparison tables
- Pricing tables
- Call-to-action blocks
- Alert boxes
- Content Management:
- Posts/Articles with categories (reviews, comparisons, guides, news, tutorials)
- Static pages
- Hosting provider profiles
- Media library
- Site settings
- Server-Side Rendering: All public pages use SSR for optimal SEO
- SEO Optimized:
- Meta tags with svelte-meta-tags
- JSON-LD structured data
- OpenGraph and Twitter cards
- Semantic HTML
- Responsive Design: Mobile-first, fully responsive layout
- TailwindCSS 4: Modern utility-first CSS framework
- Superuser-only CMS access
- Secure filtering with
pb.filter()on server-side - Published/draft system for content
- Frontend: SvelteKit 2, Svelte 5 (runes mode)
- Styling: TailwindCSS 4 with forms and typography plugins
- Backend: PocketBase
- Editor: Tiptap
- SEO: svelte-meta-tags
packages/web/
├── src/
│ ├── lib/
│ │ ├── components/
│ │ │ ├── content/ # Reusable content components
│ │ │ │ ├── RatingCard.svelte
│ │ │ │ ├── ProsCons.svelte
│ │ │ │ ├── ComparisonTable.svelte
│ │ │ │ ├── PricingTable.svelte
│ │ │ │ ├── CallToAction.svelte
│ │ │ │ └── Alert.svelte
│ │ │ ├── editor/ # CMS editor components
│ │ │ │ └── TiptapEditor.svelte
│ │ │ └── ContentRenderer.svelte
│ │ └── pocketbase.ts # PocketBase client & types
│ └── routes/
│ ├── +layout.svelte # Main layout with nav & footer
│ ├── +page.svelte # Homepage
│ ├── posts/ # Blog/posts
│ │ ├── +page.server.ts
│ │ ├── +page.svelte
│ │ └── [slug]/
│ │ ├── +page.server.ts
│ │ └── +page.svelte
│ └── admin/ # CMS admin area
│ ├── +layout.svelte
│ ├── +page.svelte # Dashboard
│ ├── login/
│ │ └── +page.svelte
│ └── posts/
│ ├── +page.svelte # Posts list
│ └── [id]/
│ └── +page.svelte # Post editor
│
pocketbase/
└── pb_migrations/
└── 1700000000_initial_schema.js
-
posts - Blog posts and reviews
- Fields: title, slug, content (JSON), excerpt, featured_image, category, tags, rating, SEO fields
- Relations: hosting_provider, author
-
pages - Static pages
- Fields: title, slug, content (JSON), excerpt, featured_image, SEO fields
- Relations: author
-
hosting_providers - Hosting company profiles
- Fields: name, slug, logo, website, affiliate_link, description, rating, pricing, features, pros, cons
-
component_templates - Reusable editor components
- Fields: name, type, description, default_data (JSON), schema (JSON)
-
media - Media library
- Fields: title, file, alt_text, caption, type
-
site_settings - Global site settings
- Fields: key, value (JSON), description
- Node.js 18+
- PocketBase binary
-
Install dependencies:
cd packages/web npm install -
Set up PocketBase:
- Download PocketBase from https://pocketbase.io/
- Place the binary in
pocketbase/directory - Run migrations:
cd pocketbase ./pocketbase serve - Create your first admin user at http://127.0.0.1:8090/_/
-
Run development server:
cd packages/web npm run dev -
Access the site:
- Frontend: http://localhost:5173
- Admin: http://localhost:5173/admin
- PocketBase Admin: http://127.0.0.1:8090/_/
- Login to
/admin/login/with your PocketBase admin credentials - Navigate to "Posts" to create blog posts/reviews
- Use the Tiptap editor to add content
- Insert custom components using the toolbar buttons
- Set SEO metadata in the sidebar
- Publish when ready
The editor includes these custom components:
- Rating Card: Display hosting provider with rating and CTA
- Pros/Cons: Two-column list of advantages and disadvantages
- Comparison Table: Side-by-side provider comparison
- Pricing Table: Pricing plans with features
- Call to Action: Highlighted CTA block
- Alert: Info/warning/success/error messages
- review: Hosting provider reviews
- comparison: Head-to-head comparisons
- guide: How-to guides and tutorials
- news: Industry news and updates
- tutorial: Step-by-step tutorials
- Create component in
src/lib/components/content/ - Add Tiptap extension in
TiptapEditor.svelte - Add rendering logic in
ContentRenderer.svelte - Update component_templates collection in PocketBase
Edit tailwind.config.js to customize colors, spacing, etc. The primary color palette can be adjusted in the theme.extend.colors.primary section.
cd packages/web
npm run buildConfigure your PocketBase URL if different from default:
PUBLIC_POCKETBASE_URL=https://your-pb-instance.comThis is a private project for HostingManual.net.
Proprietary - All rights reserved.