{"id":49236358,"url":"https://github.com/rokbenko/crotomate","last_synced_at":"2026-04-24T16:07:09.932Z","repository":{"id":349731384,"uuid":"1193787363","full_name":"rokbenko/CROtomate","owner":"rokbenko","description":"🟢 #9 CROtomate – Turn websites into self-improving conversion machines","archived":false,"fork":false,"pushed_at":"2026-04-07T09:36:12.000Z","size":107,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-07T10:26:48.028Z","etag":null,"topics":["conversion-rate-optimization","cro","nodejs","typescript"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/crotomate","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rokbenko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-27T15:25:04.000Z","updated_at":"2026-04-07T09:36:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rokbenko/CROtomate","commit_stats":null,"previous_names":["rokbenko/crotomate"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/rokbenko/CROtomate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rokbenko%2FCROtomate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rokbenko%2FCROtomate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rokbenko%2FCROtomate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rokbenko%2FCROtomate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rokbenko","download_url":"https://codeload.github.com/rokbenko/CROtomate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rokbenko%2FCROtomate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32230447,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T13:21:15.438Z","status":"ssl_error","status_checked_at":"2026-04-24T13:21:15.005Z","response_time":64,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["conversion-rate-optimization","cro","nodejs","typescript"],"created_at":"2026-04-24T16:07:09.045Z","updated_at":"2026-04-24T16:07:09.926Z","avatar_url":"https://github.com/rokbenko.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003eCROtomate\u003c/h1\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eYour website optimizes itself while you sleep.\u003c/strong\u003e\n  \u003cbr /\u003e\n  Autonomous conversion rate optimization for any website that auto-deploys from git.\n  \u003cbr /\u003e\n  \u003csub\u003eCRO + automate. Inspired by Karpathy's \u003ca href=\"https://github.com/karpathy/autoresearch\"\u003eautoresearch\u003c/a\u003e.\u003c/sub\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/crotomate\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/crotomate.svg\" alt=\"npm version\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/crotomate\"\u003e\u003cimg src=\"https://img.shields.io/npm/dm/crotomate.svg\" alt=\"npm downloads\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://nodejs.org\"\u003e\u003cimg src=\"https://img.shields.io/badge/node-%E2%89%A518-brightgreen.svg\" alt=\"node version\" /\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"license\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nYou built a landing page. Traffic is coming in. But your conversion rate is stuck at 1.3% and you have no idea why.\n\nCROtomate fixes that. You run one command. It reads your source code, generates a hypothesis (e.g., \"change the CTA from _Get Started_ to _Start Free Trial_\"), rewrites the code, pushes to GitHub, waits for real visitors, measures the impact, and keeps the change if it worked, or reverts it if it didn't. Then it does it again. And again. Forever.\n\nNo A/B testing tools. No manual experimentation. No dashboard staring. Just a CLI that turns your site into a self-improving conversion machine.\n\n```\nnpm install -g crotomate\ncrotomate init\ncrotomate run\n```\n\nThat's it. Go to bed.\n\n---\n\n## Table of contents\n\n- [How it works](#how-it-works)\n- [Quickstart](#quickstart)\n- [What it actually changes](#what-it-actually-changes)\n- [SCOPE.md](#scopemd)\n- [Supported LLM providers](#supported-llm-providers)\n- [Deployment setup](#deployment-setup)\n- [Analytics setup](#analytics-setup)\n- [Commands](#commands)\n- [Configuration reference](#configuration-reference)\n- [How experiments are tracked](#how-experiments-are-tracked)\n- [FAQ](#faq)\n- [Self-hosting on a VPS](#self-hosting-on-a-vps)\n- [Contributing](#contributing)\n\n---\n\n## How it works\n\n```\n    ┌──────────────────────────────────────────────────┐\n    │                                                  │\n    │   1. measure conversion rate (PostHog/Plausible) │\n    │                   │                              │\n    │                   v                              │\n    │   2. LLM proposes ONE hypothesis                 │\n    │                   │                              │\n    │                   v                              │\n    │   3. LLM implements the code change              │\n    │                   │                              │\n    │                   v                              │\n    │   4. git commit + push (triggers auto-deploy)    │\n    │                   │                              │\n    │                   v                              │\n    │   5. wait for N visitors + minimum hours         │\n    │                   │                              │\n    │                   v                              │\n    │   6. CR improved? ── yes ──\u003e KEEP                │\n    │          │                                       │\n    │          no                                      │\n    │          │                                       │\n    │          v                                       │\n    │       git revert + push                          │\n    │                   │                              │\n    │                   v                              │\n    │               loop back to 1                     │\n    │                                                  │\n    └──────────────────────────────────────────────────┘\n```\n\n**Note:** CROtomate runs experiments sequentially (before/after), not as simultaneous A/B splits. It measures the baseline conversion rate, deploys one change, measures again, and decides whether to keep or revert.\n\n**The key insight:** Any site that auto-deploys when you push to a git branch works — Vercel, Netlify, GitHub Pages, or any CI/CD pipeline. CROtomate just uses git as the deployment bridge and its own memory (every experiment is a commit).\n\n---\n\n## Quickstart\n\n### Prerequisites\n\n- Node.js 18+\n- A website that auto-deploys when you push to a git branch (Vercel, Netlify, GitHub Pages, any CI/CD)\n- Analytics on your site ([PostHog](https://posthog.com) or [Plausible](https://plausible.io))\n- An API key from any [supported LLM provider](#supported-llm-providers)\n\n### Install and run\n\n```bash\n# Install globally\nnpm install -g crotomate\n\n# Set your LLM API key\nexport ANTHROPIC_API_KEY=sk-ant-...   # or OPENAI_API_KEY, GOOGLE_API_KEY, etc.\n# Or add it to a .env file in your project root\n\n# Interactive setup: picks your analytics, LLM, and thresholds\ncrotomate init\n\n# Start the loop\ncrotomate run\n```\n\nThe `init` wizard creates a `crotomate.config.json` and a [`SCOPE.md`](#scopemd) in your project root. The `run` command starts the autonomous loop. Press `Ctrl+C` to stop gracefully after the current experiment finishes.\n\nTo update to the latest version:\n\n```bash\nnpm update -g crotomate\n```\n\n---\n\n## What it actually changes\n\nCROtomate changes **whatever you tell it to** in [`SCOPE.md`](#scopemd). Out of the box, the default SCOPE.md permits:\n\n- Headline and subheadline copy\n- CTA button text, color, and size\n- Social proof placement and wording\n- Hero section layout\n- Form field reduction\n- Above-the-fold content ordering\n- Trust signals and urgency/scarcity elements\n\nBut this list is yours to edit. Want the agent to also experiment with background images or page copy below the fold? Add it to SCOPE.md. Want it to leave your testimonials alone? Add that to the Forbidden Changes section.\n\nThe only rules you **cannot** override are the hardcoded safety floor — the agent will never touch routing, authentication, payment flows, backend logic, database schemas, environment variables, or build configuration, no matter what SCOPE.md says.\n\nYou have two layers of control:\n- **[`SCOPE.md`](#scopemd)** — tell the agent what to focus on, what to avoid, and how your brand sounds\n- **`editableGlobs` / `lockedGlobs`** in your config — control which files it can touch at the filesystem level\n\n---\n\n## SCOPE.md\n\n`SCOPE.md` is the system prompt for the CRO agent. It lives in your project root (next to `crotomate.config.json`) and tells the AI exactly what it's allowed to change and what's off limits.\n\nThe default `SCOPE.md` is **intentionally restrictive** — the agent can change copy, tweak button styles, and reorder above-the-fold elements, but cannot touch navigation, pricing, auth flows, state management, API calls, or anything structural. You can loosen or tighten these rules to match your comfort level.\n\n### What's inside\n\n| Section | Purpose |\n| --- | --- |\n| **Optimization Focus** | What the agent may experiment with (copy, CTA styling, element placement, forms, social proof, urgency) |\n| **Forbidden Changes** | What the agent must never touch, even if it thinks it would help (structure, business logic, integrations, code architecture, assets) |\n| **Brand Guidelines** | Your voice, tone, color rules, and style constraints |\n| **Additional Instructions** | Target audience, product context, known issues, current promotions |\n\n### How it works\n\n- `crotomate init` creates a default `SCOPE.md` if one doesn't exist\n- The agent reads `SCOPE.md` before every experiment and injects its rules into the LLM prompt\n- Built-in safety rules (no auth, no routing, no payments, no backend, no env vars, no build config) **always apply on top** and cannot be overridden — even if you remove them from `SCOPE.md`\n- If you delete `SCOPE.md`, the agent falls back to the same defaults\n\n### Customizing it\n\nOpen `SCOPE.md` and edit it directly. The Brand Guidelines and Additional Instructions sections come with commented-out examples — uncomment the ones that apply to you and fill in your details. The more context you give the agent about your brand and audience, the better its hypotheses will be.\n\n---\n\n## Supported LLM providers\n\n| Provider  | Config value | Env var             | Default model          |\n| --------- | ------------ | ------------------- | ---------------------- |\n| Anthropic | `anthropic`  | `ANTHROPIC_API_KEY` | `claude-opus-4-5`      |\n| OpenAI    | `openai`     | `OPENAI_API_KEY`    | `gpt-4o`               |\n| Google    | `google`     | `GOOGLE_API_KEY`    | `gemini-2.0-flash`     |\n| Mistral   | `mistral`    | `MISTRAL_API_KEY`   | `mistral-large-latest` |\n| xAI       | `xai`        | `XAI_API_KEY`       | `grok-3`               |\n\nOther models suggested by the `init` wizard: `claude-sonnet-4-5`, `claude-haiku-4-5`, `gpt-4o-mini`, `o3-mini`, `gemini-2.5-pro`, `mistral-small-latest`, `grok-3-mini`. You can use any model your provider supports by setting the `model` field in your config.\n\n**Use the most capable model you can afford.** The LLM is doing three hard jobs: understanding your codebase, generating high-quality hypotheses, and writing production code that deploys without breaking anything. More capable models (Claude Opus, GPT-4o, Gemini 2.5 Pro) understand your code structure better, produce sharper hypotheses grounded in what actually matters for conversions, and write cleaner code that won't cause deployment failures. Smaller or cheaper models are more likely to misread your codebase, propose generic hypotheses, or generate code that fails to compile — wasting the entire experiment. Don't save $0.05 per experiment and risk broken deploys.\n\nCROtomate makes ~2 LLM calls per experiment (one for the hypothesis, one for the code change). At GPT-4o pricing with one experiment per day, that's roughly **$0.10-$0.50/day** depending on your codebase size.\n\nSet the env var or add it to a `.env` file in your project root. See the [full LLM setup guide](docs/setup-llm.md) for model options and billing notes.\n\n---\n\n## Deployment setup\n\nCROtomate deploys by pushing to your configured git branch. Your hosting platform or CI/CD pipeline picks up the commit and rebuilds automatically. No platform-specific integration needed.\n\nThis works out of the box with any auto-deploying setup:\n- **Vercel** — pushes to your production branch trigger a rebuild\n- **Netlify** — same, auto-deploys on push\n- **GitHub Pages** — with a GitHub Actions workflow\n- **Any CI/CD pipeline** — as long as pushing to the branch triggers a deploy\n\nJust make sure the `repoBranch` in your config matches the branch your hosting watches.\n\n---\n\n## Analytics setup\n\nCROtomate needs read access to your analytics to measure conversion rates before and after each experiment.\n\n| Provider  | What you need                     | Guide                                  |\n| --------- | --------------------------------- | -------------------------------------- |\n| PostHog   | Personal API key + Project ID     | [Setup guide](docs/setup-posthog.md)   |\n| Plausible | API key + site domain + Goal name | [Setup guide](docs/setup-plausible.md) |\n\nYou define what \"conversion\" means: a custom event like `signup_completed`, a goal like `purchase`, or a pageview goal like `/thank-you`.\n\n---\n\n## Commands\n\n| Command                        | What it does                                               |\n| ------------------------------ | ---------------------------------------------------------- |\n| `crotomate init`               | Interactive setup wizard. Creates `crotomate.config.json` and `SCOPE.md`. |\n| `crotomate run`                | Start the optimization loop. Runs until stopped.           |\n| `crotomate run --once`         | Run a single experiment, then exit.                        |\n| `crotomate run --iterations 5` | Run exactly 5 experiments, then exit.                      |\n| `crotomate status`             | Show experiment history table and current CR.              |\n| `crotomate rollback`           | Revert the last kept experiment (with confirmation).       |\n\n\u003e **Tip:** Set `DEBUG=1` to see full stack traces on errors (e.g., `DEBUG=1 crotomate run`).\n\n### Example `status` output\n\n```\n#   Date        Hypothesis                            Baseline  Variant  Delta    Result\n--- ----------- ------------------------------------- --------- -------- -------- ------\n1   2025-01-15  Change CTA to \"Get Started Free\"         3.10%    3.80%   +22.6%  kept\n2   2025-01-17  Move social proof above the fold         3.80%    3.65%    -3.9%  reverted\n3   2025-01-19  Add \"No credit card required\" badge      3.80%    4.15%    +9.2%  kept\n4   2025-01-21  Make hero headline more specific         4.15%    4.10%    -1.2%  reverted\n\nTotal: 4 | Kept: 2 (50%) | Avg lift: +15.9% | Current CR: 4.15%\n```\n\n---\n\n## Configuration reference\n\n`crotomate.config.json` is created by `crotomate init`. [`SCOPE.md`](#scopemd) controls the agent's behavior (what it focuses on, what it avoids, brand rules). All config fields:\n\n```jsonc\n{\n  \"projectName\": \"my-landing-page\", // used in logs\n  \"repoPath\": \"/home/user/my-site\", // absolute path to your local git clone\n  \"repoBranch\": \"main\", // branch to push to (default: \"main\")\n\n  \"analytics\": {\n    \"provider\": \"posthog\", // \"posthog\" | \"plausible\"\n    \"apiKey\": \"phc_...\", // your analytics read API key\n    \"projectId\": \"12345\", // PostHog project ID or Plausible site domain\n    \"conversionEventName\": \"signup_completed\", // the event that counts as a conversion\n    \"baseUrl\": \"https://us.posthog.com\", // optional, for self-hosted PostHog or Plausible\n  },\n\n  \"llm\": {\n    \"provider\": \"anthropic\", // \"anthropic\" | \"openai\" | \"google\" | \"mistral\" | \"xai\"\n    \"model\": \"claude-opus-4-5\", // see provider table above\n    // API key is NEVER stored here, always read from env var\n  },\n\n  \"loop\": {\n    \"minVisitorsPerTest\": 200, // wait for at least this many visitors\n    \"minTestDurationHours\": 24, // wait at least this many hours\n    \"maxIterations\": null, // optional, stop after N experiments\n    \"pollIntervalMinutes\": 30, // how often to check analytics\n    \"keepThresholdPercent\": 2, // minimum % improvement to keep a change\n  },\n\n  \"editableGlobs\": [\"src/**/*.tsx\", \"src/**/*.css\"], // files the agent CAN edit\n  \"lockedGlobs\": [\"package.json\", \"tsconfig*.json\"], // files the agent must NEVER touch\n}\n```\n\n---\n\n## How experiments are tracked\n\nEvery experiment is saved as a JSON file in the `experiments/` directory:\n\n```\nexperiments/\n  2025-01-15T10-30-00-000Z-change-cta-to-get-started-free.json\n  2025-01-17T14-22-00-000Z-move-social-proof-above-fold.json\n```\n\nEach file records the hypothesis, files changed, baseline and variant conversion rates, the decision (kept/reverted), commit SHAs, duration, visitor count, and which LLM was used. The agent reads the last 20 experiments before generating each new hypothesis to avoid repeating past ideas.\n\nGit is also memory. Every kept experiment is a commit, every reverted experiment leaves a revert commit. Run `git log --oneline` to see the full history.\n\n---\n\n## FAQ\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhich LLM should I use?\u003c/strong\u003e\u003c/summary\u003e\n\n**Use the most powerful model you can afford.** The model needs to understand your codebase, write hypotheses that target real conversion levers, and produce code that deploys cleanly. More capable models do all three better. Claude Opus and GPT-4o are the recommended defaults. Gemini 2.5 Pro is a strong alternative. Avoid small/cheap models (Haiku, GPT-4o-mini, Flash) for production use — the cost savings are minimal ($0.01-$0.05 per experiment) and not worth the risk of shallow hypotheses, ignored SCOPE.md constraints, or broken deploys.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhat if my site gets less than 200 visitors per month?\u003c/strong\u003e\u003c/summary\u003e\n\nLower `minVisitorsPerTest` in your config (e.g., to 50 or even 20). Smaller sample sizes make results less statistically reliable, but for early-stage sites any signal is better than guessing. You can also lower `minTestDurationHours` to speed up iterations.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWill CROtomate break my site?\u003c/strong\u003e\u003c/summary\u003e\n\nEvery change is a git commit. If something goes wrong, `crotomate rollback` reverts the last experiment in one command. The agent is constrained at three levels: hardcoded safety rules (never touches auth, routing, payments, backend), your [`SCOPE.md`](#scopemd) (defines exactly what it can and can't change), and `lockedGlobs` (files it physically cannot edit). Use a powerful LLM — smaller models are more likely to generate code that fails to compile, which means the deploy fails and the experiment is wasted.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCan I use CROtomate while I'm actively developing?\u003c/strong\u003e\u003c/summary\u003e\n\nYes. Press `Ctrl+C` to stop the loop gracefully. It'll finish the current experiment phase and exit. Make your changes, push, then restart with `crotomate run`.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eHow long does each experiment take?\u003c/strong\u003e\u003c/summary\u003e\n\nIt depends on your traffic. With `minVisitorsPerTest: 200` and 200 daily visitors, each experiment takes about 1 day. 1,000 visitors/day? A few hours. The `minTestDurationHours` setting (default: 24h) sets a floor regardless of traffic to account for time-of-day effects.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eHow do I run CROtomate 24/7?\u003c/strong\u003e\u003c/summary\u003e\n\nRun it on a cheap VPS ($5/mo) inside `tmux` or as a `systemd` service. See [self-hosting](#self-hosting-on-a-vps) below.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhat's the cost?\u003c/strong\u003e\u003c/summary\u003e\n\nCROtomate itself is free and open source. You pay for LLM API calls (~$0.10-$0.50/day at one experiment per day with GPT-4o) and your analytics provider (PostHog and Plausible both have generous free tiers). A VPS for 24/7 operation runs ~$5/mo.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eI'm getting a git push error\u003c/strong\u003e\u003c/summary\u003e\n\nMake sure your git credentials (SSH key or HTTPS personal access token) are configured for pushing to the remote. CROtomate commits and pushes on your behalf — if `git push` wouldn't work manually, it won't work here either. Run `git push` manually from the repo to test.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAnalytics connection test failed during init\u003c/strong\u003e\u003c/summary\u003e\n\nDouble-check your API key and project ID (PostHog) or site domain (Plausible). If you're using a self-hosted instance, set the `baseUrl` field in your config. Run with `DEBUG=1` for the full error details.\n\n\u003c/details\u003e\n\n---\n\n## Self-hosting on a VPS\n\nFor 24/7 optimization, run CROtomate on any cheap VPS:\n\n```bash\n# SSH in, install Node 18+, install CROtomate\nssh user@your-server\nnpm install -g crotomate\n\n# Clone your site, set up, and run in tmux\ngit clone https://github.com/you/your-site.git \u0026\u0026 cd your-site\nexport ANTHROPIC_API_KEY=sk-ant-...\ntmux new -s crotomate\ncrotomate init \u0026\u0026 crotomate run\n# Ctrl+B then D to detach. Reattach with: tmux attach -t crotomate\n```\n\nOr use a systemd service for auto-restart on failure:\n\n```ini\n# /etc/systemd/system/crotomate.service\n[Unit]\nDescription=CROtomate\nAfter=network.target\n\n[Service]\nType=simple\nWorkingDirectory=/home/user/your-site\nEnvironment=ANTHROPIC_API_KEY=sk-ant-...\nExecStart=/usr/bin/crotomate run\nRestart=on-failure\nRestartSec=30\n\n[Install]\nWantedBy=multi-user.target\n```\n\n```bash\nsudo systemctl enable --now crotomate\n```\n\n---\n\n## Contributing\n\nContributions are welcome. Found a bug? [Open an issue](https://github.com/rokbenko/CROtomate/issues). Please open an issue first to discuss what you'd like to change.\n\n1. Fork the repo\n2. Create a feature branch (`git checkout -b feature/my-change`)\n3. Make sure `npm run typecheck` passes\n4. Open a pull request\n\n---\n\n## Author\n\nMade with ❤️ in 🇸🇮 by [Rok Benko](https://www.rokbenko.com/).\n\n---\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frokbenko%2Fcrotomate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frokbenko%2Fcrotomate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frokbenko%2Fcrotomate/lists"}