Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.7.0] - 2026-01-25¶
Added¶
- Command Aliases: Create shortcuts for frequently used commands
canvas alias set <name> "<command>"- Create an aliascanvas alias list- List all aliasescanvas alias delete <name>- Remove an alias-
Aliases are stored in config and expand at runtime
-
Context Management: Set default values for common flags
canvas context set <type> <id>- Set course, assignment, user, or account contextcanvas context show- Display current contextcanvas context clear [type]- Clear all or specific context-
Commands automatically use context when flags aren't provided
-
Output Filtering: Filter and sort command output
--filter <text>- Filter results by text (case-insensitive, searches all fields)--columns <list>- Select specific columns to display--sort <field>- Sort by field (prefix with-for descending)-
Works with all output formats (table, JSON, YAML, CSV)
-
Enhanced Dry-Run Mode: Preview destructive operations with details
- Delete commands show resource details before confirmation
- Update commands show what would change
-
Works with
--dry-runand--forceflags -
Curl Command Output: See equivalent curl commands with
--dry-run - Useful for debugging and learning the Canvas API
-
Token redacted by default, use
--show-tokento include -
Aggressive Auto-Update: Automatic update checking
canvas update enable- Enable automatic update checkscanvas update disable- Disable automatic update checkscanvas update check- Manually check for updatescanvas update status- Show update settings
Changed¶
- Improved CLI UX inspired by modern tools (gh, kubectl, stripe-cli)
- Documentation updated with new feature guides
[1.5.2] - 2026-01-14¶
Added¶
- Per-instance API Token Authentication: New alternative to OAuth for simpler authentication
canvas auth token set <instance>- Configure API token for an instancecanvas auth token remove <instance>- Remove API token from an instance- Tokens stored in config file, can be mixed with OAuth per-instance
- User-Agent Header: All API requests now include
User-Agent: canvas-cli/VERSION - Required by Canvas API (enforcement coming soon per Canvas changelog)
- Includes version for debugging and analytics
- Auth Status Improvements:
canvas auth statusnow shows authentication type (token/oauth/none) - Instance Helper Methods:
HasToken(),HasOAuth(),AuthType()for config
Changed¶
- Token authentication takes precedence over OAuth when both are configured for an instance
- Improved error messages for authentication failures
[1.0.0] - 2026-01-09¶
Added¶
Core Functionality¶
- OAuth 2.0 authentication with PKCE support
- Local callback server mode for OAuth flow
- Out-of-band (OOB) OAuth flow fallback for SSH/remote environments
- Secure token storage using system keyring (macOS Keychain, Windows Credential Manager, Linux Secret Service)
- Encrypted file storage fallback with AES-256-GCM encryption
- User-derived encryption keys from machine ID + username
- Multi-instance configuration management
- Canvas version detection and compatibility handling
API Client Features¶
- Comprehensive Canvas LMS API client
- Adaptive rate limiting (5 req/sec → 2 req/sec → 1 req/sec based on quota)
- Automatic pagination handling for large result sets
- Exponential backoff retry logic with 3 max retries
- Data normalization for consistent API responses
- Custom error types with helpful suggestions and documentation links
- Request/response logging with --debug flag
Commands - Authentication¶
canvas auth login- OAuth 2.0 authentication flowcanvas auth logout- Logout and clear credentialscanvas auth status- Check authentication status
Commands - Courses¶
canvas courses list- List courses with filtering optionscanvas courses get- Get course details with includescanvas courses users- List users in a course
Commands - Assignments¶
canvas assignments list- List assignments in a coursecanvas assignments get- Get assignment detailscanvas assignments create- Create new assignment with full parameter supportcanvas assignments update- Update assignment with pointer types for optional fieldscanvas assignments bulk-update- Bulk update multiple assignments
Commands - Users¶
canvas users me- Get current authenticated usercanvas users list- List users with filteringcanvas users get- Get user detailscanvas users create- Create new user with pseudonym and communication channelcanvas users update- Update user with avatar support
Commands - Enrollments¶
canvas enrollments list- List enrollments in course/sectioncanvas enrollments create- Create new enrollment
Commands - Submissions¶
canvas submissions list- List submissions for assignmentcanvas submissions get- Get submission detailscanvas submissions grade- Grade individual submissioncanvas submissions bulk-grade- Bulk grade from CSV
Commands - Files¶
canvas files upload- Upload files with progress trackingcanvas files download- Download files with resumable support
Advanced Features¶
- REPL Mode: Interactive shell with command history, tab completion, and syntax highlighting
- Smart Caching: TTL-based caching (courses: 15min, users: 5min, assignments: 10min)
- Batch Operations: Concurrent processing with progress bars and error collection
- Webhook Listener: Real-time webhook event handling with signature verification
- Diagnostics:
canvas doctorcommand for health checks and troubleshooting - Telemetry: Opt-in anonymous usage tracking for feature prioritization
Output Formats¶
- Table format (ASCII tables with proper truncation)
- JSON format (structured output)
- YAML format (human-readable)
- CSV format (for data export)
Developer Features¶
- Comprehensive test suite with 90% coverage
- HTTP request/response recording for tests
- Mock Canvas API server for testing
- Synthetic test data (no PII in test fixtures)
- Race condition detection in tests
- CI/CD ready with stable exit codes
Testing¶
- 90% test coverage for core functionality (89.9% weighted average)
- 8 out of 9 packages at 90%+ coverage
- All tests passing (100% pass rate)
- No race conditions detected
- Comprehensive parameter testing for all API operations
- Edge case coverage for error scenarios
- Mock HTTP server testing with httptest
Security¶
- OAuth 2.0 with PKCE (Proof Key for Code Exchange)
- Secure credential storage with system keyring integration
- AES-256-GCM encryption for file-based token storage
- User-derived encryption keys (never stored)
- Webhook signature verification with HMAC-SHA256
- No hardcoded credentials
- No sensitive data in logs or cache
Performance¶
- Adaptive rate limiting respects Canvas API quotas
- Smart caching reduces redundant API calls
- Concurrent batch operations (5 concurrent by default)
- Automatic pagination for large datasets
- Efficient memory usage (<100MB for 10,000 cached items)
- Progress indicators for operations >3 seconds
Documentation¶
- Comprehensive README with quick start guide
- Architecture documentation in docs/development/architecture.md
- CONTRIBUTING.md with development guidelines
- PROJECT_STATUS.md tracking implementation progress
- COVERAGE_REPORT.md with detailed test coverage metrics
- Inline code documentation with examples
Infrastructure¶
- Go 1.21+ support with modern stdlib features (log/slog)
- Cross-platform support (macOS, Linux, Windows)
- Cobra CLI framework for command structure
- Viper for configuration management
- Standard Go project layout
[Unreleased]¶
Planned¶
- Canvas Studio integration
- GraphQL API support
[1.5.0] - 2026-01-14¶
Added¶
70+ New Write Commands¶
This release adds comprehensive write command support across all Canvas API resources:
Account Administration¶
canvas admins add- Add account administratorcanvas admins list- List account administratorscanvas admins remove- Remove account administratorcanvas roles create- Create custom rolecanvas roles update- Update role permissionscanvas roles delete- Delete custom rolecanvas roles list- List account roles
Analytics¶
canvas analytics activity- View course activitycanvas analytics assignments- View assignment statisticscanvas analytics department- View department-level analyticscanvas analytics students- View student analyticscanvas analytics user- View user-specific analytics
Assignment Groups¶
canvas assignment-groups list- List assignment groupscanvas assignment-groups get- Get assignment group detailscanvas assignment-groups create- Create assignment groupcanvas assignment-groups update- Update assignment groupcanvas assignment-groups delete- Delete assignment group
Blueprint Courses¶
canvas blueprint get- Get blueprint detailscanvas blueprint sync- Sync blueprint to associated coursescanvas blueprint changes- View unsynced changescanvas blueprint associations list- List associated coursescanvas blueprint associations add- Add course associationscanvas blueprint associations remove- Remove associationscanvas blueprint migrations list- List sync historycanvas blueprint migrations get- Get migration details
Content Migrations¶
canvas content-migrations list- List migrationscanvas content-migrations get- Get migration detailscanvas content-migrations create- Start content migrationcanvas content-migrations issues- View migration issues
Conversations (Inbox)¶
canvas conversations list- List conversationscanvas conversations get- Get conversation detailscanvas conversations create- Create new conversationcanvas conversations reply- Reply to conversationcanvas conversations forward- Forward conversationcanvas conversations add-recipients- Add recipientscanvas conversations mark-read- Mark as readcanvas conversations mark-unread- Mark as unreadcanvas conversations archive- Archive conversationcanvas conversations unarchive- Unarchive conversationcanvas conversations star- Star conversationcanvas conversations unstar- Unstar conversationcanvas conversations delete- Delete conversationcanvas conversations batch-update- Bulk update conversations
Courses¶
canvas courses create- Create new coursecanvas courses update- Update coursecanvas courses delete- Delete/conclude course
External Tools (LTI)¶
canvas external-tools list- List external toolscanvas external-tools get- Get tool detailscanvas external-tools create- Create external toolcanvas external-tools update- Update external toolcanvas external-tools delete- Delete external toolcanvas external-tools sessionless-launch- Get sessionless launch URL
Grades & Gradebook¶
canvas grades summary- View grade summarycanvas grades history- View grade historycanvas grades bulk-update- Bulk update gradescanvas grades final- Get final gradescanvas grades current- Get current grades
Groups¶
canvas groups list- List groupscanvas groups get- Get group detailscanvas groups create- Create groupcanvas groups update- Update groupcanvas groups delete- Delete groupcanvas groups users- List group memberscanvas groups invite- Invite users to groupcanvas groups join- Join a groupcanvas groups leave- Leave a groupcanvas groups categories list- List group categoriescanvas groups categories create- Create categorycanvas groups categories update- Update categorycanvas groups categories delete- Delete category
Learning Outcomes¶
canvas outcomes list- List outcomescanvas outcomes get- Get outcome detailscanvas outcomes create- Create learning outcomecanvas outcomes update- Update outcomecanvas outcomes delete- Delete outcomecanvas outcomes groups list- List outcome groupscanvas outcomes groups get- Get group detailscanvas outcomes groups create- Create outcome groupcanvas outcomes groups update- Update groupcanvas outcomes groups delete- Delete groupcanvas outcomes import- Import outcomescanvas outcomes alignments- View outcome alignmentscanvas outcomes results- View outcome results
Assignment Overrides¶
canvas overrides list- List assignment overridescanvas overrides get- Get override detailscanvas overrides create- Create date/student overridecanvas overrides update- Update overridecanvas overrides delete- Delete overridecanvas overrides batch-create- Bulk create overridescanvas overrides batch-update- Bulk update overrides
Peer Reviews¶
canvas peer-reviews list- List peer reviewscanvas peer-reviews create- Assign peer reviewcanvas peer-reviews delete- Remove peer review assignment
Quizzes (Classic Quizzes)¶
canvas quizzes list- List quizzescanvas quizzes get- Get quiz detailscanvas quizzes create- Create quizcanvas quizzes update- Update quizcanvas quizzes delete- Delete quizcanvas quizzes reorder- Reorder quiz questionscanvas quizzes validate-token- Validate access codecanvas quizzes questions list- List quiz questionscanvas quizzes questions get- Get question detailscanvas quizzes questions create- Create questioncanvas quizzes questions update- Update questioncanvas quizzes questions delete- Delete questioncanvas quizzes submissions list- List quiz submissionscanvas quizzes submissions get- Get submission detailscanvas quizzes submissions start- Start quiz attemptcanvas quizzes submissions complete- Complete quiz attempt
Rubrics¶
canvas rubrics list- List rubricscanvas rubrics get- Get rubric detailscanvas rubrics create- Create rubriccanvas rubrics update- Update rubriccanvas rubrics delete- Delete rubriccanvas rubrics associations- List rubric associationscanvas rubrics associate- Associate rubric with assignmentcanvas rubrics assessments- View rubric assessments
Course Sections¶
canvas sections list- List course sectionscanvas sections get- Get section detailscanvas sections create- Create sectioncanvas sections update- Update sectioncanvas sections delete- Delete sectioncanvas sections crosslist- Cross-list sectioncanvas sections uncrosslist- Remove cross-listing
SIS Imports¶
canvas sis-imports list- List import historycanvas sis-imports get- Get import detailscanvas sis-imports create- Start SIS importcanvas sis-imports abort- Abort running importcanvas sis-imports restore- Restore deleted itemscanvas sis-imports errors- View import errors
Raw API Access¶
canvas api- Make raw API requests to any Canvas endpoint
Modules Improvements¶
canvas modules publish- Publish module (convenience)canvas modules unpublish- Unpublish module (convenience)canvas modules items update- Update module item (was missing)
Enrollments Improvements¶
canvas enrollments create- Create enrollmentcanvas enrollments update- Update enrollment statecanvas enrollments delete- Delete/deactivate enrollmentcanvas enrollments accept- Accept enrollment invitationcanvas enrollments reject- Reject enrollment invitationcanvas enrollments reactivate- Reactivate enrollment
Submissions Improvements¶
canvas submissions update- Update submissioncanvas submissions summary- Get submission summary
Webhook JWT Verification (Canvas Data Services)¶
- JWT verification support: Use
--canvas-data-servicesflag for Instructure-hosted Canvas instances that use Canvas Data Services - Custom JWK endpoints: Use
--jwks-urlfor custom JWK endpoints - Automatic JWK caching: Public keys are cached for 1 hour and refreshed automatically
- Fallback mode: Both JWT and HMAC verification can be enabled simultaneously
Fixed¶
UX Improvements¶
- JSON output for write commands: All create/update/delete commands now properly support
-o jsonoutput format - Rubrics response parsing: Fixed issue where rubrics were wrapped in
{rubric: {...}}envelope - Conversations JSON keys: Fixed duplicate array bracket suffix
[]in JSON request keys - Zero date display: Now shows "Not set" instead of "0001-01-01 00:00:00" for unset dates
- Empty collections: Hidden in output instead of showing
map[]or[] - 404 error messages: Now include descriptive text explaining what resource was not found
- Nested struct display: New
formatStructCompact()for clean display of complex nested structures
Changed¶
- External tools delete now requires
--forceflag for confirmation - Courses create now accepts
--accountas alias for--account-id
[1.4.0] - 2026-01-13¶
Added¶
Authentication Improvements¶
- Automatic OAuth Token Refresh: Access tokens are now automatically refreshed using refresh tokens when they expire, eliminating the need for manual re-authentication
- Instance Config Lookup:
canvas auth login --instance <name>now automatically loads the URL and OAuth credentials from your config file - Positional Instance Name:
canvas config addnow accepts instance name as a positional argument:canvas config add production --url https://canvas.example.com
Table Output Improvements¶
- Compact Table Output: Default table output now shows only key fields for cleaner display
- Verbose Mode: Use
-v/--verboseflag to see all fields in table output - Improved Field Selection: Key fields are optimized for each resource type (Course, User, Assignment, etc.)
- Instance Name Support: The
--instanceflag now accepts instance names (not just URLs)
Changed¶
canvas config add <name> --url <url>syntax replacescanvas config add --name <name> --url <url>- Table formatter now uses structured formatters instead of custom display functions
- Removed "Found X items:" messages in compact (non-verbose) mode
Fixed¶
- Pre-commit hook now includes golangci-lint for catching lint issues before push
- Removed unused display functions that were causing lint warnings
- Documentation updated to reflect correct CLI syntax and behavior
Developer Experience¶
- Pre-commit Linting: Added golangci-lint to pre-commit hook for early lint error detection
- Documentation Accuracy: Fixed documentation to match actual CLI behavior (sync command syntax, environment variables, flags)
[1.1.0] - 2026-01-10¶
Added¶
Commands - Modules¶
canvas modules list- List modules in a coursecanvas modules get- Get module detailscanvas modules create- Create new modulecanvas modules update- Update modulecanvas modules delete- Delete modulecanvas modules relock- Relock module progressionscanvas modules items- List items in a modulecanvas modules items get- Get module item detailscanvas modules items create- Create module itemcanvas modules items update- Update module itemcanvas modules items delete- Delete module itemcanvas modules items done- Mark module item as donecanvas modules items not-done- Mark module item as not done
Commands - Pages¶
canvas pages list- List wiki pages in a coursecanvas pages get- Get page by URL or IDcanvas pages front- Get front pagecanvas pages create- Create new pagecanvas pages update- Update existing pagecanvas pages delete- Delete pagecanvas pages duplicate- Duplicate pagecanvas pages revisions- List page revisionscanvas pages revert- Revert to specific revision
Commands - Discussions¶
canvas discussions list- List discussion topicscanvas discussions get- Get discussion detailscanvas discussions create- Create new discussioncanvas discussions update- Update discussioncanvas discussions delete- Delete discussioncanvas discussions entries- List discussion entriescanvas discussions post- Post new entrycanvas discussions reply- Reply to entrycanvas discussions subscribe- Subscribe to topiccanvas discussions unsubscribe- Unsubscribe from topic
Commands - Announcements¶
canvas announcements list- List course announcementscanvas announcements get- Get announcement detailscanvas announcements create- Create new announcementcanvas announcements update- Update announcementcanvas announcements delete- Delete announcement
Commands - Calendar¶
canvas calendar list- List calendar eventscanvas calendar get- Get event detailscanvas calendar create- Create new eventcanvas calendar update- Update eventcanvas calendar delete- Delete eventcanvas calendar reserve- Reserve time slot
Commands - Planner¶
canvas planner items- List planner itemscanvas planner notes list- List planner notescanvas planner notes get- Get note detailscanvas planner notes create- Create planner notecanvas planner notes update- Update notecanvas planner notes delete- Delete notecanvas planner complete- Mark item as completecanvas planner dismiss- Dismiss item from plannercanvas planner overrides- List planner overrides
Testing¶
- Added comprehensive tests for all new API services
- Tests for Modules, Pages, Discussions, Announcements, Calendar, and Planner
- All tests passing with consistent patterns
Version History¶
- 1.5.0 (2026-01-14) - Major feature release
- 70+ new write commands across all Canvas API resources
- JWT verification for Canvas Data Services webhooks
- Comprehensive UX improvements and bug fixes
- 1.4.0 (2026-01-13) - Feature release
- Automatic OAuth token refresh
- Instance config lookup for auth login
- Improved table output with verbose mode
- 1.1.0 (2026-01-10) - Feature release
- Modules, Pages, Discussions, Announcements, Calendar, Planner commands
- Comprehensive API coverage for course content management
- 1.0.0 (2026-01-09) - Initial production release
- All v1.0 scope features complete
- 90% test coverage achieved
- Production-ready and stable
For more details on each change, see the commit history.
For planned features and roadmap, see the Unreleased section above.