From 06846421d8fa4322c2fb2d501b32821f9c6180ac Mon Sep 17 00:00:00 2001 From: hallelx2 Date: Sun, 21 Jun 2026 00:47:56 +0100 Subject: [PATCH 1/2] =?UTF-8?q?style:=20blog=20redesign=20v2=20=E2=80=94?= =?UTF-8?q?=20premium=20full-page=20editorial=20layout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/blogs/app/page.tsx | 1167 ++++++++++++++++++++++++--------------- 1 file changed, 723 insertions(+), 444 deletions(-) diff --git a/apps/blogs/app/page.tsx b/apps/blogs/app/page.tsx index e48b395..8b63788 100644 --- a/apps/blogs/app/page.tsx +++ b/apps/blogs/app/page.tsx @@ -1,23 +1,29 @@ 'use client'; -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import Link from 'next/link'; -import { - ArrowRight, - X, - Calendar, - Clock, - Search, - BookOpen, +import { + ArrowRight, + ArrowUpRight, + X, + Calendar, + Clock, + Search, + BookOpen, Terminal, ChevronRight, Menu, - ArrowUpRight + Sparkles, + Newspaper, + Zap, + FileText, + ArrowLeft, + ExternalLink, } from 'lucide-react'; import { VectorlessIcon, VectorlessDot } from './VectorlessIcon'; -// Categories matching our blog categories +/* ─── Types ─── */ type Category = 'All' | 'Product Updates' | 'Engineering' | 'Guides' | 'Features'; interface Author { @@ -38,279 +44,351 @@ interface BlogPost { imageType: 'architecture' | 'database' | 'code' | 'benchmark'; } +/* ─── Authors ─── */ const AUTHORS: Record = { hallel: { name: 'Oludele Halleluyah', avatarUrl: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?auto=format&fit=crop&q=80&w=120&h=120', - role: 'Founder & Principal Engineer' + role: 'Founder & Principal Engineer', }, jane: { name: 'Jane Cooper', avatarUrl: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?auto=format&fit=crop&q=80&w=120&h=120', - role: 'AI Research Specialist' + role: 'AI Research Specialist', }, guy: { name: 'Guy Hawkins', avatarUrl: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?auto=format&fit=crop&q=80&w=120&h=120', - role: 'Infrastructure Architect' - } + role: 'Infrastructure Architect', + }, }; +/* ─── Blog Data ─── */ const BLOG_POSTS: BlogPost[] = [ { id: 'retrieval-reasoning-era', title: 'Retrieval for the reasoning era: beyond vector search', - snippet: 'Why traditional RAG chunking is a black box that destroys document structure, and how LLM reasoning over document maps restores it.', + snippet: + 'Why traditional RAG chunking is a black box that destroys document structure, and how LLM reasoning over document maps restores it.', category: 'Engineering', date: 'Jun 20, 2026', readTime: '5 min read', author: AUTHORS.hallel, imageType: 'architecture', content: [ - "Traditional RAG shatters your documents into arbitrary 500-token chunks. It computes vector embeddings for each chunk and places them in a vector database. But this similarity search is a black box. It has no understanding of headings, lists, table hierarchies, or structural flow.", - "Vectorless takes a fundamentally different approach. We believe that documents have structure for a reason. By preserving document trees (headings, sections, chapters) and building section-by-section maps, we let LLM agents read and navigate the document outline like a human does.", - "Why this matters:", - "1. True Citations: Since sections are preserved, citations refer to actual logical units, not arbitrary character ranges.", - "2. Full Context: When an agent selects a section, it gets the entire, unbroken section context.", - "3. Deterministic Explanation: You can inspect exactly why the agent chose a particular section, making retrieval transparent." - ] + 'Traditional RAG shatters your documents into arbitrary 500-token chunks. It computes vector embeddings for each chunk and places them in a vector database. But this similarity search is a black box. It has no understanding of headings, lists, table hierarchies, or structural flow.', + 'Vectorless takes a fundamentally different approach. We believe that documents have structure for a reason. By preserving document trees (headings, sections, chapters) and building section-by-section maps, we let LLM agents read and navigate the document outline like a human does.', + 'Why this matters:', + '1. True Citations: Since sections are preserved, citations refer to actual logical units, not arbitrary character ranges.', + '2. Full Context: When an agent selects a section, it gets the entire, unbroken section context.', + '3. Deterministic Explanation: You can inspect exactly why the agent chose a particular section, making retrieval transparent.', + ], }, { id: 'self-hosting-vectorless-engine', title: 'Self-hosting the Vectorless Engine with Docker and Neon', - snippet: 'A step-by-step walkthrough to deploy the core Go retrieval engine in your private cloud with secure database isolation.', + snippet: + 'A step-by-step walkthrough to deploy the core Go retrieval engine in your private cloud with secure database isolation.', category: 'Guides', date: 'Jun 18, 2026', readTime: '6 min read', author: AUTHORS.hallel, imageType: 'database', content: [ - "The core Vectorless engine is open-source and built for speed in Go. To run it in your own environment, you only need three infrastructure primitives: PostgreSQL (with pgvector), S3-compatible object storage (e.g. Cloudflare R2 or MinIO), and a job queue (like River or QStash).", - "In this post, we demonstrate how to spin up the Docker-based container stack, configure the Admin API endpoints, and establish encrypted BYOK (Bring Your Own Key) access for your organizational users.", - "We will also explore setting up tenant boundaries so that document parser caches do not cross authorization scopes, guaranteeing metadata security." - ] + 'The core Vectorless engine is open-source and built for speed in Go. To run it in your own environment, you only need three infrastructure primitives: PostgreSQL (with pgvector), S3-compatible object storage (e.g. Cloudflare R2 or MinIO), and a job queue (like River or QStash).', + 'In this post, we demonstrate how to spin up the Docker-based container stack, configure the Admin API endpoints, and establish encrypted BYOK (Bring Your Own Key) access for your organizational users.', + 'We will also explore setting up tenant boundaries so that document parser caches do not cross authorization scopes, guaranteeing metadata security.', + ], }, { id: 'llm-reasoning-retrieval', title: 'How LLM reasoning models solve the chunk-overlap nightmare', - snippet: 'How advanced reasoning loops avoid retrieval failures by reading summaries before pulling full-text contents.', + snippet: + 'How advanced reasoning loops avoid retrieval failures by reading summaries before pulling full-text contents.', category: 'Features', date: 'Jun 14, 2026', readTime: '4 min read', author: AUTHORS.guy, imageType: 'code', content: [ - "In classical retrieval, developers tweak overlap percentages to avoid splitting sentences in half. This is a fragile bandage. By generating an interactive table of contents (ToC) with summaries, we present the agent with a clean, high-level map.", - "The agent reasons about which sections are relevant *before* reading them, bypassing overlap limits completely. This post explains the mathematical and logical validation behind this flow." - ] + 'In classical retrieval, developers tweak overlap percentages to avoid splitting sentences in half. This is a fragile bandage. By generating an interactive table of contents (ToC) with summaries, we present the agent with a clean, high-level map.', + 'The agent reasons about which sections are relevant *before* reading them, bypassing overlap limits completely. This post explains the mathematical and logical validation behind this flow.', + ], }, { id: 'vectorless-release-1-0', title: 'Vectorless Release 1.0.0: Ingestion Streaming & Citations', - snippet: 'Announcing the stable v1 release of the Vectorless engine. Built on a modular Go core with SSE streaming and unified citations.', + snippet: + 'Announcing the stable v1 release of the Vectorless engine. Built on a modular Go core with SSE streaming and unified citations.', category: 'Product Updates', date: 'Jun 05, 2026', readTime: '3 min read', author: AUTHORS.hallel, imageType: 'architecture', content: [ - "We are thrilled to launch the fully redesigned Vectorless Core Engine 1.0.0. Built natively in Go for ultra-fast document parsing and tree building, this release is exclusively focused on making document retrieval deterministic and trace-verifiable.", - "Key Features in 1.0:", - "- Server-Sent Events Ingestion: Live progress logs while processing heavy PDFs and Word documents.", - "- Integrated Citation Validation: Guarantee that retrieved chunks match the exact heading paths.", - "- Native ConnectRPC & REST support: Expose standard JSON endpoints alongside protobuf definitions." - ] + 'We are thrilled to launch the fully redesigned Vectorless Core Engine 1.0.0. Built natively in Go for ultra-fast document parsing and tree building, this release is exclusively focused on making document retrieval deterministic and trace-verifiable.', + 'Key Features in 1.0:', + '- Server-Sent Events Ingestion: Live progress logs while processing heavy PDFs and Word documents.', + '- Integrated Citation Validation: Guarantee that retrieved chunks match the exact heading paths.', + '- Native ConnectRPC & REST support: Expose standard JSON endpoints alongside protobuf definitions.', + ], }, { id: 'evaluating-retrieval-financebench', title: 'Evaluating Retrieval Accuracy: FinanceBench Case Study', - snippet: 'How structure-preserving retrieval outperforms traditional LangChain chunking setups on complex quarterly financial filings.', + snippet: + 'How structure-preserving retrieval outperforms traditional LangChain chunking setups on complex quarterly financial filings.', category: 'Engineering', date: 'May 28, 2026', readTime: '8 min read', author: AUTHORS.jane, imageType: 'benchmark', content: [ - "Evaluating retrieval systems is notoriously hard. In this study, we ran the FinanceBench benchmark dataset across three configurations: (A) Traditional recursive chunking, (B) Parent-document retrieval, and (C) Vectorless structure-preserving retrieval.", - "Vectorless achieved 94.2% accuracy on complex tabular cross-referencing questions, compared to 62.1% for traditional chunking, because it did not truncate financial table nodes." - ] + 'Evaluating retrieval systems is notoriously hard. In this study, we ran the FinanceBench benchmark dataset across three configurations: (A) Traditional recursive chunking, (B) Parent-document retrieval, and (C) Vectorless structure-preserving retrieval.', + 'Vectorless achieved 94.2% accuracy on complex tabular cross-referencing questions, compared to 62.1% for traditional chunking, because it did not truncate financial table nodes.', + ], }, { id: 'hybrid-retrieval-trees', title: 'Hybrid Retrieval: Combining Structural Trees with Keyword Search', - snippet: 'How the Vectorless hybrid strategy overlays BM25 keyword matching with LLM reasoning maps for the best of both worlds.', + snippet: + 'How the Vectorless hybrid strategy overlays BM25 keyword matching with LLM reasoning maps for the best of both worlds.', category: 'Engineering', date: 'May 14, 2026', readTime: '5 min read', author: AUTHORS.jane, imageType: 'architecture', content: [ - "While LLM reasoning over document outlines yields superior accuracy for contextual questions, sometimes users search for highly specific keywords or exact code definitions.", - "To address this, Vectorless 1.0 supports a hybrid strategy. It performs a fast lexical pre-scan (BM25) over the document node tree to identify candidate sections, which are then annotated directly inside the Document Map.", - "The LLM agent then reasons over both the semantic summaries and the keyword frequency hits to make the final retrieval decision. This combines the speed of classic search with the intelligence of agentic reasoning." - ] - } + 'While LLM reasoning over document outlines yields superior accuracy for contextual questions, sometimes users search for highly specific keywords or exact code definitions.', + 'To address this, Vectorless 1.0 supports a hybrid strategy. It performs a fast lexical pre-scan (BM25) over the document node tree to identify candidate sections, which are then annotated directly inside the Document Map.', + 'The LLM agent then reasons over both the semantic summaries and the keyword frequency hits to make the final retrieval decision. This combines the speed of classic search with the intelligence of agentic reasoning.', + ], + }, ]; -// High-fidelity blueprint schematic visualizations -function BlueprintIllustration({ type }: { type: BlogPost['imageType'] }) { +/* ─── Blueprint Illustrations (SVG Schematics) ─── */ +function BlueprintIllustration({ type, large = false }: { type: BlogPost['imageType']; large?: boolean }) { + const h = large ? 'h-[200px]' : 'h-[140px]'; return ( -
- {/* Schematic coordinate lines */} -
-
SYS_REF // X_01
-
SCALE // 1:1.0
-
-
+
+ {/* Coordinate overlay */} +
+
+ SYS_REF // VECTORLESS +
+
+ SCALE // 1:1 +
+ {/* Cross-hair */} +
+
{type === 'architecture' && ( - - {/* Main Tree structure */} - - - - - - {/* Node representation */} - - - - - - {/* Target points */} - - - TARGET - - {/* Tree branch outlines */} - - node.root + + {/* Hierarchy tree */} + + + + + + + + + + + {/* Node dots */} + + + + + + + + + + + {/* Target callout */} + + + + + TARGET + + + {/* Label */} + + + node.root + )} {type === 'database' && ( - - {/* Coordinate grid */} - - - {/* DB Cylinder shapes */} - - - - - - - - {/* Index label indicator */} - - - v_index + + + + {/* DB cylinders */} + + + + + + + {/* Index callout */} + + + + v_index + + + {/* Data flow arrows */} + + + write_buffer + + + + + + )} {type === 'code' && ( - - {/* Code Window Border */} - - - {/* Custom syntax drawing */} - - {/* Header / Dots */} - - - - - {/* Lines */} - - - - - + + + + + {/* Traffic lights */} + + + + + {/* Code lines */} + + + + + + )} {type === 'benchmark' && ( - - {/* Axis lines */} - - - - {/* Performance Curves */} - - - - {/* Interactive target dots */} - - - - {/* Grid annotations */} - - 94.2% ACC + + {/* Grid lines */} + {[30, 50, 70, 90].map((y) => ( + + ))} + + {/* Axes */} + + + + {/* Baseline curve (traditional) */} + + + {/* Vectorless performance curve */} + + + {/* Area under Vectorless curve */} + + + {/* Data points */} + + + + + {/* Annotation */} + + + 94.2% ACC + + + {/* Legend */} + + + Vectorless + + + + Traditional + )}
); } +/* ─── Main Blog Page ─── */ export default function BlogPage() { const [selectedCategory, setSelectedCategory] = useState('All'); const [activeArticle, setActiveArticle] = useState(null); const [scrolled, setScrolled] = useState(false); const [isNavOpen, setIsNavOpen] = useState(false); - - // Interactive Simulation state + + // Interactive retrieval sandbox state const [showDemoModal, setShowDemoModal] = useState(false); const [selectedDoc, setSelectedDoc] = useState<'vectorless-whitepaper.pdf' | 'fastify-manual.md' | 'terms-of-service.docx'>('vectorless-whitepaper.pdf'); - const [ingestionStep, setIngestionStep] = useState(0); - const [demoQuery, setDemoQuery] = useState(''); + const [ingestionStep, setIngestionStep] = useState(0); + const [demoQuery, setDemoQuery] = useState(''); const [isRetrieving, setIsRetrieving] = useState(false); const [retrievedResult, setRetrievedResult] = useState(null); const [highlightedSection, setHighlightedSection] = useState(null); - // Monitor scroll for glass navbar effect useEffect(() => { const handleScroll = () => setScrolled(window.scrollY > 24); window.addEventListener('scroll', handleScroll, { passive: true }); return () => window.removeEventListener('scroll', handleScroll); }, []); - // Ingestion simulation steps + // Ingestion simulation useEffect(() => { if (showDemoModal) { const t1 = setTimeout(() => setIngestionStep(1), 700); const t2 = setTimeout(() => setIngestionStep(2), 1400); const t3 = setTimeout(() => setIngestionStep(3), 2100); - - return () => { - clearTimeout(t1); - clearTimeout(t2); - clearTimeout(t3); - }; + return () => { clearTimeout(t1); clearTimeout(t2); clearTimeout(t3); }; } }, [showDemoModal, selectedDoc]); - const openSandbox = () => { + const openSandbox = useCallback(() => { setIngestionStep(0); setRetrievedResult(null); setHighlightedSection(null); setShowDemoModal(true); - }; + }, []); - const selectDoc = (docId: typeof selectedDoc) => { + const selectDoc = useCallback((docId: typeof selectedDoc) => { setIngestionStep(0); setRetrievedResult(null); setHighlightedSection(null); setSelectedDoc(docId); - }; + }, []); - // Handle mock retrieval - const handleRetrieve = (e: React.FormEvent) => { + const handleRetrieve = useCallback((e: React.FormEvent) => { e.preventDefault(); if (!demoQuery.trim()) return; - setIsRetrieving(true); setRetrievedResult(null); setHighlightedSection(null); @@ -321,238 +399,337 @@ export default function BlogPage() { if (demoQuery.toLowerCase().includes('performance') || demoQuery.toLowerCase().includes('benchmark')) { setHighlightedSection(3); setRetrievedResult( - "Section 3: Performance & Benchmarks\n\nVectorless outperformed traditional chunking systems on quarterly reports, achieving 94.2% accuracy. Because it does not split financial tabular nodes, it avoids destroying structural context." + 'Section 3: Performance & Benchmarks\n\nVectorless outperformed traditional chunking systems on quarterly reports, achieving 94.2% accuracy. Because it does not split financial tabular nodes, it avoids destroying structural context.' ); } else { setHighlightedSection(1); setRetrievedResult( - "Section 1: Introduction to Reasoned Retrieval\n\nInstead of chunking documents into arbitrary sizes and calculating embeddings, Vectorless builds a hierarchical structure tree which is summarized section-by-section." + 'Section 1: Introduction to Reasoned Retrieval\n\nInstead of chunking documents into arbitrary sizes and calculating embeddings, Vectorless builds a hierarchical structure tree which is summarized section-by-section.' ); } } else if (selectedDoc === 'fastify-manual.md') { if (demoQuery.toLowerCase().includes('route') || demoQuery.toLowerCase().includes('matching')) { setHighlightedSection(2); setRetrievedResult( - "Section 2: Routing Primitives\n\nFastify uses a radix tree router internally for extremely fast route resolution. It parses registered routes into prefix trees for O(L) matching speed." + 'Section 2: Routing Primitives\n\nFastify uses a radix tree router internally for extremely fast route resolution. It parses registered routes into prefix trees for O(L) matching speed.' ); } else { setHighlightedSection(1); setRetrievedResult( - "Section 1: Getting Started\n\nInstall fastify using npm. Boot the server and register core plugins to set up dynamic request and response validation pipelines." + 'Section 1: Getting Started\n\nInstall fastify using npm. Boot the server and register core plugins to set up dynamic request and response validation pipelines.' ); } } else { setHighlightedSection(1); setRetrievedResult( - "Section 1: Definitions & Scope\n\nThis document governs the terms of service for the Vectorless API. Under self-hosted instances, your organization retains complete data ownership." + 'Section 1: Definitions & Scope\n\nThis document governs the terms of service for the Vectorless API. Under self-hosted instances, your organization retains complete data ownership.' ); } }, 1200); - }; + }, [demoQuery, selectedDoc]); const categories: Category[] = ['All', 'Product Updates', 'Engineering', 'Guides', 'Features']; - const filteredPosts = BLOG_POSTS.filter(post => { + const filteredPosts = BLOG_POSTS.filter((post) => { if (selectedCategory === 'All') return true; return post.category === selectedCategory; }); - const featuredPost = BLOG_POSTS.find(p => p.id === 'retrieval-reasoning-era'); - - const displayPosts = selectedCategory === 'All' - ? BLOG_POSTS.filter(p => p.id !== 'retrieval-reasoning-era') - : filteredPosts; + const featuredPost = BLOG_POSTS[0]; // First post is the featured one + const displayPosts = selectedCategory === 'All' ? BLOG_POSTS.slice(1) : filteredPosts; return ( -
- - {/* Decorative gradient overlay matching landing page */} -
- - {/* Grid Backdrop */} - {!activeArticle && ( -
- )} - - {/* FLOATING GLASS PILL NAVBAR */} - -

- {activeArticle.title} -

+ {/* ═══ MAIN CONTENT ═══ */} + + {activeArticle ? ( + /* ━━━ ARTICLE READER VIEW ━━━ */ + + {/* Reader header band */} +
+
+
+ + +
+ {activeArticle.category} + + {activeArticle.date} + + {activeArticle.readTime} +
- {/* Author & Info bar */} -
-
-
- + {activeArticle.title} + + +
+
+ {activeArticle.author.name}
- {activeArticle.author.name} - {activeArticle.author.role} + {activeArticle.author.name} + + {activeArticle.author.role} +
- - - Log // {activeArticle.id}.txt -
+
- {/* Editorial Content Layout */} -
+ {/* Reader body */} +
+
{activeArticle.content.map((paragraph, pIdx) => { if (/^\d+\.\s/.test(paragraph)) { const parts = paragraph.split(/^\d+\.\s/); const titleAndText = parts[1].split(/:\s/); return ( -
+
{titleAndText.length > 1 ? ( <> -

{titleAndText[0]}

-

{titleAndText[1]}

+

{titleAndText[0]}

+

{titleAndText[1]}

) : ( -

{parts[1]}

+

{parts[1]}

)}
); } + if (paragraph.startsWith('- ')) { + return ( +
+

{paragraph.slice(2)}

+
+ ); + } return ( -

+

{paragraph}

); })}
- {/* Back to Index Navigation */} + {/* Bottom navigation */}
- - ) : ( - /* PREMIUM EDITORIAL INDEX LAYOUT */ - - {/* Massive Newspaper Editorial Header */} -
-
-
+
+ + ) : ( + /* ━━━ MAGAZINE INDEX VIEW ━━━ */ + + {/* ─── HERO SECTION ─── */} +
+ {/* Gradient backdrop */} +
+ {/* Grid paper */} +
+ +
+
+ {/* Chip */} + - - + + - Vectorless Intelligence Log + Vectorless Engineering Journal -
+ -

- Document retrieval for the reasoning era. -

+ {/* Headline */} + + Retrieval,{' '} + + rethought. + + -

- A technical journal examining the design of structure-preserving retrieval architectures, no-chunking models, and deterministic RAG systems. -

+ {/* Subtitle */} + + A technical journal on the design of structure-preserving retrieval architectures, no-chunking + models, and deterministic RAG systems for AI agents. + +
+ + {/* Decorative bottom border with date */} +
+
+ Vol. 01 — {new Date().getFullYear()} +
+
+ {BLOG_POSTS.length} Articles Published + + Updated Weekly +
-
+
+
- {/* Categories Navigation Bar - Sticky pill outline style */} -
+ {/* ─── CATEGORIES + SANDBOX BAR ─── */} +
+
{categories.map((cat) => { const isActive = selectedCategory === cat; @@ -561,9 +738,9 @@ export default function BlogPage() { key={cat} onClick={() => setSelectedCategory(cat)} className={`px-4 py-1.5 rounded-full text-xs font-data uppercase tracking-wider transition-all duration-200 cursor-pointer ${ - isActive - ? 'bg-[#0A0A0A] text-white font-semibold shadow-xs' - : 'text-text-muted hover:text-[#0A0A0A] hover:bg-black/5' + isActive + ? 'bg-[#0A0A0A] text-white font-semibold shadow-sm' + : 'text-text-muted hover:text-[#0A0A0A] hover:bg-black/[0.04]' }`} > {cat} @@ -571,187 +748,291 @@ export default function BlogPage() { ); })}
- - -
- - {/* Featured Headline Section (Split Grid Layout) */} - - {selectedCategory === 'All' && featuredPost && ( - +
+ + {/* ─── FEATURED ARTICLE (FULL WIDTH) ─── */} + + {selectedCategory === 'All' && featuredPost && ( + +
setActiveArticle(featuredPost)} - className="py-16 border-b border-border-gray cursor-pointer group/hero" + className="group max-w-[1200px] mx-auto px-6 md:px-12 lg:px-16 py-16 md:py-20 cursor-pointer" > -
-
+
+
-
+
{featuredPost.category} - + {featuredPost.date} - + {featuredPost.readTime}
-

+

{featuredPost.title}

-

+

{featuredPost.snippet}

-
- Analyze Article - +
+
+
+ {featuredPost.author.name} +
+
+ {featuredPost.author.name} + + {featuredPost.author.role} + +
+
+ +
+ Read article + +
-
- +
+
- - )} - - - {/* Grid-based Newspaper List View (Thin border divisions, no card shadows) */} -
-
- - {displayPosts.map((post, idx) => ( - setActiveArticle(post)} - className="flex flex-col justify-between cursor-pointer group/card h-full p-8 border-r border-b border-border-gray hover:bg-[#FAF8F5]/30 transition-colors duration-300" - > -
-
- {/* Eyebrow / meta info */} -
- {post.category} - {post.date} -
+
+ + )} + - {/* Headline */} -

- {post.title} -

+ {/* ─── ARTICLE GRID ─── */} +
+ {selectedCategory === 'All' && ( +
+

+ Latest Articles +

+
+
+ )} - {/* Short Intro */} -

- {post.snippet} -

-
+
+ + {displayPosts.map((post, idx) => ( + setActiveArticle(post)} + className="group flex flex-col cursor-pointer bg-white hover:bg-[#FAFBFF] transition-colors duration-300" + > +
+ {/* Meta */} +
+ {post.category} + {post.date} +
- {/* Render fine blueprint drawing card */} -
- -
+ {/* Headline */} +

+ {post.title} +

+ + {/* Snippet */} +

+ {post.snippet} +

+ + {/* Blueprint */} +
+ +
- {/* Author line */} -
-
- +
+
+ {post.author.name}
- {post.author.name} - {post.author.role} + {post.author.name} + + {post.readTime} +
+ +
- - ))} - +
+ + ))} + +
+ + {/* Empty State */} + {displayPosts.length === 0 && ( +
+ + No matching articles found +
+ )} +
- {/* Empty State */} - {displayPosts.length === 0 && ( -
- No matching logs found -
- )} -
- {/* Newspaper Footer */} -
-
setActiveArticle(null)}> +

