Community & good first issues
For contributors who want to open a PR. To use the product, start with the User guide.
Goal: let someone opening their first PR merge a meaningful change within 2 hours, raising contributor retention (the third layer of user value in our vision).
Community entry points
The product surface consistently points to GitHub Issues (questions, ideas, roadmap feedback). Maintainers should keep Issues enabled for the public (Settings → Features → Issues).
Background reading on canvas migration and contributor experience (distilled entry from long-form articles):
- The designer has completed G6 → ReactFlow Strangler (R0–R3); gaps are tracked in Issues — see Roadmap
- How to write a good first Issue / PR: see good-first criteria below; repo root CONTRIBUTING.md
| Label | Meaning |
|---|---|
good first issue | Clear scope, verifiable locally, no deep architecture context needed |
help wanted | External contributors welcome; may be slightly larger |
docs / frontend / backend | Domain |
area:designer / area:share / area:reverse | Sub-domain (optional) |
Issue title suggestion: [good first] <one-line outcome>. Body must include: background / acceptance criteria / verification commands / related files.
Maintainer cadence (biweekly)
- Scan open Issues; tag qualified ones
good first issue(keep 3–8 open) - Once the canonical repo is ready:
REPO=owner/name ./scripts/seed-good-first-issues.sh(drafts in.github/ISSUE_DRAFTS/) - Close the Issue immediately after merge; link back in the PR description
- Call out merged beginner PRs in biweekly release notes (
docs/releases/) - Keep the docs site “Community” page in sync with this checklist (edit this file)
Issue draft seeding rules
- Source files:
.github/ISSUE_DRAFTS/NN-*.md(seeREADME.mdin the same directory) - Skip: blockquotes starting with the zh-CN merged marker blockquote at line start only (see
.github/ISSUE_DRAFTS/README.md; other “merged” text in the body does not skip) - Target: canonical repo always has 3–8 open
good first issueitems - Dry-run:
DRY_RUN=1 REPO=owner/name ./scripts/seed-good-first-issues.sh
What makes a good first task
- Copy edits, add
aria-label/data-testid, fix dead links, add unit test assertions - Clear one eslint warn (with file path)
- Add one E2E journey (reuse existing helpers)
- Documentation examples with copy-paste commands
Not suitable: Security/OAuth changes, projectJSON core structure changes, large canvas protocol changes, vague UX with no repro steps.
Seed task pool (open Issues directly)
Known low-risk debt in the current repo — copy acceptance criteria when opening Issues:
Docs site relative links(repo root paths now use absolute GitHub URLs;./same-dir links indocs/gated byonBrokenLinks=throw)Login/register subtitle removes ChatGPT hype(merged; regression insmoke.spec.ts)(mergedpresence.specproject cleanupdeleteOwnPersonProjects)Collab sync toast E2E(mergedsync-toast.spec.ts; info path)Frontend eslint warn targeted zero (configJsonSlice)(merged; other store files still claimable)(merged)databaseDomainsSliceeslint warn zeroCollab sync warning toast E2E(mergedsync-toast.spec.ts)Backend create project default projectJSON(mergedensureDefaultProjectJson+ unit test)Remove OSS “upgrade to premium” CTA(merged;dialog/upgradedeleted)(merged)exportSliceeslint warn zero(merged)profileSliceeslint warn zero(merged)dataTypeDomainsSliceeslint warn zeroDesigner top bar Gitee star link update(merged → GitHuberdonline/erdonline)Deleted social login path E2E(mergeddead-auth-routes.spec.ts)Footer/ChatSQL remove commercial “Lingdai Tech” copy(merged; footerERD Online · MIT)(merged; warn=0)entitiesSliceeslint zeroDesigner “Project” menu wired(merged; data source settings opens)(merged; draftprojectJsonSliceeslint warn zero06marked done)(merged; draftuseProjectStoreeslint warn zero07marked done)(merged;modulesSliceeslint warn zerosrc/store/projecteslint warn=0)Project menu “Versions” entry(merged: navigates to version management + E2E)Default settings save feedback(merged E2E “Settings saved”; draft10)Version management page skeleton(merged;loading.spec.ts)Model tree delete table confirm E2E(mergedsmokecancel/confirm)Import/export opens modal closes dropdown mask(merged)Delete confirm primary button → “Delete”(merged; E2E matches zh-CN delete label regex)Sidebar and project menu “Versions” narrative aligned(merged)Export DDL wizard button aria-label(merged)ISSUE_DRAFTS README and seed checklist(merged; seed only recognizes the zh-CN line-start merged marker blockquote)Version sort page eslint(merged)canvasHistory remove any(merged)Relation diagram edge hit area(mergedinteractionWidth=24)Export DDL step 2 E2E(merged; ExportDDL aligned with ADR-0008)community seed rules doc(merged this file “Seeding rules”)PK badge toggle E2E(mergedrelation.spec“PK”)Table header rename E2E(mergedrelation.spec“rename”)Version management page eslint(merged)ExportDDL remaining eslint(merged)PageSkeleton aria-busy(merged)json2code entry type narrowing(merged)share.spec cleanup more stable(merged)canvasHistory unit test(mergedyarn test:unit:canvas-history)Project menu closed-state CSS class(mergederd-project-menu--closed)version/approval goto extract helpers(merged; rollback sync persists)CHANGELOG Unreleased cleanup(merged: daily### YYYY-MM-DD+ header maintenance convention; draft32)Control matrix 🚧 rows(P2b matrix 🚧=0; remaining 📋 deferred, no blocking Issues)Canvas “delete field” accessible button(merged;relation.spec“delete field”; draft33)ReactFlow Controls Chinese aria(merged;ZhControls+relation.spec“Controls”; draft34)ReactFlow MiniMap Chinese aria(merged;ariaLabel="Canvas thumbnail"+relation.spec“MiniMap”; draft35)Canvas toolbar undo/redo/layout/align aria(merged;relation.spec“toolbar”; draft36)Top bar SaveStatus aria-live(merged;role="status"+aria-live="polite";relation.spec“save-status”; draft37)Top bar CollabPresence aria-live(merged;role="status"+aria-live="polite";presence.spec; draft38)Command palette listbox semantics(merged;role="listbox"+ empty statearia-live;relation.spec“command palette”; draft39)(merged;lint:js:cishare page Array type + DataDomain hooksyarn lint:js:ci0 error;share.spec)Edit version number validation fail still closes modal(merged;RenameVersiononFinishreturns false on failure;version.spec“rename”)
Seed pool currently empty: a11y micro-slices paused. Word export removed MinIO hard dependency (classpath default template); real Word download E2E can be a separate slice. When seeding the canonical repo, pick new topics outside merged items.
How contributors claim work
- Comment “I’ll take this” on the Issue
- Fork →
feat/...branch → PR with template checked - Paste verification command results in the description per Issue instructions
See CONTRIBUTING.md.