This course is in beta. Only the beginner tracks are written so far, and content may still change. Found a mistake or something unclear? Open an issue on GitHub - feedback is very welcome.

Nextcloud ยท Developer Education

Build apps for
30 million users

Hands-on, project-based courses for developers building on Nextcloud. Two tracks, same app - choose your language and architecture.

2
tracks
16
modules available now
~15h
written content
66
modules planned
Filter66 modules
โ˜… Standalone

Before you start

1 module ยท no track required
๐Ÿ˜ PHP

PHP App Track โ€” Beginner

8 modules ยท ~10โ€“12hStart track โ†’
๐Ÿ˜ PHP

PHP App Track โ€” Intermediate

coming soon
M1 ยท PHP
The OCP Contract
Soon

Why the OCP abstraction layer exists, what's public API and what isn't, and how to navigate deprecations across versions.

โฑ 45 minintermediate
M2 ยท PHP
Boards
Soon

Introduce boards as an organisational layer โ€” a new entity, a migration adding nullable board_id to pins, and the uncategorised pseudo-board pattern. Add and remove pins from boards, list pins by board.

โฑ 60 minintermediate
M3 ยท PHP
Component Architecture and State Management
Soon

Split the monolithic App.vue into a proper component tree โ€” BoardList, PinList, PinCard. Introduce Pinia for shared state so boards and pins are accessible across components without prop drilling. Understand when to split a component and how to design the store around the app's data model.

โฑ 75 minintermediate
M4 ยท PHP
Sharing and ACLs
Soon

Nextcloud's sharing model applied to Pinboard boards and individual pins. User shares, group shares, link shares, password-protected shares, and email invites. The permission bitmask โ€” read, create, update, delete, share โ€” and how to check and enforce each. Public board pages with #[PublicPage] and share tokens.

โฑ 90 minintermediate
M5 ยท PHP
Advanced @nextcloud/vue โ€” Navigation, Pickers, and Actions
Soon

NcAppNavigation for the board sidebar, NcSelect for user and group pickers in the share dialog, NcActionButton for per-pin actions, NcDialog for confirmations. Keyboard navigation and focus management. Accessibility in practice โ€” ARIA live regions for dynamic pin lists, focus trapping in modals.

โฑ 75 minintermediate
M6 ยท PHP
Notifications and Activity
Soon

INotificationManager and IActivityManager driven by real Pinboard events โ€” alice shared a board with you, bob added a pin to Research, a board you follow has new pins. Email notifications via IMailer for share invites.

โฑ 60 minintermediate
M7 ยท PHP
REST API Design
Soon

Build a proper versioned REST API for boards and pins. OCS vs plain JSON, authentication strategies, and testing with curl and Bruno. The Initial State mechanism โ€” provideInitialState() in the controller paired with loadState() in the frontend โ€” eliminates the initial API round-trip by injecting server data directly into the page on load.

โฑ 60 minintermediate
M8 ยท PHP
Security
Soon

CSRF, input validation, output escaping, SQL injection prevention, and auditing board and share permission checks against OWASP Top 10.

โฑ 75 minintermediate
M9 ยท PHP
Background Jobs
Soon

IJob, TimedJob, QueuedJob โ€” when to use each, registration, failure handling, and progress reporting. Exercise: a digest job summarising new pins added to shared boards.

โฑ 50 minintermediate
M10 ยท PHP
Search
Soon

Implement ISearchProvider for pins and boards โ€” indexing strategy, what to surface in unified search, and scoping results to boards the user can access.

โฑ 45 minintermediate
M11 ยท PHP
Settings and Admin Panel
Soon

ISettings for personal and admin scopes, IConfig for instance-wide configuration. Exercise: admin toggle to disable public board sharing instance-wide.

โฑ 40 minintermediate
M12 ยท PHP
Frontend Performance and UX
Soon

Lazy-loading Vue components with defineAsyncComponent for heavy views like the share dialog. Optimistic updates with rollback when the server rejects a change. Pagination and infinite scroll for large pin lists. Debouncing search input. Skeleton loading states instead of spinners.

โฑ 60 minintermediate
M13 ยท PHP
Backend Performance
Soon

N+1 query detection and caching with ICache and IMemcache applied to board and pin queries.

โฑ 60 minintermediate
M14 ยท PHP
Testing
Soon

PHPUnit setup, unit vs integration tests, mocking Nextcloud services including the share manager and notification manager. Frontend testing with Jest.

โฑ 75 minintermediate
๐Ÿ˜ PHP

PHP App Track โ€” Advanced

coming soon
M1 ยท PHP
Nextcloud Internals
Soon

The full bootstrap sequence from HTTP request to controller call. DI container internals โ€” how constructor parameters are resolved, lazy proxies, named parameters like $userId. OC_Hook legacy system vs IEventDispatcher. How Nextcloud's classloader maps namespaces to directories.

