Skip to main content

What a Generated Site Includes

Every Work you create in Ever Works ends as a deployable website backed by three Git repositories in your own GitHub account or organization. The site is not written from scratch on each run: the platform clones one of the published website templates, pushes it into a repository you own, points it at the Work's data repository, deploys it, and then keeps the template layer up to date for you.

This page lists what you actually get — repository by repository, and feature by feature — so you know what is there before you open the site for the first time, and where it is safe to make your own changes.

Three repositories per Work

For a Work with slug my-work, the generator chain produces three repositories (see Website Generation and the Generator System):

RepositoryStage that writes itWhat it holds
my-work-dataData generatorThe content source of truth: one folder per item under data/ (item metadata plus a Markdown body), categories, tags, collections and references, item-vs-item comparisons/, static pages/, header/footer markdown/ blocks, reusable page blocks/, and the Work configuration in .works/works.yml. The Knowledge Base folder kb/ also lives here — one folder per class, never rendered publicly — and uploaded originals land beside it in kb-originals/ when the Work's storage plugin is github-storage.
my-workMarkdown generatorThe human-readable "awesome list": a curated README.md with a table of contents and items grouped by category, plus per-item detail pages.
my-work-websiteWebsite generatorThe deployable site, cloned from the chosen template with main, stage and develop branches kept in sync with upstream.

The website repository never contains your content. At start-up the deployed site clones the data repository into its .content folder (the DATA_REPOSITORY and GH_TOKEN values are minted by the platform at deploy time) and re-syncs it periodically or on demand. That separation is what lets the platform replace the website code on every template update without touching a single item you generated or wrote.

Which template your site is built from

Template idStackKind of siteDefault for Work kinds
classicNext.js 16 (App Router), full-featuredDirectory site — the feature set described on this pagedirectory, awesome-repo, and any other kind
minimalAstro 6, static, plugin-drivenDirectory site with minimum JavaScriptOpt-in per Work
webNext.js, general-purposeMarketing site, landing page, content site with a Markdown blogwebsite, landing-page, blog
web-minimalAstro 6, static, general-purposeSame marketing sections as web, built statically with zero JS by defaultOpt-in per Work

The template is resolved in this order: the template pinned on the Work → your saved default template (Templates page → Website tab → ⋮ menu → Make default) → the kind default above → the system default classic. The Website Templates page covers the catalogue, forking and bring-your-own-repo templates.

The classic directory site (Next.js)

The classic template (ever-works/directory-web-template) is a complete directory product, not a scaffold. It runs as a Turborepo monorepo (apps/web is the site, apps/web-e2e its Playwright suite, apps/docs its own documentation), on Next.js 16, Tailwind CSS, HeroUI, Drizzle ORM (PostgreSQL, MySQL or SQLite) and next-intl. Everything below ships in the repository the platform pushes for you.

Accounts and access

FeatureWhat you get
Sign-inAuth.js (NextAuth v5) with email/password credentials, or Supabase Auth with magic links — both can run side by side.
OAuth providersGoogle, GitHub, Microsoft, Facebook and X, toggled per provider in works.yml (auth: block); the site falls back to credentials-only if OAuth keys are missing.
PasskeysWebAuthn / passkey schema (authenticators table) following the Auth.js contract.
SessionsJWT sessions (30-day max age) with an in-memory cache layer and automatic member-profile provisioning.
Roles and permissionsRole-based access control with resource:action permissions, an admin flag and role management screens under /admin/roles.
Bot protectionGoogle reCAPTCHA v2 on login, registration and contact forms, verified server-side.

Monetization

