dotnet/csharplang
The official repo for the design of the C# programming language
Missing license — unclear to depend on
worst of 4 axesno license — legally unclear; no tests detected…
no license — can't legally use code; no tests detected…
Documented and popular — useful reference codebase to read through.
no license — can't legally use code; no CI workflows detected
- ✓Last commit 2d ago
- ✓10 active contributors
- ✓Distributed ownership (top contributor 41% of recent commits)
Show 3 more →Show less
- ⚠No license — legally unclear to depend on
- ⚠No CI workflows detected
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: publish a permissive license (MIT, Apache-2.0, etc.)
- →Fork & modify Concerns → Mixed if: add a LICENSE file
- →Deploy as-is Concerns → Mixed if: add a LICENSE file
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Great to learn from" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/dotnet/csharplang)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/dotnet/csharplang on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: dotnet/csharplang
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/dotnet/csharplang shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Missing license — unclear to depend on
- Last commit 2d ago
- 10 active contributors
- Distributed ownership (top contributor 41% of recent commits)
- ⚠ No license — legally unclear to depend on
- ⚠ No CI workflows detected
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live dotnet/csharplang
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/dotnet/csharplang.
What it runs against: a local clone of dotnet/csharplang — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in dotnet/csharplang | Confirms the artifact applies here, not a fork |
| 2 | Default branch main exists | Catches branch renames |
| 3 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 4 | Last commit ≤ 32 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of dotnet/csharplang. If you don't
# have one yet, run these first:
#
# git clone https://github.com/dotnet/csharplang.git
# cd csharplang
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of dotnet/csharplang and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "dotnet/csharplang(\\.git)?\\b" \\
&& ok "origin remote is dotnet/csharplang" \\
|| miss "origin remote is not dotnet/csharplang (artifact may be from a fork)"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 4. Critical files exist
test -f "README.md" \\
&& ok "README.md" \\
|| miss "missing critical file: README.md"
test -f "Design-Process.md" \\
&& ok "Design-Process.md" \\
|| miss "missing critical file: Design-Process.md"
test -f "Language-Version-History.md" \\
&& ok "Language-Version-History.md" \\
|| miss "missing critical file: Language-Version-History.md"
test -f ".github/ISSUE_TEMPLATE/proposal_template.md" \\
&& ok ".github/ISSUE_TEMPLATE/proposal_template.md" \\
|| miss "missing critical file: .github/ISSUE_TEMPLATE/proposal_template.md"
test -f "CODE-OF-CONDUCT.md" \\
&& ok "CODE-OF-CONDUCT.md" \\
|| miss "missing critical file: CODE-OF-CONDUCT.md"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 32 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~2d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/dotnet/csharplang"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
This is the official C# language design repository where new language features are proposed, debated, and specified before implementation. It serves as the single source of truth for C# language evolution, containing feature proposals, Language Design Meeting (LDM) notes dating back to 2013, and the formal design process documentation. The repository bridges language designers and the Roslyn compiler implementation team to guide C# development across major versions. Tree structure: top-level folders for meetings/ (organized by year, containing LDM-YYYY-MM-DD.md notes), proposals/ (active feature designs), and key governance docs (Design-Process.md, CODE-OF-CONDUCT.md, Language-Version-History.md). GitHub Issues and Discussions are the primary collaboration mechanism; proposals graduate from Discussion → championed Issue → formal proposal PR → LDM decision.
👥Who it's for
C# Language Design Team members, language enthusiasts wanting to influence C# evolution, compiler engineers at Microsoft working on Roslyn, and open-source contributors interested in understanding why specific C# features exist and how they were decided. Users propose features via Discussions and only submit formal proposals when championed by LDM members.
🌱Maturity & risk
Highly mature and actively maintained as the official Microsoft C# design repository. The meeting notes span 10+ years (2013-present based on file structure), indicating long-term institutional commitment. This is production-grade governance infrastructure, not experimental code—it directly informs shipping C# versions in dotnet/roslyn.
Standard open source risks apply.
Active areas of work
The repository is actively tracking C# feature development with recent meeting notes (file structure shows 2015-2016 meetings visible). Discussions are the current primary venue for community input on proposed features. Specific active areas depend on current C# version development cycle—check the proposals/ folder and open Discussions for cutting-edge features under consideration.
🚀Get running
Clone the repository and review the design process: git clone https://github.com/dotnet/csharplang.git && cd csharplang. Read README.md for overview, then Design-Process.md to understand the governance model. Browse meetings/ to see how decisions are documented, and check proposals/ for active feature designs. No local build required—this is documentation-first.
Daily commands:
No build or runtime. To contribute: fork, edit .md files, commit with clear messages, and submit PR. For discussion participation: navigate to Discussions tab on GitHub, read existing topics in relevant proposal categories, and open a new Discussion if your idea is novel. All contribution guidance is in Design-Process.md.
🗺️Map of the codebase
README.md— Entry point explaining the repo's purpose, structure, and how to contribute new C# language features.Design-Process.md— Documents the formal process for proposing and adopting new C# language features, essential for understanding governance.Language-Version-History.md— Chronicles all C# language versions and their features, providing historical context for design decisions..github/ISSUE_TEMPLATE/proposal_template.md— Template and guidelines for submitting new feature proposals, the primary contribution mechanism for this repo.CODE-OF-CONDUCT.md— Community standards and expectations for all contributors participating in language design discussions.Communities.md— Lists C# community channels and discussion forums where language design feedback originates.
🧩Components & responsibilities
- GitHub Issues & Discussions (GitHub) — Primary intake mechanism for feature proposals and community feedback
- Failure mode: Proposal gets lost or duplicated if not properly triaged and labeled
- Language Design Team (Markdown, GitHub, synchronous meetings) — Evaluates proposals, makes design decisions, and documents outcomes
- Failure mode: Proposal stalls if team consensus cannot be reached or meetings are delayed
- Proposal Documentation (Markdown files in proposals folder) — Formal specification and tracking of approved language features under design
- Failure mode: Proposal spec becomes outdated if not synchronized with actual implementation progress
- Meeting Notes Archive (Markdown files in meetings folder organized by year) — Permanent record of design decisions, rationales, and rejected ideas
- Failure mode: Historical context lost if notes are incomplete or inconsistently formatted
🔀Data flow
Community member→GitHub Issues— Submit feature proposal as discussion issueGitHub Issues→Design-Process.md— Team checks proposal against formal design process requirementsDesign team→meetings/<year>/ (e.g., LDM-2017-01-10.md)— Document feature review, discussion, and consensus in meeting notesApproved proposal→proposals folder— Create formal specification document for features passing LDM reviewImplemented feature→Language-Version-History.md— Add finalized feature to language version history once shippedproposals & meeting notes→dotnet/roslyn repository— Language design specifications inform compiler implementation
🛠️How to make changes
Propose a New C# Language Feature
- Read the Design-Process.md to understand the formal proposal lifecycle (
Design-Process.md) - Use the proposal template from .github/ISSUE_TEMPLATE to structure your idea (
.github/ISSUE_TEMPLATE/proposal_template.md) - Submit your proposal as a GitHub issue with label 'Discussion' to gather community feedback (
README.md) - Create a markdown file in the proposals folder once consensus is reached, documenting the feature specification (
proposals)
Document Language Design Meeting Outcomes
- Attend or review the relevant year's Language Design Team meeting (
meetings/2017) - Create a new markdown file following the naming convention LDM-YYYY-MM-DD.md in the appropriate year folder (
meetings) - Document decisions, proposals discussed, and consensus reached using the format from existing meeting notes (
meetings/2017/LDM-2017-01-10.md)
Contribute to Language Version History
- Review the current Language-Version-History.md to understand the format and structure (
Language-Version-History.md) - Add entries for new features under the appropriate C# version section (
Language-Version-History.md) - Link to relevant proposal documents in the proposals folder (
proposals)
🔧Why these technologies
- GitHub Issues & Discussions — Central hub for community feedback and collaborative design of language features
- Markdown documentation — Version-controllable, human-readable format for capturing design decisions and meeting notes
- Git repository structure — Enables tracking of design evolution over time with full history and branch-based proposals
⚖️Trade-offs already made
-
Use markdown files instead of a formal database/wiki
- Why: Keeps design history in Git for version control and transparency
- Consequence: Requires manual maintenance and organization; harder to query across documents
-
Centralized Language Design Team review process
- Why: Ensures consistency and strategic alignment in language evolution
- Consequence: Slower iteration; proposals must go through formal discussion phases before implementation
-
Public meeting notes and design decisions
- Why: Builds community trust and allows wider input into language direction
- Consequence: Design discussions are visible and subject to public scrutiny; decisions must be well-justified
🚫Non-goals (don't propose these)
- Does not implement language features—only documents design decisions (implementation occurs in dotnet/roslyn)
- Not a real-time design forum—formal design meetings happen periodically, not continuously
- Does not provide language runtime or compilation—this is a design and specification repository only
📊Code metrics
- Avg cyclomatic complexity: ~4 — Repo contains formal design documentation with intricate language specification details, but structure is straightforward; complexity is in content, not code organization
- Largest file:
meetings/2017/ (directory with ~50+ individual meeting files)(2,000 lines) - Estimated quality issues: ~2 — Primarily documentation with minimal code; issues are organizational (some inconsistency in meeting note structure and proposal status tracking)
⚠️Anti-patterns to avoid
- Orphaned proposals with no follow-up (Medium) —
proposals folder: Proposals that reach a certain stage but have no updates or clear status, creating uncertainty about viability - Inconsistent meeting note formatting (Low) —
meetings/<year>/ files: Some meeting notes lack clear decision summaries or use varying documentation styles, making historical analysis difficult - Design decisions not linked to implementation (Medium) —
proposals & meetings folders: Design decisions documented here may diverge from actual implementation in dotnet/roslyn if synchronization is poor
🔥Performance hotspots
Language Design Team review process(Process/Scheduling) — Proposals must wait for LDM meetings to be scheduled and discussed; no continuous review processConsensus-building phase(Decision making) — Features requiring significant architectural changes may remain in discussion for extended periodsManual proposal maintenance(Operational overhead) — Proposal status and progress must be manually tracked; no automated tracking system visible
🪤Traps & gotchas
The main trap: Do not submit a proposal as an Issue or PR without explicit LDM champion invitation—the README explicitly states this will be rejected. Discussions phase is mandatory for all new ideas. Also: LDM decisions are final and documented in meeting notes; if your feature idea was discussed years ago and rejected, that decision is already made (check meeting notes before opening a Discussion). No hidden environment variables or local config needed.
🏗️Architecture
💡Concepts to learn
- Language Design Meeting (LDM) Process — Understanding the formal governance process (champion → proposal → LDM review → decision) is essential; it explains why your feature idea needs to follow strict submission rules and how decisions are made collectively.
- Feature Champion Role — Only LDM-approved champions can move proposals forward; knowing what a champion does (shepherds design, handles feedback, mediates trade-offs) explains why casual PRs are rejected and why you need buy-in before submitting.
- Backward Compatibility and Language Versioning — C# uses explicit language versions (C# 7.0, 8.0, etc.) to avoid breaking existing code; proposals must address compatibility concerns. Understanding this prevents suggesting features that would break existing programs.
- Design Trade-offs in Language Features — LDM notes repeatedly show decisions balancing readability, performance, implementation complexity, and compiler burden; learning to think in trade-offs (not just 'is this cool?') is how language design works.
- Roslyn Analyzer vs Language Feature Distinction — Not every idea needs a language feature; the README notes that syntax prohibition can be achieved with Roslyn analyzers instead. Understanding this distinction prevents proposing features that should be linting rules.
- Specification-Driven Language Evolution — C# is standardized (ECMA-334); proposals must map to spec changes. This repo's formal process ensures language stability and prevents ad-hoc evolution that could fragment the ecosystem.
🔗Related repos
dotnet/roslyn— The C# compiler implementation; implements the features designed in csharplang. When an LDM proposal is approved, it moves to Roslyn for implementation.dotnet/csharpstandard— Official C# language specification (ECMA standard); csharplang proposals eventually become sections in this spec once finalized by LDM.dotnet/runtime— Core .NET runtime; many C# language features (e.g., nullable reference types, records) require runtime support coordinated with csharplang design.dotnet/csharplang-proposals— Historical archive of older proposal submissions before the current Discussions-based workflow; useful for understanding how past features were proposed.
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Create a comprehensive index/glossary document for C# language features across versions
The repo has extensive meeting notes (2013-2017+) and proposals, but lacks a centralized feature index that maps language features to their introduction version, meeting discussions, and proposal documents. This would help contributors and users quickly navigate the design history. A new Feature-Index.md file would cross-reference features like nullable reference types, pattern matching, records, etc. to their relevant design meetings and proposals.
- [ ] Analyze meeting notes in meetings/ folder (2013-2017+) to extract major feature decisions
- [ ] Review proposals/ folder structure to identify all active and adopted proposals
- [ ] Create Feature-Index.md with columns: Feature Name, C# Version, Status, Key Meetings, Proposal Link, Implementation Notes
- [ ] Link from README.md and Language-Version-History.md to the new index
Add missing LDM meeting notes organization for recent years (2017-present)
The file structure shows meetings only up to early 2017 (CLR-2017-03-23.md), but the repo clearly continues having design meetings. There's a gap in documented meeting notes that should be filled. Contributors need visibility into recent design decisions. Create README files and organize meetings by year similar to the 2013-2016 structure.
- [ ] Check git history or issues to identify meeting dates from 2017-present that lack documentation
- [ ] Create meetings/2017/README.md, meetings/2018/README.md, etc. with consistent structure matching meetings/2016/README.md
- [ ] Add LDM meeting notes for documented decisions (e.g., nullable reference types, records, patterns) following the existing LDM-YYYY-MM-DD.md naming convention
- [ ] Update meetings/README.md or main README.md to reflect complete meeting history
Create a proposal maturity tracking document and status dashboard
The repo has a proposals folder but lacks a central document tracking which proposals are active, implemented, rejected, or deferred. This would provide clarity for contributors on the status of ideas and prevent duplicate proposals. A Proposals-Status.md file would help contributors understand the proposal lifecycle process defined in Design-Process.md and current state of all proposals.
- [ ] Review Design-Process.md to understand the proposal lifecycle stages (New, Under Review, Adopted, Implemented, Rejected, Deferred)
- [ ] Audit all proposal files in proposals/ folder and categorize by status based on meeting notes and git history
- [ ] Create Proposals-Status.md with a table: Proposal Name, Champion, Current Status, Target Version, Last Update Date, Meeting Notes Link
- [ ] Add a section in README.md linking to this status document and explaining how to track proposal progress
🌿Good first issues
- Review and improve meeting note summaries: Some early meeting notes (e.g., meetings/2013-2014) are terse. Volunteer to convert 2-3 LDM notes into more detailed write-ups with decision rationale, trade-offs, and links to related discussions. This requires zero C# compiler knowledge and helps future readers.
- Propose a Discussion summarizing the evolution of a specific feature: Pick a feature in Language-Version-History.md (e.g., 'async/await', 'pattern matching', 'nullable reference types'), trace its design decisions across multiple LDM notes, and create a Discussion post documenting the design journey. This teaches you the process while adding institutional knowledge.
- Create a proposal index: Build a simple
.mdfile mapping proposal categories (e.g., 'Type System', 'Syntax Sugar', 'Performance') to files in theproposals/folder. This helps new contributors navigate and understand feature clustering. Submit as a PR once you have write permission.
⭐Top contributors
Click to expand
Top contributors
- [@Cyrus Najmabadi](https://github.com/Cyrus Najmabadi) — 41 commits
- @MadsTorgersen — 15 commits
- @jnm2 — 11 commits
- @RikkiGibson — 10 commits
- @CyrusNajmabadi — 8 commits
📝Recent commits
Click to expand
Recent commits
4790b84— Add answers to closed class questions, and add new questions (#10169) (RikkiGibson)63ee1cf— Update agenda (RikkiGibson)3613750— add another question (RikkiGibson)6e97de3— Add more open questions (RikkiGibson)d17b8a6— Update open questions per LDM decisions (RikkiGibson)06bb159— Partial extension members: initial proposal (#10126) (jcouv)b427b88— Unsafe evolution speclet: incorporate decisions from LDM 2026-04-29 (#10165) (jjonescz)6a386d3— Unsafe evolution speclet: add question aboutAllowUnsafeBlocks(#10157) (jjonescz)0952698— Revise April 29, 2026 meeting agenda (MadsTorgersen)406b0e6— Create LDM-2026-04-29.md (#10160) (MadsTorgersen)
🔒Security observations
The dotnet/csharplang repository is a documentation and design repository with minimal security risk. It contains language design documents, meeting notes, and proposals rather than executable code, package dependencies, or infrastructure configurations. No hardcoded secrets, injection vulnerabilities, insecure dependencies, or misconfigurations were identified. The repository follows best practices with appropriate use of .gitignore and .gitattributes. The only minor observations are standard for documentation repositories and do not constitute security vulnerabilities.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.