โฑ 75 minadvanced
M2 ยท PHP
Event-Driven Architecture
Soon

IEventDispatcher โ€” publishing and subscribing to events. Designing Pinboard event classes for board creation, pin addition, and share changes. Decoupling notifications, activity, and search indexing from controller logic so they listen independently. Avoiding circular dependencies in event handlers.

โฑ 60 minadvanced
M3 ยท PHP
Federation
Soon

The OCM protocol, implementing ICloudFederationProvider for Pinboard boards. Sharing a board with a user on a remote Nextcloud instance, remote user identity and trust boundaries. Handling incoming share notifications and syncing pin activity across instances.

โฑ 90 minadvanced
M4 ยท PHP
Real-Time and Collaborative Features
Soon

Server-Sent Events (SSE) and long-polling to push live updates to shared boards โ€” new pins appear without refresh. Dashboard widget showing recent activity across all boards. URL preview data fetching as a background job triggered on pin creation, with Open Graph metadata stored and surfaced in the UI. The limits of Nextcloud's notification polling mechanism.

โฑ 90 minadvanced
M5 ยท PHP
Files and Storage Internals
Soon

The storage abstraction stack (IStorage, Jail, Wrapper). File attachments on pins โ€” storing files in the user's Nextcloud rather than as blobs. Mount points and file IDs across mounts, why you can't trust paths alone. Chunked upload handling. WebDAV from the frontend for direct file operations.

โฑ 75 minadvanced
M6 ยท PHP
Caching and Distributed State
Soon

ICacheFactory in depth โ€” local, distributed, and Redis-backed caches and when to use each. Distributed locking with ILockingProvider for concurrent board edits (two users adding a pin simultaneously). Cache invalidation strategies for board membership and share ACLs. IMemcache vs ICache โ€” the distinction that matters under load.

โฑ 60 minadvanced
M7 ยท PHP
Scalability and Multi-Instance
Soon

How Nextcloud handles horizontal scaling โ€” stateless vs stateful components. The filecache table at scale and why large queries against it are dangerous. Object storage (S3/Swift) implications for file attachments on pins. Designing board and pin queries to be safe at 10M+ rows.

โฑ 90 minadvanced
M8 ยท PHP
Security Hardening
Soon

Content Security Policy builder, ISecureRandom vs ICrypto โ€” when to use each. Capability-based access control patterns. Rate limiting on share creation and public board endpoints with IRateLimiter. Audit logging for share events. Supply chain โ€” evaluating JS dependencies, composer security advisories, REUSE compliance.

โฑ 90 minadvanced
M9 ยท PHP
Contributing Upstream
Soon

Reading and navigating the Nextcloud server codebase. The backport process and stable branch rules. Writing a compelling RFC or GitHub discussion. Working with the public API committee โ€” what gets into OCP and what doesn't. Running the full Nextcloud test suite locally.

โฑ 60 minadvanced
M10 ยท PHP
CI/CD and App Quality
Soon

GitHub Actions for Nextcloud apps โ€” the standard workflow templates. Automated compatibility testing across Nextcloud versions. Psalm with Nextcloud stubs, PHP-CS-Fixer, ESLint, and Stylelint. App store release automation. REUSE compliance in CI.

โฑ 75 minadvanced
M11 ยท PHP
Architecture Patterns for Complex Apps
Soon

When to split Pinboard into multiple apps โ€” board app vs pin app โ€” and the library app pattern for shared code. Sidecar processes and IPC. Zero-downtime migrations for apps with active installs. Migrating from autoincrement to SnowflakeAwareEntity primary keys on a table with existing data. The decision framework for when an app should become an ExApp. Closes with a self-directed extensions section pointing to bonus module candidates.

โฑ 90 minadvanced
๐Ÿ ExApp Python

ExApp Track โ€” Beginner

8 modules ยท ~10โ€“12hStart track โ†’
M1 ยท ExApp Python
Environment Setup

Install Nextcloud, AppAPI, and the ExApp daemon. Understand the Docker-based deployment model and how an ExApp registers with Nextcloud. First occ app_api:app:register cycle.

โฑ 60 minbeginner
M2 ยท ExApp Python
ExApp Anatomy and Request Lifecycle

The ExApp manifest, registration with AppAPI, nc_py_api basics. How Nextcloud calls your service โ€” the signing protocol, what headers arrive, and what you must verify before trusting a request. The ExApp lifecycle vs a PHP app lifecycle.

โฑ 60 minbeginner
M3 ยท ExApp Python
Backend Fundamentals

Request handlers with FastAPI, nc_py_api for calling Nextcloud APIs, and returning JSON responses from your first Pinboard endpoints. How requests reach your Python service and how to return typed responses โ€” the ExApp equivalent of PHP controllers.