FeatureWhat you get
Pricing page/pricing with Free / Standard / Premium plans, a monthly-yearly toggle with computed savings, multi-currency formatting, trust indicators and a "popular" plan highlight.
CheckoutStripe, Lemon Squeezy, Polar and Solidgate behind one provider abstraction; embedded payment modal or redirect checkout; webhooks update subscription status; customer portal for self-service billing; optional live pricing pulled from Stripe products.
Plan limitsSubmission counts, image counts, description length, video upload, verified badge, priority and instant review are gated per plan (lib/guards/plan-features.guard.ts).
Sponsor adsPaid sponsored placements: a member submits an ad at /sponsor, pays, an admin approves or rejects it under /admin/sponsorships, and the ad runs until it expires, is renewed or cancelled.
Promo codesPercentage, fixed-amount and free-shipping codes shown on item pages with copy-to-clipboard, expiry tracking and click/copy analytics.
Payment keysThe platform delivers your payment configuration (NEXT_PUBLIC_PAYMENT_PROVIDER, Stripe keys, price ids) to the deployed site as AES-256-GCM-encrypted per-Work runtime environment variables on every deploy — they are never stored in the website repository.

Submissions, URL extraction, moderation and admin

FeatureWhat you get
Submit flowA multi-step submission form at /submit with step indicator, validation and a rich-text (TipTap) editor with image upload.
URL extractionPaste a URL and the form auto-fills name, description, category, tags, brand and images via /api/extract; when the site is connected to the Ever Works Platform API (PLATFORM_API_URL + PLATFORM_API_SECRET_TOKEN) extraction uses the platform's AI extractors.
Member dashboardSigned-in members see their submissions with status tabs (All / Approved / Pending / Rejected), search, stats cards, inline edit, detail view, delete with confirmation and a trash with restore.
Review queueSubmissions enter a pending queue; an admin approves or rejects with notes, and the rejection reason is shown to the submitter.
Reports and moderationVisitors can report items and comments; admins act on reports under /admin/reports.
Audit trailEvery item creation, update, status change, review, deletion and restoration is logged with who did it and what changed.
Admin dashboard/admin with stats, activity charts, submission status, top items, notifications, data export and dedicated sections for items, categories, tags, collections, companies, featured items, comments, reports, roles, users, clients, sponsorships, surveys and settings.
Bulk import / exportCSV/Excel export and import of items, switched on per Work from the platform (export_enabled, import_enabled, import_max_rows).

Community

FeatureWhat you get
VotesOne up/down vote per member per item with optimistic updates and a sign-in prompt for anonymous visitors.
ReviewsComments with optional 1–5 star ratings that roll up into an aggregate item rating; admins can moderate under /admin/comments.
FavoritesMembers bookmark items and browse them at /favorites.
ProfilesPublic member profiles with avatar, bio, social links, skills and submitted items.
SurveysSite-wide or item-specific surveys created and published from /admin/surveys, answered by signed-in members at /surveys.
NewsletterSubscription forms in the footer, a popup and at sign-up, stored with their source, sent through Resend or Novu, with admin statistics.
NotificationsIn-app notifications plus email notifications for submissions, reports and payment events.
Social sharingShare button, Open Graph images and structured data so shared links render rich previews.
View trackingPrivacy-conscious unique daily views per item that power view counts, trending lists and popularity scores.

Search, filters, taxonomy and maps

FeatureWhat you get
Search and filtersDebounced full-text search (300 ms), category and tag filters, sort by updated, created, name, views or votes, active-filter chips, pagination and URL-synced state so filtered views are shareable.
LayoutsCards, Grid and Masonry views with a sticky filter bar; the default layout and pagination are configurable per Work.
TaxonomyHierarchical categories at /categories, tags at /tags, curated collections at /collections, featured items with ordering and expiry, and company profiles with domain-based deduplication.
ComparisonsItem-vs-item comparison pages at /comparisons, generated by the platform's comparison generator and rendered by the site.
MapsMapbox or Google Maps behind one abstraction; items declare a location: and are geocoded automatically; a /map view pairs markers with a synchronized card sidebar, with clustering, geolocation and a location picker on the submit form.
BreadcrumbsVisible breadcrumbs on every page plus BreadcrumbList JSON-LD.

Languages

