Welcome to My Portfolio — a modern, full-stack personal showcase built with Next.js, styled with Tailwind CSS, and powered by a PocketBase backend. It also integrates OpenAI to enable smart and interactive experiences.
- ✅ PocketBase Integration for dynamic content (e.g., portfolio images, project data)
- 🤖 OpenAI Integration to support smart interactions (like AI summaries or content generation)
- 🎨 Tailwind CSS styling with custom theming
- ⚙️ TypeScript support for safer, scalable development
- 🔍 Dynamic Search & Filtering for projects
- 🌐 Responsive Design optimized for all devices
This project now includes a safe migration path from PocketBase collections to Neon PostgreSQL.
Create/update .env with:
NEON_DATABASE_URL=postgresql://USER:PASSWORD@HOST/DB?sslmode=require&channel_binding=require
POCKETBASE_URL=https://remain-faceghost.pockethost.io
POCKETBASE_ADMIN_EMAIL=
POCKETBASE_ADMIN_PASSWORD=
REVALIDATE_SECRET=
ASSISTANT_REFRESH_SECRET=
OPENAI_API_KEY=
OPENAI_EMBEDDING_MODEL=text-embedding-3-smallPOCKETBASE_ADMIN_EMAIL and POCKETBASE_ADMIN_PASSWORD are optional (only required for protected collections).
pnpm installpnpm db:migrate:pocketbase-to-neonpnpm db:verifyThe migration creates a microservice-friendly schema with separate tables and relationships:
profiles(source:profilecollection)projects(source:projectscollection, linked toprofiles)project_tools(one-to-many tools for each project)project_tags(one-to-many AI/feature tags for each project)portfolio_items(source:portfolio_images, linked toprojectsandprofiles)portfolio_item_tags(one-to-many tags for each portfolio item)migration_runs(audit trail for every migration execution)
To avoid data loss, each core table stores the full PocketBase record in raw_payload (JSONB), in addition to normalized columns.
The application runtime now reads from Neon (PostgreSQL) via Next.js API routes:
/api/profile/api/projects/api/portfolio-items
The AI assistant also builds a database-backed knowledge catalog in Neon:
assistant_knowledge_documentsstores assistant-ready documents derived fromprofiles,projects, andportfolio_items/api/assistant/refreshrefreshes assistant knowledge and can optionally sync embeddings whenOPENAI_API_KEYis configuredscripts/verify-neon-data.mjsreports assistant document and embedding counts
PocketBase is now only required for migration workflows (pnpm db:migrate:pocketbase-to-neon) and can be retired after you verify Neon data and app behavior in production.
This project is licensed under the MIT License.
Meshack Bwire
Portfolio Website | GitHub