โฑ 60 minbeginner
M4 ยท ExApp Python
Database Layer

Nextcloud's KV store via nc_py_api for lightweight config, your own SQLite/Postgres sidecar for structured pin data, and when to use each. Define the pins table, write basic CRUD, scope all queries to the current user.

โฑ 60 minbeginner
M5 ยท ExApp Python
Frontend Toolchain

Set up Vite and Vue for an ExApp โ€” serving static assets from the Python service, wiring the registered top-level entry to a Vue entry point. The ExApp frontend model differs from PHP apps: assets are served by your service, not by Nextcloud.

โฑ 45 minbeginner
M6 ยท ExApp Python
Your First Vue Component

Build the Pinboard UI in three stages โ€” fetch and display pins, add loading and empty states, then wire up a form to create new ones. @nextcloud/axios for CSRF-safe calls back to your own Python API. Same @nextcloud/vue components as the PHP track.

โฑ 90 minbeginner
M7 ยท ExApp Python
Users and Identity

Verifying the current user via AppAPI โ€” what identity claims arrive in the request, what you can trust, and what you must verify. Scoping all pin queries to the current user. The difference between nc_py_api user context and a PHP IUserSession.

โฑ 40 minbeginner
M8 ยท ExApp Python
Packaging and Deployment

Building the Docker image, the ExApp store manifest, signing, and registering your app on the Nextcloud app store. The differences from PHP app packaging โ€” Docker image vs signed zip, AppAPI registration vs plain app enable.

โฑ 50 minbeginner
๐Ÿ ExApp Python

ExApp Track โ€” Intermediate

coming soon
M1 ยท ExApp Python
Auth and Security
Soon

The AppAPI auth handshake in depth โ€” verifying request signatures, never trusting unverified callbacks, replay attack prevention. Auditing the beginner pin and board endpoints against OWASP Top 10. User identity trust boundaries.

โฑ 60 minintermediate
M2 ยท ExApp Python
Boards
Soon

Introduce boards as an organisational layer โ€” a new sidecar DB entity, nullable board_id on pins, and the uncategorised pseudo-board pattern. Add and remove pins from boards, list pins by board. The ExApp equivalent of the PHP Boards module โ€” same concept, your sidecar DB means no Nextcloud migration required.

โฑ 50 minintermediate
M3 ยท ExApp Python
Component Architecture and State Management
Soon

Split the monolithic App.vue into a proper component tree โ€” BoardList, PinList, PinCard. Introduce Pinia for shared state. Understand when to split a component and how to design the store around boards and pins.

โฑ 75 minintermediate
M4 ยท ExApp Python
Sharing and ACLs
Soon

Hooking into Nextcloud's share manager from an ExApp via OCS. Sharing boards and individual pins with users, groups, via link, password-protected, and email invite. The permission bitmask โ€” read, create, update, delete, share โ€” checked and enforced in your Python service. Public board pages via nc_py_api.

โฑ 90 minintermediate
M5 ยท ExApp Python
Advanced @nextcloud/vue โ€” Navigation, Pickers, and Actions
Soon

NcAppNavigation for the board sidebar, NcSelect for user and group pickers in the share dialog, NcActionButton for per-pin actions, NcDialog for confirmations. Keyboard navigation, focus management, and accessibility in practice.

โฑ 75 minintermediate
M6 ยท ExApp Python
Notifications and Activity
Soon

Sending notifications to Nextcloud users from your Python service via nc_py_api โ€” alice shared a board with you, bob added a pin to Research. IActivityManager integration. Email notifications for share invites via the Nextcloud mailer OCS endpoint.

โฑ 60 minintermediate
M7 ยท ExApp Python
REST API Design
Soon

Exposing your own versioned API endpoints from the ExApp for boards and pins. OCS response format, API versioning, authentication for external callers. Registering endpoints with AppAPI so Nextcloud proxies them correctly. Note: unlike PHP apps, ExApps do not use the IInitialState mechanism โ€” initial data is fetched via a standard API call on component mount, consistent with the ExApp stateless service model.

โฑ 60 minintermediate
M8 ยท ExApp Python
Files Integration
Soon

Reading and writing user files via WebDAV and nc_py_api. File attachments on pins โ€” storing files in the user's Nextcloud rather than in the sidecar DB. Understanding file IDs across mounts and handling permissions correctly.

โฑ 75 minintermediate
M9 ยท ExApp Python
Background and Async Tasks
Soon

Async processing within your Python service using asyncio or task queues. Webhooks from Nextcloud triggering async work. Progress reporting back to the UI. Exercise: async URL preview fetching triggered on pin creation.

โฑ 60 minintermediate
M10 ยท ExApp Python
Search
Soon

Registering a search provider from an ExApp via nc_py_api. Indexing boards and pins in unified search, scoping results to boards the requesting user can access. Handling search from an external service โ€” latency considerations.