+ No spam. Unsubscribe anytime. +

+
+
+ + + {/* ─── FOOTER ─── */} +
+
+
{ + setActiveArticle(null); + window.scrollTo({ top: 0, behavior: 'smooth' }); + }} + > - Vectorless + Vectorless
-

+ +

© {new Date().getFullYear()} Vectorless. All rights reserved.

-
- Privacy - / - Terms -
-
- - )} - -
+ +
+ + + )} + - {/* INTERACTIVE RETRIEVAL SANDBOX */} + {/* ═══ INTERACTIVE RETRIEVAL SANDBOX MODAL ═══ */} {showDemoModal && (
- setShowDemoModal(false)} - className="absolute inset-0 bg-[#0A0A0A]/40 backdrop-blur-xs" + className="absolute inset-0 bg-[#0A0A0A]/50 backdrop-blur-sm" /> - - {/* Left Panel: Control Deck */} -
+ {/* Left Panel: Controls */} +
-
- Step-by-step API - 🟢 Active Server +
+ + Interactive API + + + + Live +
-

- Retrieval Interface -

-

- Choose a document, trigger structural ingestion, and execute reasoning queries locally. +

Retrieval Sandbox

+

+ Select a document, watch structural ingestion, then run reasoning queries to see how Vectorless + navigates document maps.

@@ -759,23 +1040,28 @@ export default function BlogPage() {

{[ - { id: 'vectorless-whitepaper.pdf', size: '2.4 MB', type: 'PDF' }, - { id: 'fastify-manual.md', size: '480 KB', type: 'Markdown' }, - { id: 'terms-of-service.docx', size: '1.1 MB', type: 'Word Doc' } + { id: 'vectorless-whitepaper.pdf' as const, size: '2.4 MB', type: 'PDF' }, + { id: 'fastify-manual.md' as const, size: '480 KB', type: 'Markdown' }, + { id: 'terms-of-service.docx' as const, size: '1.1 MB', type: 'Word Doc' }, ].map((doc) => { const isSel = selectedDoc === doc.id; return ( ); })} @@ -788,19 +1074,19 @@ export default function BlogPage() { Execute Query
- setDemoQuery(e.target.value)} placeholder="e.g., How does performance compare?" - className="w-full text-xs border border-[#E5E7EB] rounded-lg pl-3 pr-8 py-2.5 bg-[#FCFCFD] focus:outline-none focus:border-brand-blue" + className="w-full text-xs border border-border-gray rounded-xl pl-4 pr-9 py-3 bg-[#FCFCFD] focus:outline-none focus:border-brand-blue focus:ring-1 focus:ring-brand-blue/20 transition-all" /> - +
- @@ -808,54 +1094,49 @@ export default function BlogPage() { )}
- {/* Right Panel: Terminal Output */} -
+ {/* Right Panel: Terminal */} +
-
- +
+ vectorless_core_stdout -
-
$ ./vectorless ingest {selectedDoc}
+
$ ./vectorless ingest {selectedDoc}
- - [1/3] File parsed: created node tree + + [1/3] File parsed: created node tree
- + {ingestionStep >= 1 && (
- - [2/3] Structural outline mapped (ToC) + + [2/3] Structural outline mapped (ToC)
)} {ingestionStep >= 2 && (
- - [3/3] Gemini-1.5 summary manifests generated + + [3/3] Gemini-1.5 summary manifests generated
)} {isRetrieving && ( -
- $ querying LLM agent reasoning engine... -
+
$ querying LLM agent reasoning engine...
)} {retrievedResult && ( -
-
REASONING OUTLINE SELECTION:
-

+

+
REASONING OUTLINE SELECTION:
+

{retrievedResult}

@@ -864,18 +1145,16 @@ export default function BlogPage() {
{ingestionStep >= 2 && ( -
+
* Structural citations are generated dynamically matching header paths.
)}
-
)} -
); } From 274f2b286d1cf995b1928a4931d843a8be462a94 Mon Sep 17 00:00:00 2001 From: hallelx2 Date: Sun, 21 Jun 2026 02:01:11 +0100 Subject: [PATCH 2/2] chore(deploy): Vercel config for 3-app monorepo (HAL-333) Each app deploys as its own Vercel project off this repo, scoped by Root Directory: vercel.json pins buildCommand (turbo run build --filter) + ignoreCommand (turbo-ignore) so projects only rebuild on relevant changes. DEPLOY.md documents the per-project root dirs, env, domains, and remote cache. turbo build verified green across web/blog/docs. --- DEPLOY.md | 34 ++++++++++++++++++++++++++++++++++ apps/blogs/vercel.json | 6 ++++++ apps/docs/vercel.json | 6 ++++++ apps/web/vercel.json | 6 ++++++ 4 files changed, 52 insertions(+) create mode 100644 apps/blogs/vercel.json create mode 100644 apps/docs/vercel.json create mode 100644 apps/web/vercel.json diff --git a/DEPLOY.md b/DEPLOY.md index d5d9d41..5e722cb 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -151,3 +151,37 @@ and need control plane endpoints + adapter rewrites: Once those are done, the dashboard's `apps/web/lib/db/` and `drizzle.config.ts` can be deleted entirely and `drizzle-orm` / `@neondatabase/serverless` removed from dependencies. + +--- + +## Monorepo → Vercel: three projects, one repo (HAL-333) + +This repo is a pnpm + turbo monorepo. Each app deploys as its **own Vercel project**, all pointed at this same Git repo, differentiated by **Root Directory**. `turbo build` is green across all apps. + +| App | Package | Vercel Root Directory | Suggested domain | +| --- | --- | --- | --- | +| Landing + dashboard | `@vectorless/web` | `apps/web` | `vectorless.store` (+ `app.`) | +| Blog | `@vectorless/blog` | `apps/blogs` | `blog.vectorless.store` | +| Docs | `@vectorless/docs` | `apps/docs` | `docs.vectorless.store` | + +### Per-project settings (Vercel dashboard → New Project → import this repo) +1. **Root Directory** = the app path above. Enable **"Include source files outside of the Root Directory"** (needed for workspace packages like `@vectorless/shared`, `@vectorless/control-plane`). +2. Framework preset: **Next.js** (auto). Package manager: **pnpm** (auto from `pnpm-lock.yaml`). +3. Build / install / ignore are pinned by each app's `vercel.json`: + - `buildCommand`: `turbo run build --filter=@vectorless/` (builds the app + its workspace deps, uses remote cache) + - `ignoreCommand`: `npx turbo-ignore @vectorless/` → the project only redeploys when that app or a dependency actually changed (no cross-app rebuilds) +4. **Turbo Remote Cache**: link the repo to Vercel Remote Cache (`npx turbo login && npx turbo link`) so all three projects share build cache. +5. **Env vars** (Project → Settings → Environment Variables): + - `web`: database URL, control-plane/engine base URL, auth secrets (see `apps/web/.env.example`) + - `blog`, `docs`: minimal (site URL for OG/RSS canonical) +6. **Domains**: add the subdomain per project; point DNS (Spaceship) CNAME → Vercel. + +### One-time CLI alternative +```bash +# from repo root, per app: +vercel login # run via `! vercel login` (interactive browser) +cd apps/blogs && vercel link && vercel --prod # repeat for web, docs +``` +Root Directory is still set in the dashboard or via `vercel.json` `rootDirectory` once linked. + +> Verified locally 2026-06-21: `turbo run build --filter=@vectorless/{web,blog,docs}` all succeed. diff --git a/apps/blogs/vercel.json b/apps/blogs/vercel.json new file mode 100644 index 0000000..b1dce9d --- /dev/null +++ b/apps/blogs/vercel.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "framework": "nextjs", + "buildCommand": "turbo run build --filter=@vectorless/blog", + "ignoreCommand": "npx turbo-ignore @vectorless/blog" +} diff --git a/apps/docs/vercel.json b/apps/docs/vercel.json new file mode 100644 index 0000000..1be8ed5 --- /dev/null +++ b/apps/docs/vercel.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "framework": "nextjs", + "buildCommand": "turbo run build --filter=@vectorless/docs", + "ignoreCommand": "npx turbo-ignore @vectorless/docs" +} diff --git a/apps/web/vercel.json b/apps/web/vercel.json new file mode 100644 index 0000000..4551f48 --- /dev/null +++ b/apps/web/vercel.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "framework": "nextjs", + "buildCommand": "turbo run build --filter=@vectorless/web", + "ignoreCommand": "npx turbo-ignore @vectorless/web" +}