Help build the community
Everything you need to add a lesson, translate content, share a resource or project, or improve the code.
New here? You're exactly who this is for.
You don't need to be a CRM Analytics expert or a developer to help. Pick a tiny first step below — most take a few minutes and need zero code. We review everything and are happy to guide you.
Step 01
Start hereWays to contribute
There are five main ways to help — pick whatever fits your time and skills:
- Write or fix a lesson — improve wording, fix errors, or add a whole new lesson (Markdown, no coding needed).
- Translate — bring a lesson or the UI into one of the site's languages.
- Submit a resource — share a great docs page, course, tool, or community. Submit here (an admin reviews it).
- Improve the code — fix a bug, refine the UI, or add a feature via a pull request.
Resources and projects can be submitted right on the site once you sign in — no GitHub needed. The rest go through GitHub.
Step 02
BeginnerLocal setup
You'll need Node.js 20+ and pnpm. Then:
# 1. Fork the repo on GitHub, then clone your fork
git clone https://github.com/<you>/CRM-Analytics-Academy.git
cd CRM-Analytics-Academy
# 2. Install dependencies
pnpm install
# 3. Start the dev server → http://localhost:3000
pnpm devBefore committing, always run the two checks (there's no test runner):
pnpm lint # eslint
pnpm typecheck # vue-tscTip: if the docs sidebar ever looks empty in dev, the local content database went stale. Fix it with
rm -rf .data && pnpm dev.
Step 03
No codeWriting a lesson
Lessons are plain Markdown under content/<locale>/<module>/<lesson>.md. English lives in content/en/. The number prefixes set the order:
content/en/
1.foundations/
1.index.md
2.data-and-datasets.md
5.saql/
1.index.md
2.filter-and-group.mdTo add a lesson, create a new file with the next number in a module (e.g. content/en/5.saql/5.window-functions.md), start with a top-level heading, and write in Markdown. Use ## for sections — they become the table of contents. Keep it practical and example-led.
To fix a small typo, just use the “Edit this page” link at the bottom of any lesson — it opens a GitHub edit form.
Step 04
No codeLesson frontmatter
Each lesson starts with a YAML frontmatter block:
---
title: SAQL Basics
description: A one-line summary used for SEO, the OG image, and AI search.
# Optional — members-only lesson (logged-out users see a teaser):
access: members
# Optional — an end-of-lesson quiz (answer is the 0-based option index):
quiz:
- q: "What does the load statement do in SAQL?"
options: ["Filters rows", "Loads a dataset", "Groups data"]
answer: 1
---
# SAQL Basics
Your content here…title and description are required; access and quiz are optional. A new top-level module also needs a .navigation.yml (with title and an icon) and a new section in the llms config in nuxt.config.ts.
Step 05
No codeTranslations
The site ships in 8 languages: English (default), Spanish, French, German, Portuguese, Japanese, Chinese, and Hindi. To translate a lesson, copy it to the same path under the target locale and translate the text — keep code blocks, headings, and frontmatter keys unchanged:
content/en/5.saql/1.index.md → content/es/5.saql/1.index.mdUI strings live in i18n/locales/<lang>.json. If you add a new UI string, add it to all language files (there's no automatic fallback).
Step 06
No codeSubmitting resources
This doesn't need GitHub — just sign in and share a helpful link (docs, course, tool, community). Go to Submit a resource, fill in the title, URL, and category. An admin reviews it, and once approved it appears on the Resources page. Track the status (pending / approved) on your dashboard.
Step 07
IntermediateCode contributions
The stack is Nuxt 4 · Nuxt Content · Nuxt UI v4 · Tailwind CSS 4 · Supabase. Key folders:
content/— the lessons (Markdown).app/pages/,app/components/,app/composables/— the app UI.server/— API routes (moderation) and the raw-markdown surface.supabase/migrations/— the database schema.
Style rules are enforced by ESLint: no trailing commas, 1TBS braces, 2-space indent, and one interface member per line. Run pnpm lint --fix to auto-format. Match the surrounding code's conventions.
Step 08
ReferenceTech stack
The whole site is open source — here's what powers it:
- Nuxt 4 (Vue 3 + Nitro) — the framework, SSR + prerendering
- Nuxt Content 3 — lessons authored in Markdown, served from SQLite
- Nuxt UI v4 + Tailwind CSS 4 — components and styling
- Supabase (Postgres + Row-Level Security) — Google auth, profiles, progress, quizzes, comments, and resource submissions
- @nuxtjs/i18n — 8 languages
- Vercel — hosting and CI (auto-deploy on push to
main)
Also in the box: nuxt-og-image (social cards), nuxt-llms (machine-readable docs), and structured data for SEO.
Step 09
AdvancedDatabase & migrations
Schema changes go in supabase/migrations/ as timestamped SQL files and are applied with the Supabase CLI:
supabase db pushKeep types/database.types.ts in sync so the typed client (useDb()) stays accurate. Every table uses Row-Level Security — new tables should ship with policies. If a SQL function forward-references a table created later in the file, add set check_function_bodies = off; at the top.
Step 10
BeginnerOpening a pull request
- Branch off
main:git checkout -b fix/typo-in-saql - Make your change and preview it with
pnpm dev. - Verify:
pnpm lintandpnpm typecheckboth pass. - Commit with a clear message and push to your fork.
- Open a PR against
main, describing what changed and why.
A maintainer will review, suggest tweaks if needed, and merge. Once merged, Vercel deploys it automatically.
Step 11
AnytimeGetting help
Stuck or have an idea? Open an issue or a discussion on GitHub. First-time contributors are very welcome — no contribution is too small.