| Age | Commit message (Collapse) | Author |
|
- Use billing_cycle_anchor instead of current_period_start/end in test
- Reflects actual Stripe API v2025-10-29 subscription structure -
Test validates upgrade flow works with newer API versions - Removes
debug logging (list of available keys)
|
|
- Use billing_cycle_anchor or start_date as fallback for period start -
Calculate period end by adding 1 month if not provided - Handles newer
Stripe API versions that don't include current_period_* fields - Fixes
issue where subscription.created webhook couldn't update user plan -
Works with Stripe API Version 2025-10-29.clover and newer
|
|
Log available keys when period dates are missing to help debug why
subscription webhooks fail to update user plan.
|
|
- Test simulates complete Stripe checkout flow end-to-end -
Step 1: checkout.session.completed with client_reference_id -
Step 2: customer.subscription.created with subscription details -
Verifies customer linking and plan upgrade to pro tier - Tests ensure
webhook flow works without calling real Stripe API - Validates that
client_reference_id properly links session to user
|
|
- Handle case where client_reference_id is None or missing - Fall back
to checking metadata.user_id if client_reference_id not available -
Add try/except for int() conversion with proper error logging - Use
safe .get() for session ID in error messages - Prevents TypeError:
int() argument must be a string when webhook has None value
|
|
- Skip signature verification if STRIPE_WEBHOOK_SECRET is not set -
Add warning log when verification is skipped - Parse webhook payload
as JSON directly in test mode - Enables local testing with 'stripe
trigger' without configuring webhook secret - Production still requires
proper webhook secret for security
|
|
- Remove UNIQUE constraints from ALTER TABLE statements
(SQLite doesn't support adding constraints via ALTER TABLE)
- Add better logging for migration failures (debug level) - Rely on
application logic to ensure uniqueness instead of DB constraint -
This fixes the silent failure where stripe_customer_id and
stripe_subscription_id columns weren't being added
|
|
- Add TestWebhookHandling class with tests for subscription webhooks -
Test normal subscription creation flow with mock data - Test handling
of incomplete webhook data (missing fields) - Add STRIPE_TESTING.md
with comprehensive testing guide:
- How to use Stripe test mode and test cards - How to use Stripe
CLI to trigger test webhooks - Instructions for running unit tests -
Database migration instructions for production - End-to-end testing
workflow - Common troubleshooting issues
Tests verify webhook handling works without calling real Stripe API.
|
|
- Replace direct dict key access with .get() for all subscription
fields - Add validation and early return for missing required fields -
Add logging warnings when subscription data is incomplete - Handles
both dict and Stripe object access patterns safely - Fixes KeyError:
'current_period_start' when processing webhooks
|
|
- Add hamburger toggle button positioned on right side - Navbar
collapses on small screens (< lg breakpoint) - Mobile view shows
vertically stacked elements:
- Logged in as: email - Free: X articles left [Upgrade Now] (free
users) - Billing (paid users only) - Admin Queue (admins only)
- Logout
- Remove 'Plan: Pro' text for paid users (just show Billing button)
- Add rounded corners to navbar with 'rounded' class - Remove 1px
bottom border in dark mode - Toggle controlled by Bootstrap's collapse
component
|
|
- Navbar now uses dark background (#2b3035) in dark mode - Add
border-bottom to separate navbar from content in dark mode - Ensure
navbar-text elements have proper light color (#dee2e6) in dark mode -
Maintains light mode appearance with bg-body-tertiary
|
|
- Change Upgrade Now button from btn-warning to btn-success -
Convert user info card to Bootstrap navbar with horizontal layout -
Free tier: quota text and Upgrade Now button inline with navbar-text
styling - Paid tier: plan name displayed inline as navbar-text -
Email, plan info, and action buttons all in single horizontal bar -
Uses bg-body-tertiary for automatic light/dark mode compatibility
|
|
- Replace '[Upgrade Now]' text link with proper btn-warning button -
Add arrow-up-circle icon to Upgrade Now button - Hide Billing button
for free tier users (they now have Upgrade Now) - Keep Billing button
visible for paid tier users
|
|
- Create shared UI module (Biz/PodcastItLater/UI.py) with:
- create_bootstrap_styles() - create_auto_dark_mode_style() -
create_htmx_script() - create_bootstrap_js()
- Update Admin.py to use shared UI module and add dark mode support -
Update Web.py to use shared UI module - Admin Queue and User Management
pages now support automatic dark mode
|
|
Subscribe link now appears inline next to label. Click copies URL to
clipboard and shows 'Copied!' feedback for 2 seconds. Link truncates
if too long to fit in bounding box.
|
|
Free tier users now see 'Free: X articles left [Upgrade Now]' banner.
Paid users see plan name with icon as before. Banner replaces the
old plan display in user info card.
|
|
Simplified pricing to two tiers: - Free: 10 articles total (lifetime)
- Pro: $29/month unlimited articles
Removed STRIPE_PRICE_ID_PERSONAL from configuration.
|
|
Free tier now has 10 articles total (lifetime) instead of 10 per month.
Period boundaries for free users now span from account creation to
far future.
|
|
New accounts now default to 'active' status instead of 'pending'.
Users can start using the service immediately after signup.
|
|
- Implement Biz.PodcastItLater.Billing with checkout sessions, billing
portal, webhook handling - Add subscription database schema: plan_tier,
stripe fields, period dates, stripe_events table - Three-tier pricing:
free (10/month), personal (/month, 50 articles), pro (9/month,
unlimited) - Usage tracking and enforcement with tier-based limits
- Full billing UI with plan display, usage stats, pricing cards,
upgrade buttons - Dashboard shows current tier with billing button -
Update Web.nix with Stripe environment variables - Fix POST redirects
to Stripe with 303 status code for CloudFront compatibility
Amp-Thread-ID:
https://ampcode.com/threads/T-c139e5b5-1901-4cd6-8030-5623bfe1df35
Co-authored-by: Amp <amp@ampcode.com>
|
|
Without this, run.sh would continue if bild failed, and you might
end up running an out of date artifact.
|
|
|
|
The bg-light class was forcing the 'Logged in as' card to stay
light even in dark mode. Removing it allows Bootstrap's default card
background to adapt to dark mode.
|
|
- Set all CSS variables on :root instead of html/body - Added RGB
variants needed by Bootstrap - Added secondary, tertiary, and border
color variants - Removed unnecessary light mode media query
This should now properly apply dark theme when system prefers dark
mode.
|
|
- Removed JavaScript theme switcher (not needed) - Removed toggle
buttons from all pages - Added automatic dark mode CSS based on
prefers-color-scheme media query - Added color-scheme meta tag
for native UI hints - Uses inline CSS instead of external file
(build system constraint) - Zero JavaScript - pure CSS solution -
Automatically follows system/browser dark mode preference
Task: t-64tkB5
|
|
- Added theme switcher script with localStorage persistence -
Respects system dark mode preference (prefers-color-scheme) - Added
theme toggle button to HomePage and BillingPage - Uses Bootstrap 5.3
data-bs-theme attribute for dark mode - Theme persists across page
loads - Icon changes between moon (light) and sun (dark)
Task: t-64tkB5
|
|
- Implemented complete Stripe integration (Billing.py)
- Checkout sessions for subscription upgrades - Billing portal for
subscription management - Webhook handling for subscription events
- Usage tracking with tier-based limits (free: 10, personal: 50,
pro: unlimited)
- Added billing page UI (BillingPage component)
- Current plan display with usage stats - Pricing cards for all
tiers with upgrade buttons - Manage subscription button for paid
users - Success/error messaging
- Database migrations for billing
- Added plan_tier, stripe_customer_id, stripe_subscription_id - Added
subscription_status, period dates, cancel_at_period_end - Created
stripe_events table for webhook idempotency - Added get_usage()
method for usage tracking
- Made UI mobile-friendly and responsive
- Added viewport meta tags to all pages - Replaced pages.HtmlPage
with raw html.html for meta tag control - Responsive button layouts
with flexbox wrapping - Responsive pricing cards (1 col mobile,
2 col tablet, 3 col desktop) - Touch-friendly forms and buttons
(44px minimum) - Responsive padding and containers - Admin tables
with horizontal scroll
- Added Stripe testing guide (STRIPE_TESTING.md)
- Fixed CSS bug in pricing cards (cardh-100 text rendering) - Updated
tasks: completed t-144e7lF, t-1pIV0ZF, t-1s8ADC0
Amp-Thread-ID:
https://ampcode.com/threads/T-42fd5fb3-3dc5-4cbc-a9a3-78db9e13187e
Co-authored-by: Amp <amp@ampcode.com>
|
|
- Enforce tier limits before article submission - Display current
plan in user info card (Free/Personal/Pro) - Add Billing button to
dashboard navigation - Show friendly upgrade prompt when limit reached
- Link to /billing page for plan management
Limits enforced: - Free: 10 articles/month - Personal: 50
articles/month - Pro: Unlimited
Related to task t-144e7lF
|
|
- Document using 'task create' instead of TODO/FIXME comments -
Document using Omni/Ide/typecheck.sh for fast Python typechecking -
Create task t-1pIV0ZF for billing page UI implementation
|
|
- Add stripe to Omni/Bild/Deps/Python.nix (alphabetically sorted) -
Fix all type annotations in Billing.py for mypy - Document how to add
Python packages in AGENTS.md - Add billing routes to Web.py (checkout,
portal, webhook)
This enables Stripe integration in PodcastItLater.
Related to task t-144e7lF
|
|
Add complete Stripe integration backend ready for testing once stripe
package is available in Nix environment.
Components: - Billing.py: Stripe Checkout, Billing Portal, webhook
handling - Database migrations for subscription tracking - Usage
tracking with tier-based limits - Idempotent webhook processing with
stripe_events table
Tier limits: free (10/mo), personal (50/mo), pro (unlimited)
Webhook events handled: - checkout.session.completed (link customer to
user) - customer.subscription.{created,updated,deleted} (sync state)
- invoice.payment_failed (mark past_due)
Requires: Stripe Python package in Nix, Web.py routes (next commit)
Related to task t-144e7lF
Amp-Thread-ID:
https://ampcode.com/threads/T-8feaca83-dcc2-46cb-8f71-d0785960a2f7
Co-authored-by: Amp <amp@ampcode.com>
|
|
RSS feed already generates personalized titles from user email.
Remove unused hardcoded values and change author to PodcastItLater.
|
|
- Remove audio player from Recent Episodes (use podcast app instead)
- Move RSS feed link from user info card to Recent Episodes section -
Fix audio playback interruption on refresh - Simplify user info card
to just show email and logout button
This fixes the UX issue where dashboard refresh would interrupt
playing audio.
Completes task t-17Z0069
|
|
- Apply Bootstrap 5 CSS and icons to all pages (Web.py, Admin.py) -
Convert all components to use Bootstrap classes instead of inline
styles - Add dev mode banner showing demo@example.com for instant
login - Implement secure demo account (demo@example.com) with
auto-approval - Fix HTMX loading issue when load_styles=False -
Update Database.create_user() to accept optional status parameter -
Add Bootstrap tables, cards, badges, and button groups throughout -
All tests passing
Completes task t-144drAE
Amp-Thread-ID:
https://ampcode.com/threads/T-8feaca83-dcc2-46cb-8f71-d0785960a2f7
Co-authored-by: Amp <amp@ampcode.com>
|
|
Changed epic display in tree view from:
t-PpXWsU [Epic] [ ] Task Manager Improvements
To:
t-PpXWsU [6/11] Task Manager Improvements
The [6/11] shows completed/total child tasks, giving immediate visual
feedback on epic progress. Regular tasks still use checkbox indicators:
[ ] open, [~] in-progress, [✓] done.
|
|
Changed tree output format from:
t-abc123 [ ] Task title [Omni/Task.hs]
To:
t-abc123 [ ] [Omni/Task.hs] Task title
This makes the namespace more prominent and groups all metadata
(status + namespace) together before the title.
|
|
Changes: 1. Remove [Task] label - only show [Epic] for epics, cleaner
output 2. Truncate long titles to fit 80 columns with ... ellipsis
3. Better spacing with type label included in layout calculation
Created task for future improvement: prettier box-drawing characters
(├──, └──) which would require Data.Tree library
investigation.
Current output is clean and readable within standard terminal width.
|
|
Add 'task tree' command to show hierarchical task structure:
Usage:
task tree # Show all epics with their children task tree <id> #
Show specific epic/task with children
Features: - Visual status indicators: [ ] open, [~] in-progress,
[✓] done - Shows task type: [Epic] or [Task] - Indented display
for hierarchy - Shows namespace associations
Example output:
t-PpXWsU [Epic] [ ] Task Manager Improvements [Omni/Task.hs]
t-PpYZt2 [Task] [ ] Implement child ID generation t-PpZGVf [Task]
[✓] Add filtering by type and parent
Updated AGENTS.md with usage examples.
Closes task t-PpZlbL
|
|
Added documentation explaining that git hooks are in Omni/Ide/hooks/
and version-controlled, not in .git/hooks/.
This prevents confusion about where to add/modify hooks and ensures
all team members use the same hooks.
|
|
Cleaned up duplicate hooks in .git/hooks that were running by mistake:
- Removed pre-commit, post-checkout, post-merge, pre-push - These
hooks had incomplete implementations with TODOs - Real hooks are
already in Omni/Ide/hooks/ (version controlled)
Git is configured via 'core.hooksPath = Omni/Ide/hooks' to use the
repository-tracked hooks.
Added README.md in .git/hooks/ to prevent future confusion and remind
developers to edit hooks in Omni/Ide/hooks/ instead.
The task export functionality is already properly implemented in
Omni/Ide/hooks/pre-commit and working correctly.
|
|
Implemented proper pre-commit hook that: - Calls 'task export --flush'
to consolidate tasks - Auto-stages .tasks/tasks.jsonl if modified -
Runs before every commit
Added reminder message after 'task update' to inform users that task
changes will be committed on next git commit.
Updated AGENTS.md to document the auto-commit behavior.
This fixes the bug where task status updates (e.g., marking tasks as
Done) were not being committed to git.
|
|
Add critical documentation about using test database to protect
production task data during development and testing.
Key points: - Set TASK_TEST_MODE=1 to use .tasks/tasks-test.jsonl -
Test suite automatically uses test mode - Never run destructive tests
on production database
This prevents accidental data loss like we experienced earlier when
test runs overwrote the production tasks.jsonl file.
|
|
Implement --status and --namespace filters for task list:
New filters: - --status: Filter by open, in-progress, or done -
--namespace: Filter by namespace (e.g., Omni/Task)
All filters can be combined: - task list --parent=t-abc123
--status=open - task list --type=epic --status=done - task list
--namespace="Omni/Task" --status=open
Updated listTasks signature to accept all filter parameters and apply
them in sequence. Updated AGENTS.md with examples.
Closes task t-PpZGVf
|
|
Test database was modified during bild --test runs to validate enhanced
dependency types and test isolation.
|
|
Created epic t-PpXWsU for Task Manager Improvements with subtasks:
Completed (Milestones 1-2): - t-PqLLXk: Implement epic and task
types ✓ - t-PqMc17: Add enhanced dependency types ✓ - t-PqMBuS:
Protect production database from tests ✓ - t-PqN0Uu: Add migration
support ✓
Remaining (Milestones 3-4): - t-PpYZt2: Implement child ID generation
(t-abc123.1) - t-PpZ6JC: Add child_counters storage - t-PpZe3X: Update
createTask to auto-generate child IDs - t-PpZlbL: Implement task tree
visualization - t-PpZsm4: Implement task stats command - t-PpZzBA:
Implement epic progress tracking - t-PpZGVf: Add filtering improvements
These tasks were lost when the production database was overwritten
during testing. Now properly tracked in the task system.
|
|
Found that commit 6a4afe9 had more recent task status updates than
3bf1691. Three tasks that were marked Done got reverted to Open: -
t-s9T0u1: instruct agents to include tests (Done) - t-v2w3x4: instruct
agents to run bild/lint (Done) - t-1lhJhgS: Remove old aider config
(Done)
Restored from the most recent complete version in git history.
|
|
- Add TASK_TEST_MODE environment variable to use separate test database
- All file operations now use getTasksFilePath to respect test mode -
Tests use .tasks/tasks-test.jsonl instead of production database -
Add automatic migration from old task format (taskProject field)
to new format - Migrated tasks convert taskProject to WorkTask type
with empty parent - Old [Text] dependencies converted to [Dependency]
with Blocks type - Restore actual tasks from commit 3bf1691 (were
lost during testing)
This prevents accidental data loss when running tests and provides
backward compatibility for existing task databases.
|
|
Implement four dependency types based on beads patterns: - Blocks:
Hard dependency, blocks ready work queue (default) - DiscoveredFrom:
Work discovered during implementation (doesn't block) - ParentChild:
Epic/task relationships (blocks ready work) - Related: Soft
relationships (doesn't block)
Key changes: - New Dependency data type with depId and depType fields
- New DependencyType enum with four relationship types - Updated CLI
with --dep-type and --discovered-from flags - Enhanced getReadyTasks
to respect only blocking dependency types - Added comprehensive tests
for all dependency behaviors - Updated AGENTS.md with usage examples
and patterns
The discovered-from pattern is especially important for AI agents to
maintain context of work found during implementation while keeping
it immediately available in the ready work queue.
Amp-Thread-ID:
https://ampcode.com/threads/T-178b273a-3ac7-416c-a964-db89bac3c8f7
Co-authored-by: Amp <amp@ampcode.com>
|
|
Major refactoring of task data model: - Added TaskType enum (Epic |
WorkTask) - Replaced taskProject with taskType and taskParent fields -
Epics are containers for tasks (hierarchical organization) - Tasks can
have optional parent epics - Updated createTask signature to accept
type and parent - Updated CLI: --type=epic|task and --parent=<id>
options - Updated list command to filter by type and parent - Updated
printTask to display type and parent info - Fixed naming collision
(WorkTask instead of Task constructor)
Example usage:
task create "Auth System" --type=epic task create "Design API"
--type=task --parent=t-abc123 task list --type=epic task list
--parent=t-abc123
Completed task: t-8WR5Zg
Amp-Thread-ID:
https://ampcode.com/threads/T-85f4ee29-a529-4f59-ac6f-6ffec75b6a56
Co-authored-by: Amp <amp@ampcode.com>
|
|
Updated namespace handling to use the Omni.Namespace module: - Import
Omni.Namespace in Task CLI - Parse and validate namespace strings
using fromHaskellModule - Convert to proper path format using toPath -
Ensures namespaces are well-formed (e.g., Omni/Task -> Omni/Task.hs)
Example:
task create "Fix bug" project --namespace="Omni/Task" # Creates
task with validated namespace Omni/Task.hs
This provides type safety and ensures all task namespaces correspond
to actual code namespaces in the monorepo.
Amp-Thread-ID:
https://ampcode.com/threads/T-85f4ee29-a529-4f59-ac6f-6ffec75b6a56
Co-authored-by: Amp <amp@ampcode.com>
|