Already enrolled in a course? Sign in with a magic link →  ·  Have an invite code? Join here →
Open Source · LTI 1.3 · PHP + SQLite

A living learning space for your course

Course Community goes beyond the discussion board. It's a full community environment where students and instructors can communicate, collaborate, co-create, write documents together, give and receive feedback — and make learning visible together.

No vendor lock-in Runs on shared hosting Integrates with Brightspace Student data stays yours
◈ Course Community — EDUC 420
📣 Feed
💬 Discussion
❓ Q&A
📚 Resources
🎉 Kudos
🧩 Collab
📄 Documents
🔁 Peer Review
👥 Members
📡 Pulse Checks
🛡️ Moderation
❓ Question ❓ Q&A
What's the difference between formative and summative assessment?
Sam Student·2h ago·💬 1 reply
🎉 Kudos
Shoutout to Sam for a brilliant question!
Instructor·1h ago·👏 5
📊 Poll
Check-in: How are you feeling about Week 3?
Instructor·3h ago·12 votes

Everything a learning community needs

Designed around how people actually learn together — not just how they submit assignments.

💬
Threaded Discussions

Rich threaded conversations with nested replies, markdown formatting, reactions, and instructor notes. Not a flat forum — a real dialogue.

Discussion
Q&A with Accepted Answers

Students ask, the community answers. Upvoting surfaces the best responses. Instructors and post-authors can mark accepted answers. Unresolved questions surface automatically.

Q&A
🧩
Collaboration Boards

Visual sticky-note boards with drag-and-drop positioning. Perfect for brainstorming, mind-mapping, idea generation, and collecting thinking from the whole class.

Collaboration
📄
Collaborative Documents

Shared Markdown documents the whole class can write together. Auto-saves as you type, shows who's currently editing, and detects conflicting changes. Creators can publish a document as read-only and anyone can download the raw Markdown file.

Co-authoring
📚
Resource Library

A community-curated collection of articles, videos, and tools. Anyone can contribute — making resource curation a participatory act rather than a one-way broadcast.

Resources
🎉
Kudos & Peer Recognition

A dedicated space for giving specific, public appreciation to classmates. Research consistently shows that recognition cultures improve motivation and belonging.

Recognition
📊
Polls & Check-ins

Quick anonymous polls to check understanding, gather sentiment, or make decisions together. Results update in real-time as classmates vote.

Engagement
🪞
Reflections

A post type specifically for reflective writing — thinking out loud about the learning process, not just the content. Surfaces metacognition as a valued community contribution.

Reflection
📊
Community Pulse Dashboard

Instructors see who's contributing, which spaces are thriving, unanswered questions, and — crucially — which students are quietly disengaged before it becomes a problem.

Analytics
📡
Pulse Checks — Live Audience Response

Run real-time response sessions during class or a conference. Instructors create sets of questions (multiple choice, rating scales, word clouds, or short text), open them one at a time, and reveal results on their own schedule. Public sessions generate a QR code so audiences can join from any device with no login required.

Live Response
🔔
Notifications & Activity Feed

Real-time notification of replies, reactions, and mentions. A unified activity feed shows the full community narrative at a glance. Scoped per-course so notifications never bleed between sections.

Awareness
🔁
Structured Peer Feedback

A full anonymous peer review workflow: instructors define prompts and configure how many reviewers each submission receives. Students submit text or files; the system load-balances reviewer assignments automatically.

Peer Learning
🛡️
Community Moderation

A graduated, community-assisted moderation system. Students flag concerning content; instructors review a prioritised queue and choose a proportionate response — send a private note, hide, or redact. Every action is logged for accountability.

Safety

A research-backed peer review workflow

Giving feedback is one of the most powerful ways to deepen understanding. Course Community makes it structured, anonymous, and fair.

How it works

1
Instructor creates the assignment
Set a title, instructions, custom feedback prompts (e.g. "What are the strengths?", "What could be clearer?"), number of reviewers per submission, and whether text, file uploads, or both are accepted.
2
Students submit their work
Once opened, students submit their writing, documents (PDF, Word, etc.), or both. Submissions can be updated or withdrawn during the open period.
3
Reviewers are automatically assigned
A load-balancing algorithm assigns reviewers evenly — no student reviews their own work. The review phase begins, and each student sees only their assigned submissions, with author identities hidden.
4
Feedback is released when closed
When the instructor closes the assignment, each student sees the anonymous feedback received on their submission. Reviewer identities are never revealed to submitters.

