Skip to content
 
 

Latest commit

 

History

2,639 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GraphAcademy Course Content

This repository holds the course curriculum for GraphAcademy.

Prerequisites

You will need the following software to run GraphAcademy locally:

Recommended:

Setup

This repository uses docker-compose to create a local server using the latest production build of the GraphAcademy website (repo here). The docker image is stored on AWS ECR, so you will need credentials - talk to Adam.

  1. Clone this repository

  2. Install the AWS CLI

  3. Run aws configure to configure the AWS CLI

  4. Log in to docker using the credentials above:

    aws ecr get-login-password --region us-east-1 | docker login -u AWS --password-stdin 715633473519.dkr.ecr.us-east-1.amazonaws.com
  5. Install the dependencies using NPM

    npm install
  6. You will need to create a .env file in the project root with Auth0 configuration. You can get an example file from Adam or Martin.

    • NEO4J_HOST

    • NEO4J_USERNAME

    • NEO4J_PASSWORD

    • AUTH0_CLIENT_ID

    • AUTH0_CLIENT_SECRET

    • AUTH0_ISSUER_BASE_URL

    • CDN_URL

  7. Run npm run dev to start the server

Devcontainer

If you are using VS Code, you can use the devcontainer to run the application in a container.

You will need the Dev Containers extension installed and Docker running.

When the devcontainer is started, it will:

  • Install all dependencies

  • Start the GraphAcademy application and Neo4j database.

You can run the content update and sync by running the following command in a terminal:

npm run dev:watch

File Structure

All content lives in the asciidoc/ directory. As you modify the content, a process will sync the course structure to Neo4j.

  • categories/ - Category information (see Category Structure below)

  • courses/ - All courses are organised into the own folder structure with modules and lessons

  • emails/ - The emails sent to users on enrolment, completion and a reminder email when the user has been inactive for 7 days

  • languages/ - i18n phrases for courses in languages other than English.

  • pages/ - "CMS" content displayed throughout the website, for example the /certifications/ page

  • shared/ - Content shared across courses

  • statuses/ - Meta data around course statuses

Posting releases to Asana

When a PR with a label (e.g. Release) is merged, course metadata is posted to Asana and Slack using the combined config in config/promo/ (e.g. release.json). The file has asana.destinations (project/section/assignee GIDs) and slack.channels.

Build a destination from an Asana URL (paste the board URL, section name, and assignee name; the script looks up GIDs and prints JSON for your config):

npm run asana:url-to-destination -- \
  --url "https://app.asana.com/.../project/123/list/456" \
  --section "Marquee Assets in Production" \
  --assignee "Greg Posten" \
  --name "Marquee Production"

Other Asana helpers:

  • npm run asana:list-sections — <project_gid> – list section GIDs for a board

  • npm run asana:list-assignees — --project <project_gid> – list user GIDs (for assignee)

  • ASANA_CONFIG=release npm run release:asana — <course_slug> – post one course’s metadata to Asana locally

Slack promotion and review:

  • npm run release:slack — <course_slug> – post the release promo to Slack (template: asciidoc/shared/release/release.adoc, channels: config/promo/release.json)

  • npm run review:slack — <course_slug> – post an SME review request to #graphacademy (template: asciidoc/shared/release/sme-review.adoc, channels: config/promo/sme-review.json); also triggered automatically when the sme-review label is applied to a PR

  • Set SLACK_BOT_TOKEN in .env (Bot User OAuth Token with chat:write and channels:history scopes)

Managing Slack messages posted by the bot:

Find the channel ID in Slack by right-clicking the channel and selecting View channel details.

# List recent bot messages in a channel
npm run slack:list-messages -- --channel <channel_ID>

# Narrow results by count or keyword
npm run slack:list-messages -- --channel <channel_ID> --limit 20 --search "aura-agents"

# Delete a specific message (copy the timestamp from the list output)
npm run slack:delete-message -- --channel <channel_ID> --ts <timestamp>

# Dry-run to confirm before deleting
npm run slack:delete-message -- --channel <channel_ID> --ts <timestamp> --dry-run

Full flow (config files, workflow trigger, finding GIDs) is documented in the Releasing courses module in the How We Teach course.

Course Structure

asciidoc
 + courses/
    + {course-slug}/                  - Course Folder
       + badge.svg                    - SVG badge used across the site
       | overview.adoc                - Course meta data and content used on the course overview page
       + modules/                     - Each course is split into modules
         + {module-slug}/
           | overview.adoc
           + lessons/                 - A module is split into lessons
             + {lesson-slug}/
               | lesson.adoc
               + questions/           - A lesson can be optional, otherwise will have questions.
                 | question-1.adoc
                 | question-2.adoc

Category Structure

Categories are defined as .adoc files in asciidoc/categories/. Courses are assigned to categories via the :categories: attribute in course.adoc:

:categories: developer:1, context-engineer:3, coredb

Each entry is a category slug with an optional display order (slug:order). The order controls where the course appears within that category’s listing.

Parent categories

Five top-level parent categories organise everything else. The website queries these parents directly — never the parents themselves, only their children.

Slug Status Purpose

persona

active

Groups courses by role. Children: developer, data-scientist, context-engineer, data-engineer, administrator.

paths

active

Curated start-to-finish learning progressions. Children: neo4j-app, graphrag-assistant, deploy-with-aura.

homepage

disabled

