Marketing + behaviour pass to get the site ready for Paddle approval.
Pricing page
- £7/month, £70/year headline (was "Coming soon").
- Bigger tier names (was 11px uppercase mono — looked like chips).
- Real CTAs (button base styles were only scoped to .hero__ctas).
- "Best value" badge + drop-shadow on the Paid card; full-width
block CTAs that align across both cards.
- "Free vs Paid at a glance" comparison table beneath the cards.
- Compact "Invite a friend — both get 50% off for 3 months"
callout with the detail explanation behind a <dialog> popup.
Tier copy + behaviour now consistent
- Free strategic-log refresh is every 6 hours, not hourly. New
read-side filter on /api/log/{latest,by-date} restricts free
users to logs at boundary hours (00/06/12/18 UTC); paid users
still see the most recent.
- Follow-up chat is paid-only. /api/chat returns 402 for free;
the chat sidebar on /log is replaced with a locked aside and
chat.js no longer loads at all for free users.
- Dashboard meta lines + landing copy softened so they no longer
promise hourly to everyone.
Future-proofing copy on public pages
- Dropped "free forever" wording (we may close the free tier).
- "Trading 212 CSV" became "broker CSV (Trading 212 today; more
planned)" on pricing + landing; the actual import UIs stay
T212-specific.
Terms
- Renamed Terms of Service -> Terms and Conditions (Paddle
expectation), bumped last-updated to 2026-05-26.
- New §6 Refunds covering the 14-day cooling off, post-window
cancellation, termination-by-us refunds, statutory rights, and
how to request a refund.
- Renumbered §7-§14 and fixed the disclaimer link labels.
Tests
- 6 new tests in tests/test_chat_and_log_gates.py cover the
chat 402 + the boundary-hour filter on both log endpoints.
- Full suite: 205 passed, 5 skipped, 0 failed.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
73 lines
2.8 KiB
HTML
73 lines
2.8 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}{{ BRAND_NAME }} · Strategic Log{% endblock %}
|
|
|
|
{% block main %}
|
|
<section class="panel log-page" style="grid-column: 1 / -1;">
|
|
<div class="panel-header">
|
|
<span class="title">Strategic Log Archive</span>
|
|
<span class="meta">
|
|
selected {{ selected_iso }}
|
|
·
|
|
<span class="meta__hint">new logs use:</span>
|
|
<span class="badge badge--tone-{{ current_tone | lower }}">tone {{ current_tone | lower }}</span>
|
|
<span class="badge badge--analysis-{{ current_analysis | lower }}">analysis {{ current_analysis | lower }}</span>
|
|
</span>
|
|
</div>
|
|
|
|
<div class="log-page__body">
|
|
<aside class="log-page__cal"
|
|
hx-get="/api/log/days?month={{ selected_month }}&selected={{ selected_iso }}"
|
|
hx-trigger="load"
|
|
hx-swap="innerHTML">
|
|
<div class="empty">loading calendar…</div>
|
|
</aside>
|
|
|
|
<article id="log-content"
|
|
class="log-page__content"
|
|
hx-get="/api/log/by-date/{{ selected_iso }}?as=html"
|
|
hx-trigger="load, tone-changed"
|
|
hx-swap="innerHTML">
|
|
<div class="empty">loading log…</div>
|
|
</article>
|
|
|
|
{% if paid %}
|
|
<aside id="chat-sidebar" class="log-page__chat">
|
|
<div class="chat-header">
|
|
<span class="chat-title">Ask Cassandra</span>
|
|
<span class="chat-hint">grounded on the latest log + live data</span>
|
|
</div>
|
|
<div id="chat-thread" class="chat-thread">
|
|
<div class="chat-msg chat-msg--system">
|
|
Ask about today's analysis. The model sees the latest strategic log,
|
|
live market readings across all groups, and the last 24h of
|
|
thesis-filtered headlines. Refresh wipes this conversation.
|
|
</div>
|
|
</div>
|
|
<form id="chat-form" class="chat-form" autocomplete="off">
|
|
<textarea id="chat-input" rows="2"
|
|
placeholder="e.g. why is the defence sleeve flat through Hormuz?"
|
|
required></textarea>
|
|
<button id="chat-send" type="submit">Send</button>
|
|
</form>
|
|
</aside>
|
|
{% else %}
|
|
<aside class="log-page__chat log-page__chat--locked">
|
|
<div class="chat-header">
|
|
<span class="chat-title">Ask Cassandra</span>
|
|
<span class="chat-hint">paid-tier feature</span>
|
|
</div>
|
|
<div class="chat-locked">
|
|
<p>
|
|
<strong>Follow-up chat is a paid feature.</strong>
|
|
Ask the model a question about any past log — it sees the
|
|
full day's context: the strategic log, live market readings, and
|
|
the last 24 hours of thesis-filtered headlines.
|
|
</p>
|
|
<a class="btn-primary" href="/pricing">See pricing</a>
|
|
</div>
|
|
</aside>
|
|
{% endif %}
|
|
</div>
|
|
</section>
|
|
{% if paid %}<script src="{{ url_for('static', path='/js/chat.js') }}" defer></script>{% endif %}
|
|
{% endblock %}
|