โฑ 50 minintermediate
M11 ยท ExApp Python
Settings and Admin Panel
Soon

Serving admin and personal settings panels from your ExApp, reading and writing instance configuration via nc_py_api. Exercise: admin toggle to disable public board sharing instance-wide.

โฑ 40 minintermediate
M12 ยท ExApp Python
Frontend Performance and UX
Soon

Lazy-loading Vue components with defineAsyncComponent. Optimistic updates with rollback when the Python service rejects a change. Pagination and infinite scroll for large pin lists. Debouncing search input. Skeleton loading states.

โฑ 60 minintermediate
M13 ยท ExApp Python
Backend Performance
Soon

Connection pooling to Nextcloud OCS APIs, caching strategies for share ACL lookups and board membership, avoiding redundant API calls with local sidecar DB as cache. Profiling the Python service. N+1 detection on board+pin queries.

โฑ 60 minintermediate
M14 ยท ExApp Python
Testing
Soon

Testing ExApp business logic independently of Nextcloud โ€” unit tests for board and pin logic, mock nc_py_api. Integration testing against a live Nextcloud instance. Testing share ACL enforcement. Frontend testing with Jest.

โฑ 70 minintermediate
๐Ÿ ExApp Python

ExApp Track โ€” Advanced

coming soon
M1 ยท ExApp Python
AppAPI Internals
Soon

How the daemon model works under the hood โ€” the full signing protocol, request routing, failure modes, and recovery. How registration flows from occ through the daemon to your service. Lazy ExApp loading and capability negotiation.

โฑ 75 minadvanced
M2 ยท ExApp Python
AI and Task Processing
Soon

Implementing TaskProcessingProvider, SpeechToText, TextToImage, and ContextChat from an ExApp. AI-powered pin tagging โ€” automatically categorise new pins into boards using a language model. The async task processing lifecycle.

โฑ 90 minadvanced
M3 ยท ExApp Python
Federation
Soon

OCM from a Python ExApp โ€” implementing the federation protocol to share Pinboard boards across Nextcloud instances. Cross-instance data exchange via nc_py_api, remote user identity trust boundaries, incoming share handling.

โฑ 90 minadvanced
M4 ยท ExApp Python
Real-Time and Collaborative Features
Soon

Server-Sent Events from a Python service to push live board updates โ€” new pins appear without refresh. Dashboard widget showing recent board activity. Progress reporting for AI task processing. The interaction between SSE, the Pinia store, and optimistic updates.

โฑ 75 minadvanced
M5 ยท ExApp Python
Multi-Instance Deployment and Scaling
Soon

Running the ExApp as a horizontally scaled service โ€” stateless design, load balancer considerations, sidecar DB becomes distributed. Redis for shared cache and session state across instances. Object storage for file attachments. When the sidecar DB model breaks down.

โฑ 75 minadvanced
M6 ยท ExApp Python
Security Hardening
Soon

Container image supply chain โ€” base image selection, dependency scanning, SBOM generation. Secrets management โ€” never bake credentials into images. CSP implications of an external service serving assets. Rate limiting on share creation and public board endpoints. Runtime security and least-privilege containerisation.

โฑ 75 minadvanced
M7 ยท ExApp Python
Caching and Distributed State
Soon

Caching OCS API responses to avoid redundant Nextcloud calls โ€” share ACL lookups, user group membership, board metadata. Redis as a shared cache across scaled instances. Cache invalidation via Nextcloud webhook events. When to cache and when to always re-fetch.

โฑ 60 minadvanced
M8 ยท ExApp Python
Event-Driven Architecture
Soon

Receiving Nextcloud events via webhook callbacks โ€” file events, user events, share events. Designing the ExApp as an event-driven service: decoupling board notifications, search indexing, and AI tagging into independent event handlers. Webhook reliability, retries, and idempotency.

โฑ 60 minadvanced
M9 ยท ExApp Python
CI/CD for ExApps
Soon

Docker image builds for multiple architectures (amd64, arm64). Automated AppAPI registration testing against a real Nextcloud instance in CI. App store release automation. Container image signing and attestation. SBOM generation in the pipeline.

โฑ 70 minadvanced
M10 ยท ExApp Python
Contributing Upstream
Soon

Contributing to AppAPI itself โ€” new provider interfaces, capability additions, nc_py_api improvements, and the AppAPI release process. Navigating the AppAPI codebase, writing good issues, and the PR review process.

โฑ 60 minadvanced
M11 ยท ExApp Python
Architecture Patterns for Complex ExApps
Soon

When to split an ExApp into multiple services. The sidecar service pattern for heavy computation (AI inference, image processing). Migrating from SQLite to Postgres in a sidecar DB with live users. The decision framework for when an ExApp should become a PHP app or vice versa. Closes with a self-directed extensions section.

โฑ 90 minadvanced