Contributor guide

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 here

Ways 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

Beginner

Local 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 dev

Before committing, always run the two checks (there's no test runner):

pnpm lint       # eslint
pnpm typecheck  # vue-tsc

Tip: 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 code

Writing 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.md

To 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 code

Lesson 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 code

Translations

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.md

UI 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 code

Submitting 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

Intermediate

Code 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

Reference

Tech 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

Advanced

Database & migrations

Schema changes go in supabase/migrations/ as timestamped SQL files and are applied with the Supabase CLI:

supabase db push

Keep 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

Beginner

Opening a pull request

  1. Branch off main: git checkout -b fix/typo-in-saql
  2. Make your change and preview it with pnpm dev.
  3. Verify: pnpm lint and pnpm typecheck both pass.
  4. Commit with a clear message and push to your fork.
  5. 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

Anytime

Getting 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.