Skip to main content

nsnswewe

N S N S W E W E: a compass needle swinging before it settles. Install nsnswewe, then type strategy.

Your strategy as data — four things, and only four. See it, look at one position and its case, decide on it, add one. The same four on a small web page, on the command line and over MCP.

MIT licensed. Runs entirely on your machine, against SQLite or Postgres.

Why so small

Teams decide things constantly and then lose them: the decision lives in a task title, a closed issue, a doc from March, and six weeks later it is re-argued from scratch. A strategy you can see on one page is one you can check work against. Simple is explainable; this does the explainable part.

The four things

The strategy is laid out in the five boxes of Playing to Win (Lafley & Martin): winning aspiration, where to play, how to win, capabilities, management systems. A position is one claim in one box. It is undecided until you adopt it (I hold this) or reject it (I do not, and here is why); either is dated. What backs it is its evidence: notes of what was actually observed, each saying which way it cuts — supports, opposes, or complicates.

Web CLI MCP tool
1. See the strategy / strategy list list
2. One position and its evidence /positions/<id> strategy show <id> show
3. Decide: adopt · reject · note forms on the position page strategy adopt <id> · strategy reject <id> --note … · strategy evidence add <id> --summary … [--stance supports] adopt · reject · evidence_add
4. Add a position into a box /add strategy add --title … --box "where to play" add

Several strategies in one store. A cascade is the five boxes for one project, or for one pass at the same question. Create, rename and delete them on the Cascades page, with strategy cascade create|list|show|rename|delete, or with the MCP tools cascade_list, cascade_create, cascade_rename and cascade_delete. The strategy page has a dropdown to show one (and, when some positions are in no cascade, "Unassigned positions", also --cascade -); strategy list --cascade KEY and the list tool's cascade do the same, and add into a cascade puts the new position in it. Deleting a cascade never deletes a position.

The CLI also does the housekeeping: strategy init, strategy export, strategy import, and strategy web to serve the pages.

Every surface reads through queries.py and writes through core.py, so they cannot disagree: adopting dates the position, a rejection must carry a reason, a position must name one of the five boxes.

Quick start

uv tool install 'nsnswewe[web,mcp]'   # → strategy, strategy-mcp (and nsnswewe, the same as strategy)
strategy init                  # SQLite at ~/.strategy/store.db, or set STRATEGY_DB_URL
strategy add --title "Sell to teams, not individuals" --box "where to play"
strategy list
strategy web                   # http://127.0.0.1:8021

To try it without installing: uvx nsnswewe init, then uvx nsnswewe list.

From a clone of this repo, uv tool install '.[web,mcp]' does the same as the install line.

For a chat client, run strategy-mcp (stdio). It has the four things and no housekeeping.

Configuration

Variable Purpose Default
STRATEGY_DB_URL Where the store lives SQLite at ~/.strategy/store.db
STRATEGY_EXPORT_PATH JSONL backup target ~/.strategy/positions.jsonl

Settings are read from the process environment first, then ~/.env, then the default. ${PART}-style references in those files resolve the way a shell would; a reference nothing defines drops the key with a line on stderr rather than leaving half a connection string.

If STRATEGY_DB_URL is set and cannot be opened, the CLI fails and says so. It never quietly falls back to the local SQLite copy.

Your positions are not in this repository. They name real commitments and real people, and live in your store.

The web page

Four pages (the strategy, a position, add, cascades) and /health, bound to loopback with no login. Writes are form posts that go through core; a cross-origin post is refused.

Publishing hygiene

scripts/check_publishable.py fails on real Vikunja task ids, patent numbers, or terms from a private list kept outside the repo (STRATEGY_PRIVATE_TERMS; plain substrings, or re: lines for patterns). tests/test_publishable.py runs the same check in the suite.

License

MIT — see LICENSE. Pinned to Python 3.12 by .python-version.

Metadata

Release files for nsnswewe 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for nsnswewe 0.1.0
File Size Uploaded Provenance Actions
nsnswewe-0.1.0.tar.gz 120.8 kB Without provenance Details for nsnswewe-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for nsnswewe 0.1.0
File Interpreter ABI Platform Actions
nsnswewe-0.1.0-py3-none-any.whl Python 3 none any Details for nsnswewe-0.1.0-py3-none-any.whl

Total release size: 169.5 kB

Release files / nsnswewe-0.1.0.tar.gz

Download URL nsnswewe-0.1.0.tar.gz
Size 120.8 kB
Tags Source
SHA-256 checksum
How to use checksums
a3082bc9936fdd7812321e230e001c495c01c5fe69dc43376c34ef806933d0e0
BLAKE2b-256 checksum
How to use checksums
b2f6c9798fba16afd4593306f32ed848bd9705d206ca62def78be7532c4ef101
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release files / nsnswewe-0.1.0-py3-none-any.whl

Download URL nsnswewe-0.1.0-py3-none-any.whl
Size 48.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
662e5ade9814d4f0edbce77f532c2f1d484beca67726831b5c819093222fd70f
BLAKE2b-256 checksum
How to use checksums
0ca98dc7e4f8e4300ce241d58122c7762368fc3feabcb03e6cb81991a67d52bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Security for nsnswewe 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page