Thank you for considering a contribution to ArkEnv! As an open source project, ArkEnv welcomes contributions of all kinds.
Human and agent-assisted contributions are equally welcome here. Whether you write every line by hand or lean on an AI agent, you're a first-class contributor, and a human maintainer reviews every pull request before it lands.
To help you find work, triaged issues carry a readiness label:
ready for agent- Fully specified and ready for immediate implementation. Pick it up yourself or hand it to an agent; the requirements are clear enough to start coding right away.ready for human- Needs a judgment call or design decision before implementation. These aren't off-limits, they just want a person to weigh in on direction first.
Don't let the label names give you the wrong impression: ready for agent simply means "ready to build," not "reserved for bots." Feel free to grab either kind of issue.
-
curl -fsSL https://get.pnpm.io/install.sh | sh -(Or follow the instructions in the pnpm docs)
-
git clone https://github.com/yamcodes/arkenv.git cd arkenv -
pnpm install
-
pnpm www
This starts a single
next devserver at http://localhost:3000. Docs videos use next-video: add files toapps/www/videos/, then run a one-shotnext-video sync(pnpm --filter www video:sync, or restartpnpm wwwsopredevruns it). Commit the generatedvideos/*.jsonfiles. Do not runnext-video sync -wbesidenext dev— that races Next.js 16.2's lock.
- Fork the repository and create your branch from
dev - If you've added code that should be tested, add tests
- Ensure the test suite passes
- Update the documentation if needed
- Create a changeset for your changes:
This will prompt you to:
pnpm changeset
- Select which packages you want to release
- Choose the type of version bump (major/minor/patch)
- Provide a summary of the changes
- Commit the generated changeset file along with your changes
- Issue that pull request!
We do not use Conventional Commits (feat:, fix:, chore:, etc.). Instead, we write commit messages and PR titles in plain sentence-case imperative style:
- Start with a capital letter
- Use the imperative mood ("Add", "Fix", "Update", not "Added" or "Adds")
- Keep the rest of the message in normal sentence case (not ALL CAPS or Title Case)
- No trailing period
Examples:
✅ Add support for custom error messages
✅ Fix type inference for optional variables
✅ Update README with Bun integration example
❌ feat: add support for custom error messages
❌ added support for custom error messages
❌ Add Support For Custom Error Messages
We use a Dual-Branch Model (dev and main) to ensure the production documentation site is strictly synchronized with npm releases, meaning it never displays unreleased features. For the architectural reasoning behind this decision, see ADR 0006: Branching and Release Flow.
┌───────────────┐
│ Feature PRs │
└───────┬───────┘
▼
┌───────────┐
│ dev │ (Default branch / Previews)
└─────┬─────┘
│ (Changeset version PR merged & published)
▼
┌───────────┐
│ main │ (Production docs / Vercel prod)
└───────────┘
When adding functionality or new documentation pages for unreleased code:
- Create a feature branch off
dev. - Commit your code and run
pnpm changesetto generate a version bump file. - Open a Pull Request targeting
dev. - Merging to
devwill deploy a Vercel Preview (for review), but it will not affect the production documentation site.
When you are ready to publish the unreleased features currently sitting on dev:
- Navigate to the automatically generated "Version Packages" PR (created by Changesets) targeting
dev. - Review the aggregated
CHANGELOG.mdand version bumps. - Merge the "Version Packages" PR into
dev. - A GitHub workflow will automatically build and publish the packages to npm.
- Immediately after a successful publish, the workflow automatically fast-forwards the
mainbranch to matchdev. This push tomaintriggers the production documentation deploy.
When you need to fix a typo or make a cosmetic change to the live documentation without publishing a new npm package:
- Do not use the standard
devfeature workflow (otherwise your typo fix will be trapped indevuntil the next npm release). - Ask your AI Agent to invoke the
/sync-mainslash command, or manually run thesync-mainskill. - If
devis clean (no unreleased features): Merge your doc fix todev, then run theSync mainGitHub workflow to fast-forwardmain. - If
devhas unreleased features: Use the script locally to cherry-pick your fix:This ensures the fix hits./scripts/sync-main.sh rescue <commit-hash> ./scripts/sync-main.sh reconcile
maininstantly while preventing Git history drift.
When working on a massive marketing push, docs facelift, or breaking API changes that will take weeks or months to coordinate:
- Create a long-lived branch: Branch off
devand name itnextorv1. - Develop in parallel: Merge all breaking code and marketing doc updates into
v1. Meanwhile, you can continue merging normal bug fixes and minor features intodevand releasing them tomainas usual. - Immediate Forward-Porting (Dual-Tracking) to Prevent Drift: Due to structural differences in
v1(like renamingpackages/clitopackages/arkenvand moving source code around), standard git merges ofdevintov1will cause severe tree conflicts. Instead, we use a Feature-Driven Forward-Porting workflow:- Develop against dev/v0: All new features and bugfixes are first built and merged into the
devbranch. - Immediate manual porting: Once a PR is merged into
dev, the maintainer will manually forward-port the changes tov1, adapting the code to the new directory structure (e.g. underpackages/arkenv/src/instead ofpackages/cli/src/). - Update Changesets: During the porting process, the maintainer will copy the changeset to the
v1branch and manually update the YAML package name in the frontmatter to match the renamed package (e.g., change"cli": patchto"arkenv": patch).
- Develop against dev/v0: All new features and bugfixes are first built and merged into the
- Previews & Betas: Pushes to
v1deploy the docs via GitHub Actions (Vercel CLI) and aliashttps://arkenv-v1.vercel.appfor marketing review. To safely publish pre-release npm packages from this branch (e.g.,1.0.0-next.0) without affecting thelatestnpm tag, initialize Changesets pre-release mode on thev1branch by runningpnpm changeset pre enter next. As you writemajorchangesets for your breaking changes, they will be published under thenexttag. - The Big Release: When Launch Day arrives, merge
v1intodev. Then, runpnpm changeset pre exitto graduate from thenextpre-release phase to stable. The standard Use Case 2 workflow takes over, producing a final "Version Packages" PR that publishes1.0.0to thelatesttag and fast-forwardsmain.
PR previews for the www app are opt-in. A maintainer (triage+) applies the preview label to trigger a Vercel preview deployment when the label is added, and again on subsequent synchronize / ready_for_review events while the label remains (a preview is only produced when the www app is actually affected). This works for same-repo and fork PRs; fork authors cannot self-serve the label.
Pushes to dev or v1 always deploy via GitHub Actions (Vercel CLI). Those deploys pass git metadata and alias the rolling branch domains (https://arkenv-dev.vercel.app, https://arkenv-v1.vercel.app) so the domains stay current without relying on native Vercel Git builds. Labeled PR previews keep ephemeral deployment URLs and do not take over those branch domains.
To redeploy an older commit to a stable URL without moving the branch, maintainers can run Actions → Deploy www (manual SHA) and choose arkenv-dev.vercel.app, arkenv-v1.vercel.app, or production arkenv.js.org.
Changesets is used to manage versions and changelogs. Each PR that makes changes to the functionality of the package should include a changeset.
To create a changeset:
- Run
pnpm changeset - Follow the prompts to describe your changes
- Commit the generated
.changeset/*.mdfile
The changeset will be automatically used to bump versions and update the changelog when your PR is merged.
We use the All Contributors specification to recognize all contributions.
If you've contributed to the project, please add yourself! We have a bot setup to make this easy. You can comment on your Pull Request or Issue with:
@all-contributors please add @<your-username> for <contributions>
For example:
@all-contributors please add @yamcodes for code, doc
For a full list of contribution types and more details on how to use the bot, please refer to the bot usage documentation.
By contributing your code to the ArkEnv GitHub repository, you agree to license your contributions under the MIT License.