---
title: "Prefer open source and pay only when · Agent Wranglers"
url: https://agentwranglers.se/playbook/stack/how-to-choose/prefer-open-source
updated: 2026-10-21
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Prefer open source and pay only when nothing open does the job

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers). Updated 2026-10-21.

For AI agents: [llms.txt](https://agentwranglers.se/llms.txt) is a short guide that sends you to the rules your problem needs, and [rules.json](https://agentwranglers.se/playbook/stack/rules.json) holds every rule of this playbook as JSON.

- Level: Recommended
- Chapter: [How to choose](https://agentwranglers.se/playbook/stack/how-to-choose)
- Rule: Pick open source software when an open source option passes the other tests. Pick a paid or proprietary service only when no open source option realistically does the job, and say why.
- How: Open source can be run, inspected, forked and moved without asking anyone. A paid service fits only where the job needs one, such as card payments, email delivery at scale or text messages. A free tier counts as proprietary, not as open source. Label every pick with its cost, so readers see at once what is free and what is paid. Record each paid or proprietary pick and its reason, as [Keep decision records with a status](https://agentwranglers.se/playbook/engineering/documentation/decision-records) says.
- Check: Every dependency and service in the project has a cost label of Open source, Source available, Free service, Free tier or Paid. Each one not labelled Open source has a decision record naming the open source options it beat.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### JavaScript example

```js
const COSTS = ['Open source', 'Source available', 'Free service', 'Free tier', 'Paid'];
export const needsReason = picks => picks.filter(pick => pick.cost !== 'Open source' && !pick.decisionRecord);
```

### Python example

```python
COSTS = ["Open source", "Source available", "Free service", "Free tier", "Paid"]

def needs_reason(picks: list[dict]) -> list[dict]:
    return [pick for pick in picks if pick["cost"] != "Open source" and not pick.get("decision_record")]
```

## Sources

- [OSI Approved Licenses](https://opensource.org/licenses)

## Related rules

- [Keep decision records with a status](https://agentwranglers.se/playbook/engineering/documentation/decision-records) in Engineering

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/stack/how-to-choose/prefer-open-source">Agent Wranglers software choices playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Pick software a new developer learns alone](https://agentwranglers.se/playbook/stack/how-to-choose/easy-to-learn)
- Next: [Keep an open licence or a way out](https://agentwranglers.se/playbook/stack/how-to-choose/open-licence-or-exit)
- [How to choose](https://agentwranglers.se/playbook/stack/how-to-choose)
