- ADR-033: Database migration redesign - ADR-034: Full-text search with FTS5 - ADR-035: Custom slugs in Micropub - ADR-036: IndieAuth token verification method - ADR-039: Micropub URL construction fix - Implementation plan and decisions - Architecture specifications - Validation reports for implementation and search UI 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
9.3 KiB
StarPunk v1.1.0 Implementation Plan
Executive Summary
Version 1.1.0 focuses on three high-value features that enhance usability while maintaining our minimal philosophy. This release addresses critical technical debt (migration system), adds essential functionality (search), and improves user control (custom slugs).
Release Overview
- Version: 1.1.0
- Codename: "Searchlight"
- Theme: Enhanced discovery and control
- Estimated Effort: 16-20 hours
- Priority: High (addresses user feedback and technical debt)
Critical Issue: RSS Feed Ordering
Investigation Results
Finding: The RSS feed is already correctly implemented in reverse chronological order (newest first).
Evidence:
list_notes()function defaults toorder_dir="DESC"(descending = newest first)- SQL query uses
ORDER BY created_at DESC - Feed generation receives notes in correct order
Conclusion: No bug exists. The user's perception may be incorrect, or they may be seeing cached content.
Action Required: None. Document the correct behavior and suggest cache clearing if users report chronological ordering.
Feature Components
1. Database Migration System Redesign (CRITICAL)
Priority: CRITICAL - Must be done first ADR: ADR-033 Effort: 4-6 hours
Problem
- Duplicate schema definitions in SCHEMA_SQL and migration files
- Risk of schema drift between fresh installs and upgrades
- Violates DRY principle
Solution Architecture
# New structure
INITIAL_SCHEMA_SQL = """-- v1.0.0 schema frozen in time"""
migrations = [
# Only changes after v1.0.0
"001_add_search_index.sql",
"002_add_custom_fields.sql"
]
def initialize_database():
if fresh_install():
execute(INITIAL_SCHEMA_SQL)
mark_as_v1_0_0()
apply_pending_migrations()
Implementation Tasks
-
Extract v1.0.0 Schema (1 hour)
- Document current production schema
- Create INITIAL_SCHEMA_SQL constant
- Verify against existing installations
-
Refactor Migration System (2 hours)
- Modify
migrations.pyto use new approach - Separate fresh install from upgrade path
- Update version tracking logic
- Modify
-
Migration Files Cleanup (1 hour)
- Remove redundant schema from existing migrations
- Keep only incremental changes
- Verify migration sequence
-
Testing (2 hours)
- Test fresh installation path
- Test upgrade from v1.0.0
- Test upgrade from v1.0.1
- Verify schema consistency
Risks
- Breaking existing installations if not careful
- Must maintain backward compatibility
- Need thorough testing of both paths
2. Full-Text Search with FTS5
Priority: HIGH - Most requested feature ADR: ADR-034 Effort: 6-8 hours
Architecture Design
-- FTS virtual table
CREATE VIRTUAL TABLE notes_fts USING fts5(
slug UNINDEXED,
title,
content,
tokenize='porter unicode61'
);
-- Sync triggers
CREATE TRIGGER notes_fts_sync_insert ...
CREATE TRIGGER notes_fts_sync_update ...
CREATE TRIGGER notes_fts_sync_delete ...
API Design
@app.route('/api/search')
def search():
query = request.args.get('q')
results = db.execute("""
SELECT slug, snippet(notes_fts, 2, '<mark>', '</mark>', '...', 30)
FROM notes_fts
WHERE notes_fts MATCH ?
ORDER BY rank
LIMIT 20
""", [query])
return jsonify(results)
Implementation Tasks
-
Database Schema (2 hours)
- Create FTS5 migration
- Implement sync triggers
- Build initial index
-
Search API (2 hours)
- Create
/api/searchendpoint - Implement query validation
- Add result ranking and snippets
- Handle pagination
- Create
-
Search UI (2 hours)
- Add search box to navigation
- Create results page template
- Implement result highlighting
- Add query syntax help
-
Testing (2 hours)
- Test various query types
- Benchmark performance
- Verify trigger synchronization
- Test Unicode content
Performance Targets
- Index building: <1ms per note
- Search latency: <10ms for 10,000 notes
- Index size: ~30% of text size
3. Custom Slugs via Micropub
Priority: MEDIUM - Standards compliance ADR: ADR-035 Effort: 4-5 hours
Design
def create_note_with_slug(content, custom_slug=None):
if custom_slug:
slug = sanitize_slug(custom_slug)
if not validate_slug(slug):
raise InvalidSlugError()
if slug_exists(slug):
slug = make_unique(slug)
else:
slug = generate_slug(content)
return create_note(content, slug=slug)
Validation Rules
- Pattern:
^[a-z0-9]+(?:-[a-z0-9]+)*(?:/[a-z0-9]+(?:-[a-z0-9]+)*)*$ - Max length: 200 characters
- Reserved words:
api,admin,auth,feed - Uniqueness with auto-increment on conflict
Implementation Tasks
-
Core Slug Logic (2 hours)
- Add slug parameter to note creation
- Implement validation function
- Add uniqueness checking
- Handle conflicts
-
Micropub Integration (1 hour)
- Extract
mp-slugproperty - Pass to note creation
- Handle validation errors
- Return proper responses
- Extract
-
Testing (1.5 hours)
- Test valid/invalid slugs
- Test conflict resolution
- Test with real Micropub clients
- Test backward compatibility
Security Considerations
- Prevent path traversal (
../) - Block reserved system routes
- Enforce character whitelist
- Normalize case (lowercase only)
Implementation Sequence
Phase 1: Critical Foundation (Week 1)
- Migration System Redesign (FIRST - blocks everything else)
- Must be complete before adding new migrations
- Ensures clean path for FTS5 tables
- 4-6 hours
Phase 2: Core Features (Week 1-2)
-
Full-Text Search
- Can begin after migration system ready
- High user value, most requested
- 6-8 hours
-
Custom Slugs
- Can be done in parallel with search
- Lower complexity, good for end of sprint
- 4-5 hours
Phase 3: Polish & Release (Week 2)
- Integration Testing (2 hours)
- Documentation Updates (1 hour)
- Release Process (1 hour)
Risk Analysis
High Risks
-
Migration System Breaking Changes
- Mitigation: Extensive testing, backup instructions
- Contingency: Rollback procedure documented
-
FTS5 Not Available
- Mitigation: Check SQLite version in setup
- Contingency: Graceful degradation
Medium Risks
-
Search Performance Issues
- Mitigation: Index size monitoring
- Contingency: Add caching layer
-
Slug Conflicts
- Mitigation: Auto-increment suffix
- Contingency: Return clear error messages
Low Risks
- Increased Database Size
- Expected: ~30% increase from FTS
- Acceptable for functionality gained
Success Criteria
Functional Requirements
- Migration system uses single schema source
- Search returns relevant results in <10ms
- Custom slugs accepted via Micropub
- All existing tests pass
- No breaking changes to API
Performance Requirements
- Search latency <10ms for 1000 notes
- Migration completes in <1 second
- No degradation in note creation time
Quality Requirements
- 100% backward compatibility
- No data loss during migration
- Clear error messages for invalid slugs
- Search results properly escaped (XSS prevention)
Testing Strategy
Unit Tests
- Migration path logic
- Slug validation functions
- Search query parsing
- FTS trigger behavior
Integration Tests
- Fresh install flow
- Upgrade from v1.0.0/v1.0.1
- Micropub with custom slugs
- Search API responses
Manual Testing
- Search UI functionality
- Various search queries
- Micropub client compatibility
- Performance benchmarks
Documentation Updates
User Documentation
- Search syntax guide
- Custom slug usage
- Migration instructions
Developer Documentation
- New migration system explanation
- FTS5 implementation details
- Slug validation rules
API Documentation
/api/searchendpointmp-slugproperty handling- Error response formats
Release Checklist
Pre-Release
- All tests passing
- Documentation updated
- CHANGELOG.md updated
- Version bumped to 1.1.0
- Migration tested on copy of production
Release
- Tag v1.1.0
- Build container
- Update release notes
- Announce features
Post-Release
- Monitor for issues
- Gather user feedback
- Plan v1.2.0 based on feedback
Estimated Timeline
Week 1 (20-25 hours)
- Day 1-2: Migration system redesign (6h)
- Day 3-4: Full-text search implementation (8h)
- Day 5: Custom slugs implementation (5h)
Week 2 (5-8 hours)
- Day 1: Integration testing (2h)
- Day 2: Documentation and release prep (3h)
- Day 3: Release and monitoring
Total Estimated Effort: 16-20 hours of focused development
Conclusion
Version 1.1.0 represents a significant improvement in usability while maintaining our minimal philosophy. The migration system redesign eliminates technical debt, full-text search adds essential functionality, and custom slugs improve standards compliance.
The implementation should proceed in the order specified, with the migration system being absolutely critical to complete first. Each feature has been designed to be simple, elegant, and maintainable.
Remember our core principle: "Every line of code must justify its existence."