The four learning-path cards shown on the GraphAcademy homepage, in order. Children: cypher-neo4j-fundamentals (0), graph-data-science (1), app-development (2), generative-ai (3).

internal

disabled

Internal classifications required on every course. Children: coredb, gds, genai, beginners, intermediate, advanced.

languages

disabled

Localised landing pages. Children: pt, es.

Category attributes

The following attributes are available on a category .adoc file:

Attribute Required Description

:parent:

No

Comma-separated list of parent slugs with optional order (parent:order). A category can have multiple parents: :parent: topic:1, homepage:2.

:caption:

No

Short description shown on category cards.

:call-to-action:

No

Button label for homepage and path cards (e.g. Start learning).

:link:

No

Override URL for the category card link.

:layout:

No

Rendering hint for the website. Values: default (default), path, workshops, homepage.

:certification:

No

Certification slug or name that learners can expect to earn by completing this path.

:shortname:

No

Short display name used where space is limited.

:redirect:

No

Redirect the category page to another URL.

:status:

No

active (default) or disabled. Disabled categories are synced to the graph but hidden from all listings.

:lang:

No

BCP 47 language code (e.g. pt, es). Defaults to en.

Internal classifications

Every course must include at least one internal classification in its :categories: attribute. This is enforced by the tests/categories.test.js test suite.

Slug Use for

coredb

Core Neo4j database courses (Cypher, modeling, importing, application development, administration)

gds

Graph Data Science courses

genai

Generative AI and GraphRAG courses

Workshops

Workshops are instructor-led courses that are designed to be delivered in a classroom setting. They should not be used for self-study. The following workshops are available:

Core Database

Graph Data Science

  • Graph Data Science in Practice (workshop-gds) (4 hours)
    Learn to apply graph algorithms to real-world business problems, including community detection and fraud detection.

Generative AI

  • Neo4j and Generative AI Workshop (workshop-genai) (3 hours)
    Learn how Neo4j and GraphRAG can support your Generative AI projects, covering knowledge graph construction, vector search, and conversational agents.

QA

A suite of tests have been setup to ensure courses meet the right standard.

To open the test suite run:

npm run test

This will open up a UI. Select E2E testing > Chrome and then select the course.

To create a test for your course, you can copy one of the existing files in the cypress/e2e folder to cypress/e2e/{slug}.cy.js and then change line 6 to cy.getCourseDetails('{slug}')/

You can run QA tests for all courses by running:

npm run test:qa

You can run QA tests for specific courses by setting the COURSES environment variable:

COURSES=fundamentals,aura npm run test:qa

Skipping Tests

You can skip certain time-consuming tests by setting environment variables:

  • SKIP_LINK_CHECKS=true - Skip validation of external links (GitHub repositories, lesson links)

  • SKIP_CYPHER_CHECKS=true - Skip Cypher query validation (file existence checks still run)

Cursor QA checks

You can use Cursor to run automated QA checks on the course content.

Cursor prompts are stored in the .cursor/ folder.

To run the checks against a specific course , use the following commands:

@review-lesson-content.mdc for @genai-graphrag-python
run and fix COURSES=graphrag-python npm run test qa
@technical-lesson-review.mdc
@review-course.mdc

Configuring the mcp docs server

Make sure to install the neo4j documentation MCP server by running the following command:

npm install neo4j-driver

Fact checking

Use built-in docs-mcp server to fact check the course content.

Running the Server

npm run mcp:docs

Or preview the server with MCP Inspector:

npm run mcp:docs:inspect

Cursor Configuration

Add the following to your .cursor/mcp.json file:

~/cursor/mcp.json
{
  "mcpServers": {
    "docs-mcp": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "tsx",
        "/path/to/courses/src/mcp/docs-mcp/index.ts"
      ]
    }
  }
}

Usage

Run the cursor prompt:

@fact-check-lessons.mdc for @genai-graphrag-python

Contributing

To create a new course or modify an existing course, please create a new branch and make your changes. Once you have finished, create a new PR and add adam-cowley as a reviewer.

git checkout -b new-course
mkdir asciidoc/courses/new-course/
echo "= New Course\n:status: draft" > asciidoc/courses/new-course/course.adoc
git add asciidoc/courses/new-course/
git commit -m "Added new course"
git push --set-upstream origin new-course

Before creating the PR, please rebase your branch on the main branch.

git fetch origin main
git rebase main

Creating a PR

When you create a PR, select the correct template:

The checklist must be completed before the PR can be merged.

Generating a Banner

To generate a banner image for a course, run the following command:

npm run generate:ogimages

The command scans through the asciidoc/ folder, finds all courses that don’t include a banner.png image and attempts to create them.

Deploying Changes

When a new application server is created, the latest tagged version of this repository is downloaded by the server.

You can use the npm version command to create a new tag. First, run a git pull --tags to get the latest commits and tags from the server, then run the npm version command to create a new tag. Once you are done, run git push --tags.

git pull --tags origin main
npm version patch
git push --tags origin main
  • npm version patch - To be used when minor fixes are made to an existing course

  • npm version minor - To be used when a new course is released

  • npm version major - To be used when a major change is made to the repository - for example, multiple course changes, or addition of a new category

Linking Certifications

To link certifications from the certifications repository, create a symlink:

ln -s ../certifications/asciidoc/certifications/neo4j-certification asciidoc/certifications/neo4j-certification

Documentation

Additional documentation is located in the Docs folder.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages