[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-en-netpostpanel":3,"technology-slugs-en":41,"mdc--cxege4-key":65},{"id":4,"title":5,"content":6,"date":7,"description":8,"extension":9,"featured":10,"image":11,"links":12,"meta":18,"stack":19,"stem":35,"tags":36,"url":39,"__hash__":40},"projects_en\u002Fen\u002Fprojects\u002Fnetpostpanel.yml","NetPostPanel","An internal AI content-operations platform that turns topic research into publishable content: a full RAG pipeline (Google Custom Search + RSS → scraping → multi-provider generation → vectorization), plus a versioned external API that powers content workflows in other projects, including the DigiSpace blog pipeline.\n\n## Key Features\n\n- **External API** - a versioned `POST \u002Fapi\u002Fv1\u002Fgenerate` + `\u002Ftranslate` API with per-client keys and rate limits exposes the whole pipeline to other apps, sync or async with callbacks\n- **Auto Pilot** - scheduled daily runs generate content from new inspiration items or custom topics, fully unattended\n- **Provider-agnostic AI** - Gemini and OpenAI sit behind a driver abstraction, so swapping models is config, not refactoring\n- **Semantic pipeline** - Qdrant vector search deduplicates and clusters incoming stories before they reach generation\n- **Autonomous aggregation** - RSS auto-discovery and Google Custom Search plus scraping turn a bare topic into a self-feeding content source\n- **Observable LLM calls** - every generation is traced in Langfuse: tokens, latency, cost\n- **Role-based access** - admin\u002Fcontent manager\u002Feditor roles, with every query scoped to its owner unless admin\n\n## Tech Stack\n\n- **Backend**: Laravel, `laravel\u002Fai` agents\n- **Frontend**: Inertia.js + Vue 3 (Search & Creation SPA, TipTap editor)\n- **AI**: Multi-provider (Gemini\u002FOpenAI) behind a driver abstraction\n- **Research**: Google Custom Search + RSS aggregation, page scraping\n- **Vector DB**: Qdrant for semantic search\n- **Observability**: Langfuse for LLM tracing\n- **Queue**: Laravel Horizon\n- **Tests**: PHPUnit\u002FPest + Cypress E2E\n","2024-11-10","AI content-operations platform — a RAG pipeline (research → scrape → generate → vectorize), an external API other apps call, and Auto Pilot for unattended scheduled generation","yml",true,"\u002Fhero\u002Fnetpostpanel.avif",[13],{"label":14,"to":15,"color":16,"icon":17},"Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fnet-post-panel-overview","neutral","i-simple-icons-github",{},[20,23,26,29,32],{"name":21,"icon":22},"Laravel","i-simple-icons-laravel",{"name":24,"icon":25},"AI","i-heroicons-sparkles",{"name":27,"icon":28},"Qdrant","i-simple-icons-qdrant",{"name":30,"icon":31},"Langfuse","i-heroicons-chart-bar",{"name":33,"icon":34},"Horizon","i-simple-icons-laravelhorizon","en\u002Fprojects\u002Fnetpostpanel",[24,21,37,38,27,33],"RAG","External API","https:\u002F\u002Fnet-post-panel.digispace.pro","9F27sKWiICL9ugPIbYmr3dQH8lYynDHYMUcKPSIVVGQ",[42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64],"caddy","cloudflare","digitalocean","docker","filament","github-actions","go","hetzner","hostinger","laravel","mysql","nuxt","php","postgresql","proxmox","redis","stripe","symfony","tailwindcss","terraform","typescript","vite","vue",{"data":66,"body":67},{},{"type":68,"children":69},"root",[70,78,85,177,183],{"type":71,"tag":72,"props":73,"children":74},"element","p",{},[75],{"type":76,"value":77},"text","An internal AI content-operations platform that turns topic research into publishable content: a full RAG pipeline (Google Custom Search + RSS → scraping → multi-provider generation → vectorization), plus a versioned external API that powers content workflows in other projects, including the DigiSpace blog pipeline.",{"type":71,"tag":79,"props":80,"children":82},"h2",{"id":81},"key-features",[83],{"type":76,"value":84},"Key Features",{"type":71,"tag":86,"props":87,"children":88},"ul",{},[89,117,127,137,147,157,167],{"type":71,"tag":90,"props":91,"children":92},"li",{},[93,98,100,107,109,115],{"type":71,"tag":94,"props":95,"children":96},"strong",{},[97],{"type":76,"value":38},{"type":76,"value":99}," - a versioned ",{"type":71,"tag":101,"props":102,"children":104},"code",{"className":103},[],[105],{"type":76,"value":106},"POST \u002Fapi\u002Fv1\u002Fgenerate",{"type":76,"value":108}," + ",{"type":71,"tag":101,"props":110,"children":112},{"className":111},[],[113],{"type":76,"value":114},"\u002Ftranslate",{"type":76,"value":116}," API with per-client keys and rate limits exposes the whole pipeline to other apps, sync or async with callbacks",{"type":71,"tag":90,"props":118,"children":119},{},[120,125],{"type":71,"tag":94,"props":121,"children":122},{},[123],{"type":76,"value":124},"Auto Pilot",{"type":76,"value":126}," - scheduled daily runs generate content from new inspiration items or custom topics, fully unattended",{"type":71,"tag":90,"props":128,"children":129},{},[130,135],{"type":71,"tag":94,"props":131,"children":132},{},[133],{"type":76,"value":134},"Provider-agnostic AI",{"type":76,"value":136}," - Gemini and OpenAI sit behind a driver abstraction, so swapping models is config, not refactoring",{"type":71,"tag":90,"props":138,"children":139},{},[140,145],{"type":71,"tag":94,"props":141,"children":142},{},[143],{"type":76,"value":144},"Semantic pipeline",{"type":76,"value":146}," - Qdrant vector search deduplicates and clusters incoming stories before they reach generation",{"type":71,"tag":90,"props":148,"children":149},{},[150,155],{"type":71,"tag":94,"props":151,"children":152},{},[153],{"type":76,"value":154},"Autonomous aggregation",{"type":76,"value":156}," - RSS auto-discovery and Google Custom Search plus scraping turn a bare topic into a self-feeding content source",{"type":71,"tag":90,"props":158,"children":159},{},[160,165],{"type":71,"tag":94,"props":161,"children":162},{},[163],{"type":76,"value":164},"Observable LLM calls",{"type":76,"value":166}," - every generation is traced in Langfuse: tokens, latency, cost",{"type":71,"tag":90,"props":168,"children":169},{},[170,175],{"type":71,"tag":94,"props":171,"children":172},{},[173],{"type":76,"value":174},"Role-based access",{"type":76,"value":176}," - admin\u002Fcontent manager\u002Feditor roles, with every query scoped to its owner unless admin",{"type":71,"tag":79,"props":178,"children":180},{"id":179},"tech-stack",[181],{"type":76,"value":182},"Tech Stack",{"type":71,"tag":86,"props":184,"children":185},{},[186,204,214,223,233,243,253,263],{"type":71,"tag":90,"props":187,"children":188},{},[189,194,196,202],{"type":71,"tag":94,"props":190,"children":191},{},[192],{"type":76,"value":193},"Backend",{"type":76,"value":195},": Laravel, ",{"type":71,"tag":101,"props":197,"children":199},{"className":198},[],[200],{"type":76,"value":201},"laravel\u002Fai",{"type":76,"value":203}," agents",{"type":71,"tag":90,"props":205,"children":206},{},[207,212],{"type":71,"tag":94,"props":208,"children":209},{},[210],{"type":76,"value":211},"Frontend",{"type":76,"value":213},": Inertia.js + Vue 3 (Search & Creation SPA, TipTap editor)",{"type":71,"tag":90,"props":215,"children":216},{},[217,221],{"type":71,"tag":94,"props":218,"children":219},{},[220],{"type":76,"value":24},{"type":76,"value":222},": Multi-provider (Gemini\u002FOpenAI) behind a driver abstraction",{"type":71,"tag":90,"props":224,"children":225},{},[226,231],{"type":71,"tag":94,"props":227,"children":228},{},[229],{"type":76,"value":230},"Research",{"type":76,"value":232},": Google Custom Search + RSS aggregation, page scraping",{"type":71,"tag":90,"props":234,"children":235},{},[236,241],{"type":71,"tag":94,"props":237,"children":238},{},[239],{"type":76,"value":240},"Vector DB",{"type":76,"value":242},": Qdrant for semantic search",{"type":71,"tag":90,"props":244,"children":245},{},[246,251],{"type":71,"tag":94,"props":247,"children":248},{},[249],{"type":76,"value":250},"Observability",{"type":76,"value":252},": Langfuse for LLM tracing",{"type":71,"tag":90,"props":254,"children":255},{},[256,261],{"type":71,"tag":94,"props":257,"children":258},{},[259],{"type":76,"value":260},"Queue",{"type":76,"value":262},": Laravel Horizon",{"type":71,"tag":90,"props":264,"children":265},{},[266,271],{"type":71,"tag":94,"props":267,"children":268},{},[269],{"type":76,"value":270},"Tests",{"type":76,"value":272},": PHPUnit\u002FPest + Cypress E2E"]