Key design decisions

🎭 Bidirectional anonymity

Reviewers can't see who submitted the work. Submitters can't see who reviewed it. Instructors can see everything. This mirrors validated academic peer review processes.

⚖️ Load-balanced assignment

The assignment algorithm distributes reviews evenly across the class, so no student gets significantly more or fewer reviews than others — even in small cohorts.

🔒 Secure file handling

Uploaded documents are stored outside the public web root and served only through a permission-checked PHP endpoint. Only the author, assigned reviewers, and instructor can download a file.

📋 Structured prompts

Instructors define the feedback prompts — so reviews are guided rather than free-form. Students respond to each prompt individually, keeping feedback specific and actionable.

Assignment lifecycle
Draft
Instructor is setting up the assignment. Not visible to students yet.
Open
Students submit their work. Submissions can be edited or withdrawn.
Reviewing
Reviewers are assigned. Students complete their peer reviews.
Closed
Reviews released. Students see the feedback they received.

Live response — in the room and beyond

Pose questions during a class, workshop, or conference. Students and audience members respond in real time. Instructors reveal results when they're ready.

How it works

1
Instructor builds a check
Create a set of questions in any combination of types: multiple choice, rating/Likert scale, word cloud, or short text. Choose course-only access (enrolled students) or public access (anyone with the link or QR code).
2
Activate and share
Click Activate. For public sessions, a QR code and short URL appear in the presenter view — show them on a slide so the audience can join from any device, no account needed.
3
Open questions one at a time
Open each question when you're ready. Students and audience members see the response form immediately and can submit without leaving the page.
4
Reveal results on your schedule
Results are hidden from respondents until you decide to reveal them. Use the reveal as a teaching moment — show the distribution, discuss what it means, then move on.

Question types

Multiple Choice

Up to any number of options. Results display as a bar chart showing count and percentage per option. Great for comprehension checks, concept votes, or audience polls.

Rating / Likert Scale

Configurable scale (1–5, 1–7, 1–10) with custom min/max labels (e.g. "Strongly disagree" → "Strongly agree"). Results show a histogram and the mean.

☁️ Word Cloud

Each respondent contributes a word or short phrase. Results appear as a weighted cloud — the most frequent responses appear largest. Striking to reveal in front of a group.

✏️ Short Text

Open-ended responses up to 500 characters. Results display as a scrolling list of all responses — ideal for reflections, muddiest-point prompts, or open feedback.

Course session vs. Public session
🔒 Course only 🌐 Public
Who can respond Enrolled students (session required) Anyone with the link or QR code — no login
Share method Visible in student sidebar when active Short URL (/p/XXXXXXXX) + auto-generated QR code
Deduplication Authenticated — one response per student per question (updates on re-submit) Fully anonymous — no tracking, no deduplication
Best for In-class formative checks, exit tickets, Likert surveys Conference workshops, open lectures, community events

Graduated, community-driven, accountable

Moderation that empowers the community to flag concerns — and gives instructors measured tools to respond — without turning the platform into surveillance.

How it works

1
Student flags content
Any student can flag a post or comment with a reason: inappropriate content, harassment, spam, or off-topic. The report is private. The author is notified privately and can self-correct.
2
Instructor reviews the queue
The Moderation panel (instructor-only) shows a prioritised queue of flagged content, sorted by flag count and recency. Each item shows the content excerpt, author, and flag reasons. When three or more flags accumulate, instructors are notified automatically.
3
Instructor chooses a proportionate response
Send a private note, hide the content, redact it, or dismiss the flags entirely. Content can always be restored. Every action is logged.
4
Audit log records everything
A full chronological log of every moderation action — who did what, to which content, and when — is available to instructors for accountability and review.

Instructor actions

✉️ Send Private Note

Send a message directly to the author without changing the content. The lightest touch — useful for guidance before escalating.

🙈 Hide

Removes the post or comment from view. Others see a neutral placeholder. The author sees their content and your explanation — and can still edit or delete it.

✂️ Redact

Replaces the body with "[Content removed by instructor]" while preserving the original server-side. The original can be reviewed and restored at any time.

↩️ Restore / Dismiss