The site ships 21 locales with URL-based routing (/fr/..., default en at the root), automatic browser detection, message fallback and a language switcher: en, fr, es, de, zh, ar, he, ru, uk, pt, it, ja, ko, nl, pl, tr, vi, th, hi, id, bg. Arabic and Hebrew render right-to-left. Translation files live in apps/web/messages/*.json.

SEO, feeds and AI discoverability

FeatureWhat you get
Structured dataSchema.org JSON-LD generators for Product, Organization, WebSite, BreadcrumbList, FAQPage and ItemList.
MetadataUnique title/description per page, canonical URLs, hreflang alternates for all locales, Open Graph and Twitter Card tags, and a generated Open Graph image (app/opengraph-image.tsx).
Sitemapapp/sitemap.ts covers static pages, every item, category and collection, in every active locale, with per-type priority and change frequency.
robots.txtapp/robots.ts allows crawlers, points to the sitemap, blocks admin/API routes and emits an explicit per-bot policy for 18 AI crawlers controlled by the AI_CRAWLERS env var (allow by default, disallow, a selective list, or none).
FeedsRSS 2.0 at /rss.xml, Atom 1.0 at /atom.xml and JSON Feed 1.1 at /feed.json, auto-discoverable from every page's <head>.
LLM endpoints/llms.txt (manifest) and /llms-full.txt (the whole directory as one Markdown document), plus a clean .md twin of every public page (/items/<slug>.md, /categories/<id>.md, /pages/<slug>.md, …) advertised with <link rel="alternate" type="text/markdown"> and served noindex so search engines keep indexing the HTML.

Analytics, theming, AI chat, plugins and CRM

FeatureWhat you get
AnalyticsPostHog events and session recording, Sentry error tracking and Vercel Analytics web vitals behind one Analytics singleton; admin analytics with growth and engagement metrics.
ThemingDark/light mode (next-themes) plus switchable color themes (Everworks, Corporate, Material, Funny); the default theme and whether visitors may change it are set per Work.
Feature flagsDatabase-backed features (votes, comments, favorites, …) switch themselves off automatically when DATABASE_URL is not configured, so the site can run in static-content mode.
AI chatA floating assistant for visitors that browses, searches and navigates the directory and, for signed-in members, answers about their own submissions, favorites and profile. Built on the Vercel AI SDK against any OpenAI-compatible endpoint; it activates as soon as AI_CHAT_API_KEY is set and is read-only by design.
Plugin SDK@ever-works/plugin-sdk with defineDirectoryPlugin, typed capabilities, UI slots and a loader/registry, so the site can be extended without forking core files.
CRMTwenty CRM integration that syncs members and companies, configured from /admin/settings or env vars, in platform or direct_crm mode.
Images and uploadsAllow-listed image domains for Next.js image optimization, file upload through the editor and API client.
OpsA Dockerfile, GitHub Actions workflows for CI, CodeQL, dev/stage/prod deploys, Vercel and Kubernetes deploys, Docker image publishing and end-to-end tests; version display and content-sync detection in the footer.

Settings you control from the platform

You do not have to edit the website repository to change how the site behaves. The Website Configuration card on /works/:id/settings (and the Configure Before Deploy dialog on /works/:id/deploy) writes the site's works.yml through PUT /api/works/:id/website-settings:

TabSettings
GeneralSite name and site URL; enable or disable categories, collections, tags, companies, surveys and comparisons; item import/export and the import row cap.
HeaderSubmit button, pricing link, layout selector, language selector, theme toggle; default layout, pagination and theme (light, dark, system).
HomepageHero section, search box, default view and default sort.
FooterNewsletter subscribe form, version badge, theme selector.
MenusUp to ten custom header links and ten footer links (relative paths or http(s) URLs, optional icon and target).

The generated site reads the same file, so a change here is live after the next content sync or deploy.

The minimal directory site (Astro)

The minimal template (ever-works/directory-web-minimal-template) reads the same data repository format (items, categories, tags, collections, comparisons and .works/works.yml) but trades the classic feature surface for a deliberately blank, static canvas:

  • Stack — Astro 6 with static output (optional ISR through @astrojs/vercel), Preact islands only where interactivity is needed, Tailwind CSS and strict TypeScript.
  • Plugin architecture — almost every feature is a plugin you enable: SEO (meta tags, Open Graph, JSON-LD), pagination, client-side category/tag filters, static search (Pagefind), sort, XML sitemap, breadcrumbs, RSS 2.0 + Atom 1.0 feeds, privacy-friendly analytics (Plausible, Umami, Fathom, GA4 or custom) and related items.
  • Headless UI — unstyled Astro and Preact building blocks (25 Astro + 8 Preact components, 22 primitives) that an agent styles into a finished site; five reference samples (basic, jobs, events, real estate, and a 3,200-item Git-backed directory) show the range.
  • Agent-customizable — unlike classic, the platform can apply UI-only customizations to a fork of this template (customizable: true).

What is intentionally not included: authentication and member accounts, a database, payments and billing, traditional SSR, maps and CRM integrations. Each can be added as a plugin when you need it, but if you want submissions, votes, pricing pages or an admin dashboard out of the box, choose classic.

Choosing it: pick Minimal in the template selector when creating the Work, or later from the Automatic Template Updates card on /works/:id/deploy. The template is registered under the id minimal; self-hosted operators can point it at their own fork with WEBSITE_TEMPLATE_MINIMAL_OWNER, WEBSITE_TEMPLATE_MINIMAL_REPO (default directory-web-minimal-template), WEBSITE_TEMPLATE_MINIMAL_BRANCH and WEBSITE_TEMPLATE_MINIMAL_BETA_BRANCH.

The general web and web-minimal templates

For Works that are not directories, the catalogue registers two general-purpose templates. They are built from separate repositories, so this page only states what the template registry and the Website Templates catalogue describe:

TemplateRepositoryWhat it is
webever-works/web-templateNext.js (App Router, React 19, Tailwind CSS v4) marketing/landing/content site: a full landing page (hero, features, how-it-works, testimonials, pricing, FAQ, CTA), About / Pricing / Contact pages and a Markdown blog. All copy lives in apps/web/lib/site.config.ts; agent-customizable through apps/web/src/styles/theme.css.
web-minimalever-works/web-minimal-templateAstro 6 static build of the same marketing section set with zero JavaScript by default, on the same nginx-on-:3000 build contract as the minimal directory template. Copy lives in apps/web/src/config/site.ts; agent-customizable through theme.css.

Both are the default for website, landing-page and blog Works (web by default; web-minimal is opt-in). Neither has item lists, faceted filters or the directory data model.

What the platform generates for these kinds today

The platform's content generators write directory data — items, categories, tags, collections, references and comparisons — into the data repository. They do not yet author blog posts or landing-page copy into site.config.ts / site.ts. For a website, landing-page or blog Work you get the template code, deploys, template updates and the agent workforce; the marketing copy is edited in the repository or delegated to an Agent task.

Keeping the site current

The platform treats the website repository as a managed layer and keeps it aligned with the upstream template:

  1. Hourly checkWebsiteTemplateSchedulerService runs every hour under a distributed lock, for every Work with Update automatically switched on (global kill switch: WEBSITE_TEMPLATE_AUTO_UPDATE_ENABLED, default true).
  2. Compare — it reads the template's latest commit on the tracked branch and compares it with the Work's websiteTemplateLastCommit; nothing happens if they match.
  3. Update — when they differ it re-applies the template: first the duplicate method (clone the template, re-point the remote at your repository, force push — preserves template history), falling back to the template method (clone both, copy files, commit Update website from template (<branch>), force push).
  4. Branch syncmain, stage and develop are each cloned from the template and pushed to your repository; every push is verified by reading the remote ref back, and a branch that cannot be verified is reported as an error rather than a success.
  5. RecordwebsiteTemplateLastUpdatedAt, websiteTemplateLastCheckedAt and websiteTemplateLastError are stored on the Work and shown on the Deploy tab as Last updated, Last checked and Last error.

Beta channel. Switch on Use beta version of template and the template's beta branch (stage by default, WEBSITE_TEMPLATE_BETA_BRANCH) is mapped onto your repository's main, so you receive template changes before they are promoted to stable.

Branches. main is the production branch of every template; stage and develop exist so you can preview upcoming template changes with your own content.

How to manage template updates

  1. Open the Work and go to Deploy (/works/:id/deploy). Scroll to the Automatic Template Updates card.
  2. Work template shows the current template and whether it is inherited from your default or pinned to this Work. Pick another template and click Apply template to Work repository to switch; confirm Switch template in the dialog (the website repository is reset from the new template).
  3. Toggle Update automatically to enrol the Work in the hourly check, and Use beta version of template to follow the beta branch. Both toggles write through to the Git provider connected under Settings → Git Providers (GitHub); with none connected the switch reverts itself and reports Git provider connection required, so connect it first.
  4. To pull the latest template right now, use the Update Work Repository card and click Update Repository.

From the API (JWT or API key), the same operations are:

MethodEndpointPurpose
GET/api/works/website-templatesList the templates available to you.
PATCH/api/works/:idSet websiteTemplateAutoUpdate and websiteTemplateUseBeta.
POST/api/works/:id/switch-website-templateBody { "websiteTemplateId": "minimal" }; returns switchMode (saved_for_initialization, repository_reset, repository_recreated or no_change).
POST/api/works/:id/update-websiteApply the latest template now; returns method_used (duplicate or create-using-template).
curl -X POST http://localhost:3100/api/works/<work-id>/update-website \
-H "Authorization: Bearer <token>"

Ownership: it is your repository

All three repositories are created in your GitHub account or organization and are yours to clone, fork, transfer or delete — nothing about a Work lives only inside Ever Works. Two rules keep that ownership safe:

The website repository is force-pushed. Every template update and branch sync force-pushes main, stage and develop of <slug>-website from the template. The dashboard says it plainly when you switch templates: any custom code in that repository will be lost. Treat those three branches as managed output.

Make your changes where the platform will not overwrite them:

You want to change…Do it here
Items, categories, tags, collections, comparisonsThe Work's items and generator screens (/works/:id/items, /works/:id/generator), the in-app chat, or pull requests against <slug>-data — the platform only rewrites the files it owns.
Static pages, header/footer Markdown, page blockspages/, markdown/ and blocks/ in <slug>-data; the site clones them at start-up and reads pages straight out of .content/pages/.
Blog posts on a web WorkThe Markdown blog that ships inside the web template itself (see Website Templates) — the data repository has no posts/ folder and the platform does not author posts for you. Because the website repository is force-pushed on every template update, keep posts on a fork of the template (see The website code itself below) or with Update automatically switched off.
Site name, enabled features, header/homepage/footer, menusWebsite Configuration on /works/:id/settings, which writes .works/works.yml (see .works/works.yml).
Payment keys and other runtime secretsThe Work's runtime environment settings; values are encrypted and delivered on every deploy, never committed.
The website code itselfFork the template into your own catalogue entry (TemplatesFork, or a custom repository URL — see Work Templates), point the Work at it, and keep your changes on that fork so template updates flow from a repository you control. Or switch Update automatically off and work on a branch of your own.
Domain and hostingCustom Domains, the Vercel and Kubernetes deploy plugins, or the managed ever-works subdomain — see Kubernetes Deployment.

Tests and types: what ships and what is generated

The templates arrive with their own type-checked TypeScript and their own test suites — the classic template carries a Playwright end-to-end suite in apps/web-e2e and CI/CodeQL workflows; the minimal template ships 1,122 unit tests, 48 component tests and 367 end-to-end tests. Those suites are part of the code the platform clones into your repository.

The runtime does not generate tests for each Work. What is generated per Work is the content (data repository), the README (markdown repository) and the configuration the site reads; code changes made by Agents go through the platform's quality gates and pull requests rather than through per-Work test generation.

How to run the generated site locally

  1. Clone the website repository the platform created for you and install dependencies:

    git clone https://github.com/<your-org>/<slug>-website
    cd <slug>-website
    pnpm install
  2. Copy the environment template and point it at your data repository:

    cp apps/web/.env.example apps/web/.env.local

    Set DATA_REPOSITORY to https://github.com/<your-org>/<slug>-data, a GH_TOKEN that can read it, and COOKIE_SECRET / AUTH_SECRET (openssl rand -base64 32). DATABASE_URL is optional — without it the site runs in static-content mode with database features switched off.

  3. Start the site:

    pnpm run dev:web

    The directory is served at http://localhost:3000; .content/ is cloned from your data repository on first start.