Canvas
openclaw/openclaw
Present hosted widget documents on a connected macOS panel and control panel visibility or navigation.
Use after first-run Canvas setup or when the user asks which recurring Canvas work should become the first durable course skill.
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-skill-opportunity -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-skill-opportunity --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/canvas-skill-opportunity .claude/skills/canvas-skill-opportunity && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "canvas-skill-opportunity" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-skill-opportunity into .claude/skills/canvas-skill-opportunity/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-skill-opportunity", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-skill-opportunityType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-skill-opportunity -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-skill-opportunity --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/canvas-skill-opportunity .agents/skills/canvas-skill-opportunity && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "canvas-skill-opportunity" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-skill-opportunity into .agents/skills/canvas-skill-opportunity/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-skill-opportunity", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-skill-opportunity -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-skill-opportunity --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/canvas-skill-opportunity .cursor/skills/canvas-skill-opportunity && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "canvas-skill-opportunity" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-skill-opportunity into .cursor/skills/canvas-skill-opportunity/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-skill-opportunity", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/X-isdoingreat/canvas-pilot.git --path .agents/skills/canvas-skill-opportunity--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-skill-opportunity -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-skill-opportunity --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/canvas-skill-opportunity .gemini/skills/canvas-skill-opportunity && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "canvas-skill-opportunity" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-skill-opportunity into .gemini/skills/canvas-skill-opportunity/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-skill-opportunity", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install X-isdoingreat/canvas-pilot canvas-skill-opportunityInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-skill-opportunity -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/canvas-skill-opportunity .github/skills/canvas-skill-opportunity && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "canvas-skill-opportunity" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-skill-opportunity into .github/skills/canvas-skill-opportunity/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-skill-opportunity", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-skill-opportunity -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-skill-opportunity --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/canvas-skill-opportunity .opencode/skills/canvas-skill-opportunity && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "canvas-skill-opportunity" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-skill-opportunity into .opencode/skills/canvas-skill-opportunity/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-skill-opportunity", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
canvas-skill-opportunityUse after first-run Canvas setup or when the user asks which recurring Canvas work should become the first durable course skill.
Canvas Skill Opportunity is an agent skill from X-isdoingreat/canvas-pilot. Use after first-run Canvas setup or when the user asks which recurring Canvas work should become the first durable course skill. Inspect representative real specifications and Canvas feedback policy, make a qualitative Agent judgment, write a private opportunity report, and stop for the user's choice.
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).
The repository describes itself as: Local-first Canvas LMS AI agent that learns each course's recurring assignment workflow and reuses it through scan - approval - execute with student review. The licence is AGPL-3.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 6b79d5b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are python and json).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Canvas Skill Opportunity loads about 3.6k tokens when it runs. Until then it costs about 82 tokens; SKILL.md has 1,561 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from X-isdoingreat/canvas-pilot at commit 6b79d5b, republished under its AGPL-3.0 licence (© X-isdoingreat). 1,561 words, ~3,614 tokens.
.claude/skills/canvas-skill-opportunity/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Choose the best first durable workflow, not merely the easiest-looking assignment. This is an Agent judgment protocol. Deterministic code may discover recurrence and project private data, but it must not decide the recommendation.
canvas-setup verifies authentication and finds no ready routes,
or when the user explicitly asks for skill opportunities.runs/<today>/skill-opportunities.jsonruns/<today>/skill-opportunities.md.claude/ read-only.canvas-scan, canvas-execute, or a course-solving skill.canvas-bootstrap design check; it does not authorize assignment submission.Read AGENTS.md, courses.yaml, and setup state. Verify Canvas authentication
if it has not been verified in this session. Before inspecting course data, say:
I will read recurring assignment instructions and Canvas feedback settings to
recommend one reusable workflow. I will not do work, start an attempt, upload,
submit, or create a skill.Before writing, verify runs/ is gitignored. Stop if it is not.
Use the existing factual helpers:
from src import canvas_client as cv
from src.opportunity_evidence import derive_quiz_feedback_capabilities
from src.recurring_patterns import bucket_recurring, is_course_activeFor each active course, call cv.list_assignments_for_opportunity(course_id)
once, apply the existing 7-day term grace period, and call
bucket_recurring(items, min_freq=3). The dedicated list helper excludes
student submission state. Retain the assignment IDs belonging to each returned
bucket, future occurrence count, known future points, and current route
coverage. These are evidence and later tie-breakers, not a verdict.
Do not infer task family, response length, or suitability from course name,
assignment title, or submission_types alone. A Canvas upload may be code, a
Word accounting worksheet, or a long essay; discovery cannot tell which.
For each plausible recurring bucket, use
cv.get_assignment_spec_for_opportunity(course_id, assignment_id) to read
enough representative assignments to establish whether the response
pattern repeats. This helper returns an allowlisted real-spec projection and
does not request a submission include:
insufficient_evidence.Do not replace this helper with generic get_assignment, which requests an
embedded submission object. If another source unexpectedly embeds student
state, project it away before the Agent inspects or stores the specification.
Record derived facts, IDs, and source locations in the private report; do not copy full bodies, rubric text, or attachment contents into it. Never read or retain a student's prior answer content for task classification.
Extract these facts:
Treat the following as strong first-skill candidates when their response pattern repeats and their inputs and Canvas delivery path are reachable:
Use response shape, not aggregate word count. Twenty independent annotations of 10-20 words remain a strong candidate even though their combined total may exceed 200 words. Conversely, a main or central continuous prose unit around 200 words or more is a strong default demoter for the first skill because voice, coherence, and review cost compound. This is not a mechanical universal hard gate: ancillary prose in a code, accounting, or quantitative deliverable must not make the central task look like an essay.
Long essays, research prose, personal reflection, and creative writing usually
belong in assist_only. Required external-site interaction, live performance,
physical work, proctoring, or group participation is unsupported unless an
already-verified Canvas Pilot path can complete the whole required deliverable.
Identify reasonable checks without demanding an external validator:
Formal tests improve confidence but are not an eligibility gate. Long code without supplied tests stays strong when its specification, inputs, and Canvas submission path are complete.
For quizzes and other retryable work, separately establish:
allowed_attemptskeep_highest, latest, average, or unknown)Use derive_quiz_feedback_capabilities(quiz) on static Canvas settings first;
it is a pure interpreter and never calls Canvas or starts an attempt. If an
already-completed sibling assignment can provide observed evidence, call only
cv.get_submission_feedback_observation_for_opportunity(course_id, assignment_id). That dedicated wrapper may inspect the existing submission
internally, but it returns only a minimal Boolean/enum projection. It must not
expose or retain raw prior answers, answer IDs, exact grades or scores,
feedback text, or submission payloads. A projected own_response.record_present
means only that a response record existed; it does not prove the student
can view its contents. Keep own-answer visibility unknown unless separate
safe evidence establishes it. If no safe projector exists, do not inspect the
raw record: leave the capability unknown.
Label feedback evidence observed, declared, inferred, or unknown.
Do not turn declared visibility into observed visibility. Two or more
attempts plus useful feedback before retry plus keep_highest strongly
promotes an otherwise suitable, mostly objective quiz. Merely allowing another
attempt without timely useful feedback does not receive the same promotion.
Never launch an attempt to discover any of these facts.
Assign exactly one tier:
best_first_skill: strongest complete, repeatable, high-fit opportunitygood_candidate: suitable and reusable, but not the best first investmentlater_candidate: plausible, with material uncertainty or extra review costassist_only: Agent assistance is useful, but the central deliverable should
not be the first end-to-end skillunsupported: required delivery includes an unhandled external, live,
physical, group, or proctored componentinsufficient_evidence: real specs, materials, stability, or feedback facts
are too incomplete to judge honestlyJudge in this order:
Within otherwise suitable tiers, use recurrence, scheduled future count, known future points, and likely time saved to break ties. Missing points stay unknown. Do not invent a 0-100 skillability score, grade-leverage score, grade prediction, or precise probability. State evidence, uncertainties, and the reason for the relative ordering.
Write JSON with this concrete shape:
{
"generated_at": "<ISO local time>",
"scope": "read-only real-spec opportunity judgment",
"decision_method": "agent_judgment",
"grade_prediction": false,
"candidates": [
{
"index": 1,
"course_id": "<local only>",
"course_name": "<local only>",
"pattern": "Weekly task <N>",
"tier": "best_first_skill",
"recurrence_count": 8,
"scheduled_future_count": 4,
"scheduled_points_total": 40,
"existing_route": null,
"spec_evidence": {
"sampled_assignment_ids": ["<local only>"],
"source_locations": ["<local only>"],
"stable_response_pattern": true,
"task_family": "objective_quiz",
"primary_deliverable": "Canvas quiz answers",
"central_continuous_prose_words": 0,
"independent_response_units": true,
"inputs_reachable": true,
"canvas_delivery_complete": true
},
"pre_submit_review": ["independent solve", "source cross-check"],
"post_submit_policy": {
"allowed_attempts": 2,
"results_before_retry": true,
"total_score_visible": true,
"item_correctness_visible": true,
"correct_answers_visible": null,
"own_answers_visible": true,
"feedback_timing": "immediate",
"scoring_policy": "keep_highest",
"question_reuse": "unknown",
"evidence_confidence": "observed"
},
"reasons": ["..."],
"demoters": [],
"unknowns": ["question reuse"]
}
]
}Example values illustrate the schema only. Use locally observed facts. Use
null/unknown rather than guessing.
Write Markdown with a compact whitespace table, not a pipe table:
# local alias tier task family recurring future feedback loop strongest evidence demoter/unknownThen include:
Best first skill: one candidate plus 2-4 evidence bullets, or
No eligible first skill when none qualifiesEvidence inspected: representative spec and source pointersWhy not the others: one evidence-based reason per demoted candidateUnknowns: facts that remain unknown rather than inferredBootstrap must still verify: materials, workflow, review steps, and handoffThe private files may contain real local names and IDs. In chat, use only
numbered aliases such as Course 1 / Pattern 1, link to the local Markdown
report, and never paste the private table, course names, IDs, private links, or
assignment examples.
End with exactly one decision prompt in the user's language:
Which number should Canvas Pilot turn into the first durable course skill?Do not invoke canvas-bootstrap in the same turn. After the user selects a
number, pass that candidate and report path to Bootstrap. Bootstrap must still
verify the real materials, repeating workflow, review checks, and delivery
handoff before marking a route ready. If validation fails, offer the next saved
candidate. The choice never authorizes solving or submission.
| Failure | Required behavior |
|---|---|
| Canvas authentication fails | Stop with the exact setup repair step. |
runs/ is not ignored | Stop before writing private course data. |
No bucket reaches min_freq=3 | Report insufficient recurring evidence; do not invent a recommendation. |
| Representative real spec is inaccessible | Use insufficient_evidence; name the missing source. |
| Representative specs disagree | Read more samples; use later_candidate or insufficient_evidence if instability remains. |
| Feedback facts are incomplete | Keep each field unknown; do not award retry promotion. |
| Safe historical projection is unavailable | Do not read a raw submission payload. Use settings-only evidence. |
| Central deliverable is 200+ words of continuous prose | Default to assist_only or later_candidate, with evidence; do not apply a mechanical gate. |
| Required external/live/physical/group/proctored step exists | Use unsupported. |
| Every candidate is covered, unsupported, or insufficient | Write No eligible first skill and stop. |
assignments.json, plan.json, result.json, REPORT.md, or
.scan_in_progress..claude.© X-isdoingreat, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .agents/skills/canvas-skill-opportunity of X-isdoingreat/canvas-pilot.
Open the folder on GitHubat commit 6b79d5b
Canvas Skill Opportunity next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Canvas Skill Opportunity this skillX-isdoingreat/canvas-pilot | 125 | — | ~3.6k | Automated safety check: Pass | AGPL-3.0 | |
| Canvasopenclaw/openclaw | 392k | — | ~263 | Automated safety check: Pass | MIT | |
| Canva Designerasgeirtj/system_prompts_leaks | 69k | — | ~2.1k | Automated safety check: Pass | CC0-1.0 | |
| Plan Canvasaffaan-m/ECC | 277k | 1 repos | ~2.2k | Automated safety check: Pass | MIT | |
| Canvas Designanthropics/skills | 180k | 52 repos | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Canvas AutomationComposioHQ/awesome-claude-skills | 77k | 3 repos | ~727 | Automated safety check: Pass | None |
openclaw/openclaw
Present hosted widget documents on a connected macOS panel and control panel visibility or navigation.
asgeirtj/system_prompts_leaks
Creates and edits Canva designs, generates images and works with brand kits through the canva CLI and Canva's official MCP server, from decks to social posts.
affaan-m/ECC
Open plans and HTML artifacts in a local browser canvas where the human annotates elements, chats, and approves or requests changes without leaving the page.
anthropics/skills
Creates original posters and static art as PNG or PDF by first writing a short design philosophy, then expressing it visually on a canvas.
ComposioHQ/awesome-claude-skills
Automate Canvas tasks via Rube MCP (Composio). An agent skill from ComposioHQ/awesome-claude-skills.
spinabot/brigade
Shows HTML content such as games, dashboards, visualizations and demos on a connected Brigade node's canvas, using a local canvas host server and a node bridge.
X-isdoingreat/canvas-pilot
A skill your agent uses when verified work from today or another day should become an X/Twitter post, build-in-public update, ship log, or bilingual draft.
X-isdoingreat/canvas-pilot
A skill your agent uses when a short local academic draft needs role-aware syntax diversification while preserving meaning, locks, source grounding, rubric-critical openings, and document structure.
X-isdoingreat/canvas-pilot
A skill your agent uses when managing Canvas Pilot schedules: install, inspect, pause, change, delete, or safely test scheduled scans and runs.
X-isdoingreat/canvas-pilot
A skill your agent uses for an approved long academic-writing assignment routed by canvas-execute after the deterministic writing router selects essay.
X-isdoingreat/canvas-pilot
A skill your agent uses for an approved Canvas assignment that no specialized course skill can handle.
X-isdoingreat/canvas-pilot
A skill your agent uses when a local academic draft needs a meaning-preserving humanizing pass with less uniform syntax while retaining rubric, source, lock, voice, and length constraints.
Use after first-run Canvas setup or when the user asks which recurring Canvas work should become the first durable course skill. Canvas Skill Opportunity is an agent skill from X-isdoingreat/canvas-pilot. Use after first-run Canvas setup or when the user asks which recurring Canvas work should become the first durable course skill.
Canvas Skill Opportunity fits situations like: asks which recurring Canvas work should become the first durable course skill.
Run `npx skills add X-isdoingreat/canvas-pilot --skill canvas-skill-opportunity -a claude-code`. Or copy the skill folder (.agents/skills/canvas-skill-opportunity in X-isdoingreat/canvas-pilot) into .claude/skills/canvas-skill-opportunity in your project. Claude Code loads it when a task matches its description.
Run `npx skills add X-isdoingreat/canvas-pilot --skill canvas-skill-opportunity -a codex`. Or copy the skill folder (.agents/skills/canvas-skill-opportunity in X-isdoingreat/canvas-pilot) into .agents/skills/canvas-skill-opportunity in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add X-isdoingreat/canvas-pilot --skill canvas-skill-opportunity -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/canvas-skill-opportunity, .gemini/skills/canvas-skill-opportunity, .github/skills/canvas-skill-opportunity and .opencode/skills/canvas-skill-opportunity in your project.
SKILL.md names no scripts, command-line tools or credentials: Canvas Skill Opportunity is instructions for the agent only. Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Canvas Skill Opportunity is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Canvas Skill Opportunity: Canvas (openclaw/openclaw, 392k stars), Canva Designer (asgeirtj/system_prompts_leaks, 69k stars), Plan Canvas (affaan-m/ECC, 277k stars) and Canvas Design (anthropics/skills, 180k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
X-isdoingreat (a GitHub user) maintains it in X-isdoingreat/canvas-pilot, which has 125 GitHub stars. The repository holds 32 skills in this directory. The repository was last updated on July 31, 2026.
Source: X-isdoingreat/canvas-pilot on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.