Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions DEPLOY.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/<app>` (builds the app + its workspace deps, uses remote cache)
- `ignoreCommand`: `npx turbo-ignore @vectorless/<app>` → 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.
1,167 changes: 723 additions & 444 deletions apps/blogs/app/page.tsx

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions apps/blogs/vercel.json
Original file line number Diff line number Diff line change
@@ -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"
}
6 changes: 6 additions & 0 deletions apps/docs/vercel.json
Original file line number Diff line number Diff line change
@@ -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"
}
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ export default function DocumentDetailPage({
<Link
key={section.section_id}
href={`/dashboard/documents/${docId}/sections/${section.section_id}`}
className="block rounded-lg border p-4 transition-colors hover:border-primary/30 hover:bg-muted/50"
className="block rounded-2xl border border-border-light bg-white p-4 transition-all hover:border-primary/30 hover:shadow-[rgba(0,0,0,0.06)_0px_2px_10px]"
>
<div className="flex items-start justify-between gap-4">
<div className="flex-1 space-y-1">
Expand Down
2 changes: 1 addition & 1 deletion apps/web/app/(dashboard)/dashboard/playground/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ function SectionCard({ section }: { section: SelectedSection }) {
const [expanded, setExpanded] = useState(false);

return (
<div className="rounded-lg border transition-colors hover:border-primary/30">
<div className="rounded-2xl border border-border-light bg-white transition-all hover:border-primary/30 hover:shadow-[rgba(0,0,0,0.06)_0px_2px_10px]">
<button
type="button"
onClick={() => setExpanded(!expanded)}
Expand Down
17 changes: 10 additions & 7 deletions apps/web/components/ui/button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,28 @@ import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "@/lib/utils"

const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
// Landing-matched: pill shape (rounded-full), Geist medium.
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-full text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
{
variants: {
variant: {
default:
"bg-primary text-primary-foreground shadow hover:bg-primary/90",
// The landing's hero CTA: a near-black pill.
dark: "bg-bg-dark text-white shadow hover:bg-black",
destructive:
"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
outline:
"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
"border border-border-gray bg-background hover:bg-black/[0.03]",
secondary:
"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost: "hover:bg-black/5",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-9 px-4 py-2",
sm: "h-8 rounded-md px-3 text-xs",
lg: "h-10 rounded-md px-8",
default: "h-9 px-5 py-2",
sm: "h-8 px-4 text-xs",
lg: "h-11 px-7 text-[15px]",
icon: "h-9 w-9",
},
},
Expand Down
3 changes: 2 additions & 1 deletion apps/web/components/ui/card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ const Card = React.forwardRef<
<div
ref={ref}
className={cn(
"rounded-xl border bg-card text-card-foreground shadow",
// Landing-matched: 20px radius, hairline border, soft ambient shadow.
"rounded-[20px] border border-border-light bg-card text-card-foreground shadow-[rgba(0,0,0,0.08)_0px_4px_6px]",
className
)}
{...props}
Expand Down
6 changes: 6 additions & 0 deletions apps/web/vercel.json
Original file line number Diff line number Diff line change
@@ -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"
}
Loading