{% extends "base.html" %} {%- import "partials/carousel.html" as carousel -%} {% block title %}Makenotwork{% endblock %} {% block body_attrs %} class="{{ crate::shell::measure(crate::shell::Measure::Contained) }}"{% endblock %} {% block head %} {% endblock %} {% block content %}
Sell your work directly. Keep what you earn.
A flat monthly subscription. No investors, no ads, no cut on your sales. Source-available, exportable in one click.
{% if founder_window_open %}Founder pricing open Half off creator tiers, locked for life.
{% endif %} {% if let Some(shipped) = last_shipped %}Last shipped: {{ shipped.title }} · {{ shipped.date }}
{% endif %}Sell anything digital. Bundles, splits, license keys, promo codes.
Profile, blog, mailing list, memberships, tips. No add-ons.
Audio and video streaming, file downloads, git repos, custom domains. Live streaming on the way.
{{ remaining }} founder slot{% if *remaining != 1u32 %}s{% endif %} left of 1,000
{% else %}Window closes at 1,000 creators or when we exit beta, whichever first.
{% endif %} {% endif %} {% if !founder_window_open %}Flat monthly pricing from ${{ tier_prices.basic_std }}/mo. 0% platform fee. Every tier is the complete platform.
{% else %}0% platform fee. Every tier is the complete platform.
{% endif %}Support the platform directly and get something back every month.
{# Keep this list and the one on /fan-plus identical, and keep both to what the code grants. Audited 2026-08-05 against the credit issuance path here and the perk checks in multithreaded; see the Fan+ guide page for the detail. #}Works in any browser, on any phone. No app to install.
{% if total_creators > 0 || total_items > 0 %}{{ total_creators }} creator{% if total_creators != 1 %}s{% endif %} publishing {{ total_items }} item{% if total_items != 1 %}s{% endif %}.
{% endif %}Every craft has its own setup. Pick yours for tier guidance and feature notes.
Get notified when something ships.
{# Real action and method, so this works with JS off. page-index.js intercepts the submit and posts the same encoding to the same route, which makes the script an enhancement (async, inline status, no reload) rather than the only path. It had neither attribute before, so a no-JS submit did a GET to / and the address went nowhere. #} {# The no-JS outcome, carried back on the redirect. The script writes its own text into this element instead. #}{% if let Some(ok) = notify_ok %}{% if ok %}You're on the list.{% else %}That address didn't look right.{% endif %}{% endif %}