Reverse any moderation action and return content to normal, or dismiss flags that turned out to be unfounded. Both actions are recorded in the audit log.

What each person sees
Viewer Hidden or Redacted Content
Other students Neutral placeholder: "This content has been reviewed and is not currently visible."
Content author Still sees their own content + an amber notice with the instructor's explanation. Can edit or delete at any time.
Instructor Sees full content with a status badge, flag count, and moderation action buttons.

Built on learning science

The feature set is grounded in D'Arcy Norman's five-dimensional course design framework — The Teaching Game.

01
Player

Multiple contribution modes give every student a meaningful way in — posting, replying, curating, recognizing, reflecting, submitting work, or giving structured peer feedback.

02
Performance

Votes, reactions, accepted answers, kudos, and structured peer feedback make contribution quality visible — both to individuals and to the instructor via the Community Pulse.

03
Narrative

The community feed creates a chronological story of shared learning. Pinned and featured posts curate the most important moments in that story.

04
Environment

Purposeful spaces — Discussion, Q&A, Resources, Kudos, Collaboration, Peer Feedback — create distinct places with clear social norms and expectations.

05
System

Transparent roles, moderation tools, course-isolated sandboxing, and LTI-based authentication ensure the community operates within a coherent, trustworthy structure.

Works natively with Brightspace

Course Community uses the LTI 1.3 standard to launch from Brightspace, automatically authenticating users and loading course context.

How it works

1
Register the tool in Brightspace
Go to Admin → External Learning Tools → New Deployment. Choose LTI 1.3 and fill in the URLs below.
2
Copy credentials into config.php
Brightspace will give you a client ID, issuer URL, JWKS URI, and authentication endpoint. Paste these into config.php.
3
Add a link in your course
Add an External Learning Tool link anywhere in your Brightspace course — content area, navbar, or module. Students click it and are automatically authenticated.
4
Launch
The tool reads the user's name, role (instructor/student), and course context from the LTI JWT. No separate login required. Each course gets its own isolated community.

URLs to register

Setting Value
Login Initiation URL
https://sandbox.darcynorman.net/course-community/lti.php?action=login
Redirect URI (Launch URL)
https://sandbox.darcynorman.net/course-community/lti.php?action=launch
Target Link URI
https://sandbox.darcynorman.net/course-community/
No HTTPS? Use Dev Mode.
Set DEV_MODE=true as an environment variable (or in config.php) to bypass LTI authentication entirely. A simulated instructor + student are created automatically — perfect for local development and demos.

config.php example

// Brightspace LTI 1.3 credentials $LTI_PLATFORMS = [ 'https://your.brightspace.com' => [ 'client_id' => '12345678', 'auth_endpoint' => 'https://your.brightspace.com/d2l/lti/authenticate', 'jwks_uri' => 'https://your.brightspace.com/d2l/.well-known/jwks', ], ];

Up and running in minutes

No build tools, no npm, no containers required. Just PHP and a place to host it.

# 1. Copy files to your web server scp -r course-community/ user@yourserver.com:/var/www/html/community/ # 2. Make the data directory writable chmod 755 /var/www/html/community/data/ # 3. Set environment variables (or edit config.php directly) export APP_URL="https://yourserver.com/community" export LTI_ISSUER="https://your.brightspace.com" export LTI_CLIENT_ID="your-client-id-from-brightspace" export LTI_AUTH_ENDPOINT="https://your.brightspace.com/d2l/lti/authenticate" export LTI_JWKS_URI="https://your.brightspace.com/d2l/.well-known/jwks" # 4. (Optional) Test locally with dev mode export DEV_MODE=true php -S localhost:8080 # Then visit: http://localhost:8080/lti.php?action=dev

Requirements

🐘
PHP 8.1+
PDO, SQLite3, OpenSSL
🗃️
SQLite 3
Auto-created on first run
🔒
HTTPS
Required for LTI 1.3
🌐
Apache/Nginx
Or any PHP host

Apache .htaccess (recommended)

RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/assets/ RewriteCond %{REQUEST_URI} !^/api/ RewriteCond %{REQUEST_URI} !^/lti.php RewriteRule ^(.*)$ /index.php [L,QSA]

Ready to build a better learning community?

Open source, self-hosted, and yours to adapt. Start with dev mode to explore it today.