limn-review 0.1.123
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +110 -0
- package/README.md +133 -0
- package/dist/ai/runtime.js +535 -0
- package/dist/api/plugins/auth.js +169 -0
- package/dist/api/plugins/error-handler.js +114 -0
- package/dist/api/plugins/rate-limit.js +855 -0
- package/dist/api/plugins/security.js +321 -0
- package/dist/api/routes/activity.js +103 -0
- package/dist/api/routes/ai-runtime.js +67 -0
- package/dist/api/routes/auth.js +194 -0
- package/dist/api/routes/billing.js +209 -0
- package/dist/api/routes/bot-triage.js +1289 -0
- package/dist/api/routes/conflicts.js +730 -0
- package/dist/api/routes/contact.js +318 -0
- package/dist/api/routes/daily-brief.js +58 -0
- package/dist/api/routes/flow.js +71 -0
- package/dist/api/routes/health.js +7 -0
- package/dist/api/routes/insights.js +200 -0
- package/dist/api/routes/me.js +458 -0
- package/dist/api/routes/mentions.js +22 -0
- package/dist/api/routes/mergers.js +8 -0
- package/dist/api/routes/ml-labels.js +109 -0
- package/dist/api/routes/open-prs.js +35 -0
- package/dist/api/routes/prs.js +1633 -0
- package/dist/api/routes/reactions.js +217 -0
- package/dist/api/routes/repos.js +563 -0
- package/dist/api/routes/search.js +41 -0
- package/dist/api/routes/threads.js +118 -0
- package/dist/api/routes/timeline.js +150 -0
- package/dist/api/routes/users.js +67 -0
- package/dist/api/routes/webhooks.js +181 -0
- package/dist/api/routes/workspaces.js +322 -0
- package/dist/app.js +274 -0
- package/dist/ascii.js +19 -0
- package/dist/auth/account.js +482 -0
- package/dist/auth/crypto.js +46 -0
- package/dist/bot-triage/resolve.js +59 -0
- package/dist/cli.js +388 -0
- package/dist/coding/activity.js +80 -0
- package/dist/coding/agent.js +288 -0
- package/dist/coding/ai-fix/auto-fix.js +212 -0
- package/dist/coding/ai-fix/manager.js +370 -0
- package/dist/coding/ai-fix/persist.js +213 -0
- package/dist/coding/ai-fix/pr-context.js +58 -0
- package/dist/coding/ai-fix/prompts.js +138 -0
- package/dist/coding/ai-fix/review-seed.js +357 -0
- package/dist/coding/ai-fix/routes.js +425 -0
- package/dist/coding/git-ops.js +321 -0
- package/dist/coding/git.js +184 -0
- package/dist/coding/merge.js +262 -0
- package/dist/coding/safe-path.js +75 -0
- package/dist/coding/schema.js +43 -0
- package/dist/config.js +648 -0
- package/dist/conflict/diff.js +304 -0
- package/dist/conflict/git.js +118 -0
- package/dist/conflict/hash.js +73 -0
- package/dist/conflict/janitor.js +218 -0
- package/dist/conflict/land.js +675 -0
- package/dist/conflict/model-types.js +2 -0
- package/dist/conflict/model.js +1081 -0
- package/dist/conflict/parse.js +142 -0
- package/dist/conflict/seam.js +136 -0
- package/dist/conflict/session.js +532 -0
- package/dist/conflict/suggestion.js +398 -0
- package/dist/conflict/tokens.js +72 -0
- package/dist/data-dir.js +112 -0
- package/dist/db/actor-lanes.js +213 -0
- package/dist/db/automation-ids.js +97 -0
- package/dist/db/automation-output.js +349 -0
- package/dist/db/blast-radius-query.js +36 -0
- package/dist/db/blast-radius.js +226 -0
- package/dist/db/bot-dormancy.js +115 -0
- package/dist/db/bot-overlap.js +579 -0
- package/dist/db/bot-volume.js +722 -0
- package/dist/db/bot-window.js +35 -0
- package/dist/db/branch-queries.js +310 -0
- package/dist/db/change-shape.js +243 -0
- package/dist/db/changepoint.js +75 -0
- package/dist/db/cleanup.js +36 -0
- package/dist/db/client.js +102 -0
- package/dist/db/code-loc.js +388 -0
- package/dist/db/credits.js +79 -0
- package/dist/db/daily-brief.js +406 -0
- package/dist/db/dependency-cards.js +145 -0
- package/dist/db/erase-account.js +255 -0
- package/dist/db/export-account.js +189 -0
- package/dist/db/failing-checks.js +124 -0
- package/dist/db/file-coupling.js +197 -0
- package/dist/db/flow-detail.js +661 -0
- package/dist/db/flow-pointers.js +197 -0
- package/dist/db/flow-settings.js +67 -0
- package/dist/db/forecast.js +114 -0
- package/dist/db/line-overlap.js +81 -0
- package/dist/db/merge-queue.js +189 -0
- package/dist/db/migrate.js +17 -0
- package/dist/db/migrations/0000_purple_ben_grimm.sql +155 -0
- package/dist/db/migrations/0001_colorful_ozymandias.sql +31 -0
- package/dist/db/migrations/0002_famous_sersi.sql +9 -0
- package/dist/db/migrations/0003_clever_shinobi_shaw.sql +3 -0
- package/dist/db/migrations/0004_pale_scalphunter.sql +1 -0
- package/dist/db/migrations/0005_daffy_guardian.sql +2 -0
- package/dist/db/migrations/0006_cute_violations.sql +45 -0
- package/dist/db/migrations/0007_dark_anthem.sql +2 -0
- package/dist/db/migrations/0008_multitenant_accounts.sql +44 -0
- package/dist/db/migrations/0009_lean_bodies.sql +13 -0
- package/dist/db/migrations/0010_lean_bodies_nullable.sql +56 -0
- package/dist/db/migrations/0011_pr_diff_size.sql +10 -0
- package/dist/db/migrations/0012_findings_included_default.sql +7 -0
- package/dist/db/migrations/0013_review_routing.sql +9 -0
- package/dist/db/migrations/0014_account_last_active.sql +6 -0
- package/dist/db/migrations/0015_repos_inbox_watch.sql +9 -0
- package/dist/db/migrations/0016_repo_viewer_permission.sql +7 -0
- package/dist/db/migrations/0017_account_display_name.sql +7 -0
- package/dist/db/migrations/0018_finding_comment_kind.sql +7 -0
- package/dist/db/migrations/0019_finding_file_in_diff.sql +7 -0
- package/dist/db/migrations/0020_claude_review_cost_telemetry.sql +11 -0
- package/dist/db/migrations/0021_account_feed_last_seen.sql +7 -0
- package/dist/db/migrations/0022_ci_status_events.sql +21 -0
- package/dist/db/migrations/0023_ai_usage.sql +21 -0
- package/dist/db/migrations/0024_pr_head_ref_name.sql +6 -0
- package/dist/db/migrations/0025_account_billing.sql +7 -0
- package/dist/db/migrations/0026_ai_credit_allowance.sql +5 -0
- package/dist/db/migrations/0027_user_github_type.sql +6 -0
- package/dist/db/migrations/0028_bot_review_classification.sql +21 -0
- package/dist/db/migrations/0029_bot_mute_rules.sql +19 -0
- package/dist/db/migrations/0030_teams.sql +32 -0
- package/dist/db/migrations/0031_events_pr_idx.sql +7 -0
- package/dist/db/migrations/0032_benchmark_contributions.sql +29 -0
- package/dist/db/migrations/0033_thread_addressed_confidence.sql +9 -0
- package/dist/db/migrations/0034_thread_resolved_at.sql +6 -0
- package/dist/db/migrations/0035_pr_first_review_requested_at.sql +5 -0
- package/dist/db/migrations/0036_search_index.sql +25 -0
- package/dist/db/migrations/0037_author_indexes.sql +15 -0
- package/dist/db/migrations/0038_auto_merge_requests.sql +37 -0
- package/dist/db/migrations/0039_branch_status.sql +44 -0
- package/dist/db/migrations/0040_pr_review_decision.sql +10 -0
- package/dist/db/migrations/0041_branch_commit_detail.sql +38 -0
- package/dist/db/migrations/0042_repo_reviewers.sql +176 -0
- package/dist/db/migrations/0043_account_reviewers.sql +131 -0
- package/dist/db/migrations/0044_workspaces.sql +138 -0
- package/dist/db/migrations/0045_workspace_reviewers.sql +180 -0
- package/dist/db/migrations/0046_drop_inbox_watch.sql +25 -0
- package/dist/db/migrations/0047_ml_comment_labels.sql +40 -0
- package/dist/db/migrations/0048_ml_vendor_severity.sql +31 -0
- package/dist/db/migrations/0049_seat_pricing_repo_description.sql +21 -0
- package/dist/db/migrations/0050_users_app_slug.sql +12 -0
- package/dist/db/migrations/0051_auto_merge_queue.sql +17 -0
- package/dist/db/migrations/0052_trunk_ci_status_events.sql +43 -0
- package/dist/db/migrations/0053_automation_roles.sql +79 -0
- package/dist/db/migrations/0054_automation_vendor_kinds.sql +514 -0
- package/dist/db/migrations/0055_auto_merge_phase.sql +12 -0
- package/dist/db/migrations/0056_pr_mentions.sql +22 -0
- package/dist/db/migrations/0057_large_pr_threshold.sql +14 -0
- package/dist/db/migrations/0058_pending_mute.sql +53 -0
- package/dist/db/migrations/0059_merge_queue_state.sql +33 -0
- package/dist/db/migrations/0060_drop_my_turn_dismissals.sql +33 -0
- package/dist/db/migrations/0061_auto_merge_durable_anchors.sql +27 -0
- package/dist/db/migrations/0062_blast_radius_config.sql +21 -0
- package/dist/db/migrations/0063_repo_file_coupling.sql +33 -0
- package/dist/db/migrations/0064_pr_content_kind.sql +21 -0
- package/dist/db/migrations/0065_workspace_flow_settings.sql +13 -0
- package/dist/db/migrations/0066_review_request_events.sql +31 -0
- package/dist/db/migrations/0067_pr_security_signals.sql +86 -0
- package/dist/db/migrations/0068_my_turn_settings.sql +18 -0
- package/dist/db/migrations/0069_my_turn_dismissals.sql +41 -0
- package/dist/db/migrations/0070_claude_review_follow_up_ticket.sql +22 -0
- package/dist/db/migrations/0071_claude_review_trigger.sql +11 -0
- package/dist/db/migrations/0072_commit_message_headline.sql +13 -0
- package/dist/db/migrations/0073_claude_review_chat.sql +31 -0
- package/dist/db/migrations/0074_adopt_agentic_tables.sql +98 -0
- package/dist/db/migrations/0075_review_lens_drop_learnings.sql +15 -0
- package/dist/db/migrations/0076_claude_review_threads.sql +17 -0
- package/dist/db/migrations/0077_claude_review_ci_failures.sql +10 -0
- package/dist/db/migrations/0078_ai_fix_change_report.sql +17 -0
- package/dist/db/migrations/0079_claude_finding_story.sql +16 -0
- package/dist/db/migrations/meta/0000_snapshot.json +1116 -0
- package/dist/db/migrations/meta/0001_snapshot.json +1321 -0
- package/dist/db/migrations/meta/0002_snapshot.json +1375 -0
- package/dist/db/migrations/meta/0003_snapshot.json +1396 -0
- package/dist/db/migrations/meta/0004_snapshot.json +1416 -0
- package/dist/db/migrations/meta/0005_snapshot.json +1430 -0
- package/dist/db/migrations/meta/0006_snapshot.json +1745 -0
- package/dist/db/migrations/meta/0007_snapshot.json +1759 -0
- package/dist/db/migrations/meta/_journal.json +566 -0
- package/dist/db/migrations-pg/0000_tired_alex_power.sql +268 -0
- package/dist/db/migrations-pg/0001_dizzy_mockingbird.sql +3 -0
- package/dist/db/migrations-pg/0002_glorious_ikaris.sql +4 -0
- package/dist/db/migrations-pg/0003_melted_secret_warriors.sql +2 -0
- package/dist/db/migrations-pg/0004_numerous_triton.sql +1 -0
- package/dist/db/migrations-pg/0005_thick_blockbuster.sql +2 -0
- package/dist/db/migrations-pg/0006_majestic_dracula.sql +1 -0
- package/dist/db/migrations-pg/0007_same_human_torch.sql +2 -0
- package/dist/db/migrations-pg/0008_slimy_toxin.sql +1 -0
- package/dist/db/migrations-pg/0009_fuzzy_jubilee.sql +4 -0
- package/dist/db/migrations-pg/0010_late_hammerhead.sql +1 -0
- package/dist/db/migrations-pg/0011_happy_leech.sql +16 -0
- package/dist/db/migrations-pg/0012_woozy_captain_midlands.sql +16 -0
- package/dist/db/migrations-pg/0013_yielding_nicolaos.sql +1 -0
- package/dist/db/migrations-pg/0014_wakeful_bill_hollister.sql +2 -0
- package/dist/db/migrations-pg/0015_aspiring_black_tom.sql +1 -0
- package/dist/db/migrations-pg/0016_cute_ghost_rider.sql +30 -0
- package/dist/db/migrations-pg/0017_far_changeling.sql +24 -0
- package/dist/db/migrations-pg/0018_fancy_miss_america.sql +1 -0
- package/dist/db/migrations-pg/0019_benchmark_contributions.sql +22 -0
- package/dist/db/migrations-pg/0020_majestic_edwin_jarvis.sql +3 -0
- package/dist/db/migrations-pg/0021_green_salo.sql +1 -0
- package/dist/db/migrations-pg/0022_wise_baron_strucker.sql +1 -0
- package/dist/db/migrations-pg/0023_search_index.sql +19 -0
- package/dist/db/migrations-pg/0024_author_indexes.sql +9 -0
- package/dist/db/migrations-pg/0025_auto_merge_requests.sql +26 -0
- package/dist/db/migrations-pg/0026_branch_status.sql +32 -0
- package/dist/db/migrations-pg/0027_pr_review_decision.sql +5 -0
- package/dist/db/migrations-pg/0028_branch_commit_detail.sql +9 -0
- package/dist/db/migrations-pg/0029_repo_reviewers.sql +127 -0
- package/dist/db/migrations-pg/0030_account_reviewers.sql +77 -0
- package/dist/db/migrations-pg/0031_workspaces.sql +131 -0
- package/dist/db/migrations-pg/0032_workspace_reviewers.sql +165 -0
- package/dist/db/migrations-pg/0033_drop_inbox_watch.sql +14 -0
- package/dist/db/migrations-pg/0034_ml_comment_labels.sql +33 -0
- package/dist/db/migrations-pg/0035_ml_vendor_severity.sql +16 -0
- package/dist/db/migrations-pg/0036_seat_pricing_repo_description.sql +12 -0
- package/dist/db/migrations-pg/0037_users_app_slug.sql +9 -0
- package/dist/db/migrations-pg/0038_auto_merge_queue.sql +10 -0
- package/dist/db/migrations-pg/0039_trunk_ci_status_events.sql +27 -0
- package/dist/db/migrations-pg/0040_automation_roles.sql +63 -0
- package/dist/db/migrations-pg/0041_automation_vendor_kinds.sql +488 -0
- package/dist/db/migrations-pg/0042_auto_merge_phase.sql +8 -0
- package/dist/db/migrations-pg/0043_pr_mentions.sql +19 -0
- package/dist/db/migrations-pg/0044_large_pr_threshold.sql +6 -0
- package/dist/db/migrations-pg/0045_pending_mute.sql +26 -0
- package/dist/db/migrations-pg/0046_merge_queue_state.sql +18 -0
- package/dist/db/migrations-pg/0047_drop_my_turn_dismissals.sql +21 -0
- package/dist/db/migrations-pg/0048_auto_merge_durable_anchors.sql +27 -0
- package/dist/db/migrations-pg/0049_blast_radius_config.sql +8 -0
- package/dist/db/migrations-pg/0050_repo_file_coupling.sql +13 -0
- package/dist/db/migrations-pg/0051_pr_content_kind.sql +6 -0
- package/dist/db/migrations-pg/0052_workspace_flow_settings.sql +4 -0
- package/dist/db/migrations-pg/0053_review_request_events.sql +18 -0
- package/dist/db/migrations-pg/0054_pr_security_signals.sql +59 -0
- package/dist/db/migrations-pg/0055_my_turn_settings.sql +6 -0
- package/dist/db/migrations-pg/0056_my_turn_dismissals.sql +21 -0
- package/dist/db/migrations-pg/0057_claude_review_follow_up_ticket.sql +8 -0
- package/dist/db/migrations-pg/0058_claude_review_trigger.sql +4 -0
- package/dist/db/migrations-pg/0059_commit_message_headline.sql +3 -0
- package/dist/db/migrations-pg/0060_claude_review_chat.sql +24 -0
- package/dist/db/migrations-pg/0061_adopt_agentic_tables.sql +79 -0
- package/dist/db/migrations-pg/0062_review_lens_drop_learnings.sql +5 -0
- package/dist/db/migrations-pg/0063_claude_review_threads.sql +7 -0
- package/dist/db/migrations-pg/0064_claude_review_ci_failures.sql +4 -0
- package/dist/db/migrations-pg/0065_ai_fix_change_report.sql +9 -0
- package/dist/db/migrations-pg/0066_claude_finding_story.sql +7 -0
- package/dist/db/migrations-pg/meta/0000_snapshot.json +2137 -0
- package/dist/db/migrations-pg/meta/0001_snapshot.json +2143 -0
- package/dist/db/migrations-pg/meta/0002_snapshot.json +2170 -0
- package/dist/db/migrations-pg/meta/0003_snapshot.json +2182 -0
- package/dist/db/migrations-pg/meta/0004_snapshot.json +2188 -0
- package/dist/db/migrations-pg/meta/0005_snapshot.json +2201 -0
- package/dist/db/migrations-pg/meta/0006_snapshot.json +2207 -0
- package/dist/db/migrations-pg/meta/0007_snapshot.json +2219 -0
- package/dist/db/migrations-pg/meta/0008_snapshot.json +2226 -0
- package/dist/db/migrations-pg/meta/0009_snapshot.json +2250 -0
- package/dist/db/migrations-pg/meta/0010_snapshot.json +2256 -0
- package/dist/db/migrations-pg/meta/0011_snapshot.json +2412 -0
- package/dist/db/migrations-pg/meta/0012_snapshot.json +2528 -0
- package/dist/db/migrations-pg/meta/0013_snapshot.json +2534 -0
- package/dist/db/migrations-pg/meta/0014_snapshot.json +2547 -0
- package/dist/db/migrations-pg/meta/0015_snapshot.json +2553 -0
- package/dist/db/migrations-pg/meta/0016_snapshot.json +2774 -0
- package/dist/db/migrations-pg/meta/0017_snapshot.json +2999 -0
- package/dist/db/migrations-pg/meta/0018_snapshot.json +3020 -0
- package/dist/db/migrations-pg/meta/0020_snapshot.json +3228 -0
- package/dist/db/migrations-pg/meta/0021_snapshot.json +3234 -0
- package/dist/db/migrations-pg/meta/0022_snapshot.json +3240 -0
- package/dist/db/migrations-pg/meta/_journal.json +475 -0
- package/dist/db/ml-labels.js +1666 -0
- package/dist/db/my-turn-dismissals.js +343 -0
- package/dist/db/my-turn-settings.js +34 -0
- package/dist/db/pending-classify.js +46 -0
- package/dist/db/pending-mute.js +171 -0
- package/dist/db/pending-tabs.js +238 -0
- package/dist/db/period-metrics.js +820 -0
- package/dist/db/person-period.js +763 -0
- package/dist/db/pr-intervals.js +930 -0
- package/dist/db/pr-liveness.js +240 -0
- package/dist/db/pr-mentions.js +279 -0
- package/dist/db/pr-merge-queue-stamp.js +91 -0
- package/dist/db/queries.js +14631 -0
- package/dist/db/reaction-targets.js +94 -0
- package/dist/db/repo-activity.js +171 -0
- package/dist/db/retention.js +138 -0
- package/dist/db/review-threads-for-review.js +240 -0
- package/dist/db/run-migrations.js +24 -0
- package/dist/db/schema.pg.js +1220 -0
- package/dist/db/schema.sqlite.js +1801 -0
- package/dist/db/search.js +317 -0
- package/dist/db/security-alerts.js +218 -0
- package/dist/db/synthesis-input.js +565 -0
- package/dist/db/triage.js +320 -0
- package/dist/db/usage.js +63 -0
- package/dist/db/work-plan.js +1086 -0
- package/dist/db/working-hours.js +161 -0
- package/dist/feed/my-turn.js +122 -0
- package/dist/github/actions-logs.js +397 -0
- package/dist/github/auth.js +86 -0
- package/dist/github/branch-queries.js +229 -0
- package/dist/github/client.js +454 -0
- package/dist/github/codeowners.js +221 -0
- package/dist/github/commit-checks.js +105 -0
- package/dist/github/compare.js +110 -0
- package/dist/github/diff-anchor.js +227 -0
- package/dist/github/mutations.js +706 -0
- package/dist/github/pr-file-content.js +254 -0
- package/dist/github/pr-liveness.js +161 -0
- package/dist/github/queries.js +875 -0
- package/dist/github/rate-budget.js +129 -0
- package/dist/github/reactions.js +161 -0
- package/dist/github/reviewer-suggest.js +104 -0
- package/dist/github/team-reviewers.js +96 -0
- package/dist/index.js +184 -0
- package/dist/merge/auto-merge-runner.js +960 -0
- package/dist/ml/severity-client.js +218 -0
- package/dist/pr/detail-enricher.js +26 -0
- package/dist/pro/bind.js +302 -0
- package/dist/pro/contract.js +37 -0
- package/dist/pro/migrate.js +64 -0
- package/dist/review/agent-context.js +127 -0
- package/dist/review/agent.js +385 -0
- package/dist/review/agentic.js +59 -0
- package/dist/review/auth.js +94 -0
- package/dist/review/chat-agent.js +179 -0
- package/dist/review/claude-review/ai-ready.js +16 -0
- package/dist/review/claude-review/auto-settings.js +139 -0
- package/dist/review/claude-review/auto.js +244 -0
- package/dist/review/claude-review/chat.js +489 -0
- package/dist/review/claude-review/ci-failures.js +350 -0
- package/dist/review/claude-review/follow-up.js +310 -0
- package/dist/review/claude-review/manager.js +686 -0
- package/dist/review/claude-review/persist.js +996 -0
- package/dist/review/claude-review/prompts.js +357 -0
- package/dist/review/claude-review/routes.js +518 -0
- package/dist/review/claude-review/routing.js +61 -0
- package/dist/review/claude-review/specialists.js +190 -0
- package/dist/review/claude-review/threads.js +265 -0
- package/dist/review/claude-review/ticket.js +282 -0
- package/dist/review/clone-hygiene.js +380 -0
- package/dist/review/clone-manager.js +367 -0
- package/dist/review/llm.js +113 -0
- package/dist/review/model-options.js +48 -0
- package/dist/review/plugin-providers.js +12 -0
- package/dist/review/post-review.js +216 -0
- package/dist/review/post-seam.js +161 -0
- package/dist/review/prepare.js +168 -0
- package/dist/review/pricing.js +17 -0
- package/dist/review/schema.js +156 -0
- package/dist/review/submit-map.js +41 -0
- package/dist/review/usage.js +90 -0
- package/dist/shared/claude-review.js +335 -0
- package/dist/shared/conflict-fold.js +151 -0
- package/dist/shared/conflicts.js +30 -0
- package/dist/shared/flow-settings.js +191 -0
- package/dist/shared/index.js +8 -0
- package/dist/shared/my-turn-settings.js +238 -0
- package/dist/shared/pending-rules.js +281 -0
- package/dist/shared/product.js +54 -0
- package/dist/shared/types.js +896 -0
- package/dist/status.js +386 -0
- package/dist/sync/adaptive.js +185 -0
- package/dist/sync/app-attribution.js +66 -0
- package/dist/sync/auth-notices.js +36 -0
- package/dist/sync/backfill-ci-history.js +315 -0
- package/dist/sync/backfill-commit-headlines.js +136 -0
- package/dist/sync/backfill-pr-security.js +175 -0
- package/dist/sync/backfill-review-requests.js +97 -0
- package/dist/sync/benchmark-rollup.js +50 -0
- package/dist/sync/bot-detection.js +309 -0
- package/dist/sync/bot-resolution-markers.js +30 -0
- package/dist/sync/branch-status.js +634 -0
- package/dist/sync/classify-change-shape.js +150 -0
- package/dist/sync/commit-files.js +74 -0
- package/dist/sync/derive-thread-state.js +99 -0
- package/dist/sync/drain-review-threads.js +212 -0
- package/dist/sync/hydrate-detail.js +482 -0
- package/dist/sync/mention-scan.js +89 -0
- package/dist/sync/ml-enrichment.js +478 -0
- package/dist/sync/pr-change-signal.js +96 -0
- package/dist/sync/pr-liveness-sweep.js +139 -0
- package/dist/sync/pr-settle.js +381 -0
- package/dist/sync/refresh-pr.js +163 -0
- package/dist/sync/reparse-vendor-badges.js +495 -0
- package/dist/sync/resync-after-write.js +280 -0
- package/dist/sync/review-fingerprint.js +117 -0
- package/dist/sync/reviewer-behavior.js +103 -0
- package/dist/sync/reviewer-classify.js +503 -0
- package/dist/sync/routing-files.js +97 -0
- package/dist/sync/scheduled-jobs.js +12 -0
- package/dist/sync/scheduler.js +159 -0
- package/dist/sync/security-detect.js +521 -0
- package/dist/sync/sync-manager.js +750 -0
- package/dist/sync/sync-one-pr.js +205 -0
- package/dist/sync/sync-repo.js +400 -0
- package/dist/sync/unsettled-prs.js +506 -0
- package/dist/sync/upsert.js +1190 -0
- package/package.json +56 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/assets/AiFixTab-CQP6PT5u.js +2 -0
- package/public/assets/ClaudeReviewTab-DQJ-58ZA.js +8 -0
- package/public/assets/PrBotBehaviourTab-CCnFrWbC.js +1 -0
- package/public/assets/archivo-latin-600-BN-JkNrl.woff2 +0 -0
- package/public/assets/highlight-BEHUn5zE.css +10 -0
- package/public/assets/highlight-CIIZLa6Z.js +12 -0
- package/public/assets/index-BDnYs6zg.js +73 -0
- package/public/assets/index-mCuI--RC.css +1 -0
- package/public/assets/markdown-I_JLLVAZ.js +32 -0
- package/public/assets/perfProbe-Da13EhTE.js +1 -0
- package/public/assets/tanstack-5qsxxaLe.js +17 -0
- package/public/assets/vis-C3BCkP5U.js +1280 -0
- package/public/assets/vis-ziCVehMy.css +1 -0
- package/public/favicon-16.png +0 -0
- package/public/favicon-32.png +0 -0
- package/public/favicon-48.png +0 -0
- package/public/favicon.svg +5 -0
- package/public/index.html +41 -0
- package/public-landing/apple-touch-icon.png +0 -0
- package/public-landing/assets/archivo-latin-500-BWmvx2Mg.woff2 +0 -0
- package/public-landing/assets/archivo-latin-600-BN-JkNrl.woff2 +0 -0
- package/public-landing/assets/index-CA3eEGXO.js +40 -0
- package/public-landing/assets/index-naQrQ6Fe.css +1 -0
- package/public-landing/assets/jetbrains-mono-latin-400-RruCX7RW.woff2 +0 -0
- package/public-landing/assets/newsreader-latin-400-DExrRRrN.woff2 +0 -0
- package/public-landing/assets/newsreader-latin-400-italic-b0I-AwbV.woff2 +0 -0
- package/public-landing/bots/index.html +156 -0
- package/public-landing/contact/index.html +156 -0
- package/public-landing/cookies/index.html +156 -0
- package/public-landing/demo/limn-walkthrough-poster.jpg +0 -0
- package/public-landing/demo/limn-walkthrough.cues.json +44 -0
- package/public-landing/demo/limn-walkthrough.mp4 +0 -0
- package/public-landing/favicon-16.png +0 -0
- package/public-landing/favicon-32.png +0 -0
- package/public-landing/favicon-48.png +0 -0
- package/public-landing/favicon.svg +5 -0
- package/public-landing/features/index.html +156 -0
- package/public-landing/for-developers/index.html +156 -0
- package/public-landing/for-managers/index.html +156 -0
- package/public-landing/how-it-works/index.html +156 -0
- package/public-landing/how-we-measure/index.html +156 -0
- package/public-landing/icon-192.png +0 -0
- package/public-landing/icon-512.png +0 -0
- package/public-landing/index.html +156 -0
- package/public-landing/insights/index.html +156 -0
- package/public-landing/og-image.png +0 -0
- package/public-landing/pricing/index.html +156 -0
- package/public-landing/privacy/index.html +156 -0
- package/public-landing/pro/index.html +156 -0
- package/public-landing/reviews/index.html +156 -0
- package/public-landing/robots.txt +8 -0
- package/public-landing/shots/benchmark.png +0 -0
- package/public-landing/shots/bot-roi.png +0 -0
- package/public-landing/shots/bot-settings.png +0 -0
- package/public-landing/shots/chronology.png +0 -0
- package/public-landing/shots/feed.png +0 -0
- package/public-landing/shots/flow-metrics.png +0 -0
- package/public-landing/shots/free-reports.png +0 -0
- package/public-landing/shots/pending-board.png +0 -0
- package/public-landing/shots/pending-card.png +0 -0
- package/public-landing/shots/period-report.png +0 -0
- package/public-landing/shots/pr-detail.png +0 -0
- package/public-landing/shots/pr-threads.png +0 -0
- package/public-landing/shots/reach.png +0 -0
- package/public-landing/shots/repo-rows.png +0 -0
- package/public-landing/shots/severity-findings.png +0 -0
- package/public-landing/shots/severity-strip.png +0 -0
- package/public-landing/site.webmanifest +14 -0
- package/public-landing/sitemap.xml +51 -0
- package/public-landing/terms/index.html +156 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:700px){.container{max-width:700px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1080px){.container{max-width:1080px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.bottom-0{bottom:0}.left-2{left:.5rem}.left-\[-9999px\]{left:-9999px}.right-2{right:.5rem}.top-1\/2{top:50%}.top-auto{top:auto}.z-0{z-index:0}.z-10{z-index:10}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[101\]{z-index:101}.mx-auto{margin-left:auto;margin-right:auto}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-11{margin-bottom:2.75rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-7{margin-bottom:1.75rem}.mb-8{margin-bottom:2rem}.mb-9{margin-bottom:2.25rem}.mb-\[18px\]{margin-bottom:18px}.mb-\[26px\]{margin-bottom:26px}.mb-\[30px\]{margin-bottom:30px}.mb-\[34px\]{margin-bottom:34px}.ml-5{margin-left:1.25rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-7{margin-top:1.75rem}.mt-8{margin-top:2rem}.mt-\[18px\]{margin-top:18px}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-3\.5{height:.875rem}.h-5{height:1.25rem}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-full{max-height:100%}.min-h-0{min-height:0px}.min-h-screen{min-height:100vh}.w-3\.5{width:.875rem}.w-5{width:1.25rem}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[36rem\]{min-width:36rem}.max-w-\[19ch\]{max-width:19ch}.max-w-\[20ch\]{max-width:20ch}.max-w-\[22ch\]{max-width:22ch}.max-w-\[24ch\]{max-width:24ch}.max-w-\[26ch\]{max-width:26ch}.max-w-\[28ch\]{max-width:28ch}.max-w-\[30ch\]{max-width:30ch}.max-w-\[32ch\]{max-width:32ch}.max-w-\[52ch\]{max-width:52ch}.max-w-\[56ch\]{max-width:56ch}.max-w-\[58ch\]{max-width:58ch}.max-w-\[62ch\]{max-width:62ch}.max-w-\[68ch\]{max-width:68ch}.max-w-\[78ch\]{max-width:78ch}.max-w-answer{max-width:74ch}.max-w-canvas{max-width:1280px}.max-w-caption{max-width:84ch}.max-w-full{max-width:100%}.max-w-lede{max-width:60ch}.max-w-none{max-width:none}.max-w-reassure{max-width:66ch}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-y{resize:vertical}.resize{resize:both}.scroll-mt-16{scroll-margin-top:4rem}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1\.5{gap:.375rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-5{gap:1.25rem}.gap-8{gap:2rem}.gap-\[10px\]{gap:10px}.gap-grid-gutter{gap:40px}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-x-grid-gutter{-moz-column-gap:40px;column-gap:40px}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.gap-y-8{row-gap:2rem}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.875rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-pretty{text-wrap:pretty}.rounded{border-radius:0}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-ink{--tw-border-opacity: 1;border-color:rgb(22 22 26 / var(--tw-border-opacity, 1))}.border-on-dark-secondary\/40{border-color:#9a9a9466}.border-rule{--tw-border-opacity: 1;border-color:rgb(226 226 220 / var(--tw-border-opacity, 1))}.border-rule-hair{--tw-border-opacity: 1;border-color:rgb(237 237 232 / var(--tw-border-opacity, 1))}.border-rule-strong{--tw-border-opacity: 1;border-color:rgb(220 220 214 / var(--tw-border-opacity, 1))}.border-signal-fill{--tw-border-opacity: 1;border-color:rgb(226 73 44 / var(--tw-border-opacity, 1))}.border-b-rule{--tw-border-opacity: 1;border-bottom-color:rgb(226 226 220 / var(--tw-border-opacity, 1))}.border-l-signal-fill{--tw-border-opacity: 1;border-left-color:rgb(226 73 44 / var(--tw-border-opacity, 1))}.border-l-transparent{border-left-color:transparent}.bg-ink{--tw-bg-opacity: 1;background-color:rgb(22 22 26 / var(--tw-bg-opacity, 1))}.bg-ink\/95{background-color:#16161af2}.bg-paper{--tw-bg-opacity: 1;background-color:rgb(250 250 248 / var(--tw-bg-opacity, 1))}.bg-paper-alt{--tw-bg-opacity: 1;background-color:rgb(244 244 239 / var(--tw-bg-opacity, 1))}.bg-signal-text{--tw-bg-opacity: 1;background-color:rgb(193 58 32 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-top{-o-object-position:top;object-position:top}.p-2\.5{padding:.625rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-gutter{padding-left:56px;padding-right:56px}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-14{padding-top:3.5rem;padding-bottom:3.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-\[11px\]{padding-top:11px;padding-bottom:11px}.py-\[15px\]{padding-top:15px;padding-bottom:15px}.py-\[18px\]{padding-top:18px;padding-bottom:18px}.py-\[26px\]{padding-top:26px;padding-bottom:26px}.py-section-y{padding-top:72px;padding-bottom:72px}.py-section-y-lg{padding-top:80px;padding-bottom:80px}.pb-0\.5{padding-bottom:.125rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-\[3px\]{padding-bottom:3px}.pb-\[52px\]{padding-bottom:52px}.pl-3\.5{padding-left:.875rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pr-1{padding-right:.25rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-4{padding-top:1rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pt-\[18px\]{padding-top:18px}.pt-hero-y{padding-top:88px}.text-left{text-align:left}.text-center{text-align:center}.align-top{vertical-align:top}.font-display{font-family:Archivo,system-ui,-apple-system,sans-serif}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace}.font-serif{font-family:Newsreader,Georgia,Times New Roman,serif}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[19px\]{font-size:19px}.text-\[21px\]{font-size:21px}.text-body-sm{font-size:18px;line-height:1.55}.text-h2{font-size:40px;line-height:1.1;letter-spacing:-.025em}.text-h2-sm{font-size:30px;line-height:1.12;letter-spacing:-.025em}.text-h3{font-size:27px;line-height:1.2;letter-spacing:-.02em}.text-h4{font-size:21px;line-height:1.25;letter-spacing:-.015em}.text-hero-sm{font-size:40px;line-height:1.06;letter-spacing:-.032em}.text-lede{font-size:20px;line-height:1.55}.text-list{font-size:17px;line-height:1.5}.text-mono-caption{font-size:12px;line-height:1.65}.text-mono-label{font-size:11px;line-height:1.6;letter-spacing:.14em}.text-mono-label-wide{font-size:11px;line-height:1.6;letter-spacing:.16em}.text-mono-nav{font-size:13px;line-height:1.7}.text-mono-row{font-size:14px;line-height:1.4}.text-price{font-size:46px;line-height:1;letter-spacing:-.03em}.text-pull-quote{font-size:22px;line-height:1.45}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-\[1\.5\],.leading-normal{line-height:1.5}.tracking-\[-0\.02em\]{letter-spacing:-.02em}.tracking-\[-0\.03em\]{letter-spacing:-.03em}.text-ink{--tw-text-opacity: 1;color:rgb(22 22 26 / var(--tw-text-opacity, 1))}.text-ink-body{--tw-text-opacity: 1;color:rgb(42 42 46 / var(--tw-text-opacity, 1))}.text-ink-soft{--tw-text-opacity: 1;color:rgb(58 58 62 / var(--tw-text-opacity, 1))}.text-muted{--tw-text-opacity: 1;color:rgb(90 90 94 / var(--tw-text-opacity, 1))}.text-nav-idle{--tw-text-opacity: 1;color:rgb(74 74 78 / var(--tw-text-opacity, 1))}.text-on-dark-body{--tw-text-opacity: 1;color:rgb(220 220 214 / var(--tw-text-opacity, 1))}.text-on-dark-secondary{--tw-text-opacity: 1;color:rgb(154 154 148 / var(--tw-text-opacity, 1))}.text-on-dark-tertiary{--tw-text-opacity: 1;color:rgb(165 165 160 / var(--tw-text-opacity, 1))}.text-paper{--tw-text-opacity: 1;color:rgb(250 250 248 / var(--tw-text-opacity, 1))}.text-secondary{--tw-text-opacity: 1;color:rgb(106 106 101 / var(--tw-text-opacity, 1))}.text-signal-text{--tw-text-opacity: 1;color:rgb(193 58 32 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-white\/5{--tw-ring-color: rgb(255 255 255 / .05)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-hover{transition-duration:.12s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-standard{transition-timing-function:cubic-bezier(.2,0,0,1)}@font-face{font-family:Archivo;font-style:normal;font-weight:500;font-display:swap;src:url(/assets/archivo-latin-500-BWmvx2Mg.woff2) format("woff2")}@font-face{font-family:Archivo;font-style:normal;font-weight:600;font-display:swap;src:url(/assets/archivo-latin-600-BN-JkNrl.woff2) format("woff2")}@font-face{font-family:Newsreader;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/newsreader-latin-400-DExrRRrN.woff2) format("woff2")}@font-face{font-family:Newsreader;font-style:italic;font-weight:400;font-display:swap;src:url(/assets/newsreader-latin-400-italic-b0I-AwbV.woff2) format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/jetbrains-mono-latin-400-RruCX7RW.woff2) format("woff2")}:root{color-scheme:light}html,body{margin:0}body{--tw-bg-opacity: 1;background-color:rgb(250 250 248 / var(--tw-bg-opacity, 1));font-family:Newsreader,Georgia,Times New Roman,serif;font-size:19px;line-height:1.6;--tw-text-opacity: 1;color:rgb(42 42 46 / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}details>summary{list-style:none;cursor:pointer}details>summary::-webkit-details-marker{display:none}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}.placeholder\:text-secondary::-moz-placeholder{--tw-text-opacity: 1;color:rgb(106 106 101 / var(--tw-text-opacity, 1))}.placeholder\:text-secondary::placeholder{--tw-text-opacity: 1;color:rgb(106 106 101 / var(--tw-text-opacity, 1))}.last\:border-0:last-child{border-width:0px}.hover\:border-ink:hover{--tw-border-opacity: 1;border-color:rgb(22 22 26 / var(--tw-border-opacity, 1))}.hover\:border-on-dark-primary:hover{--tw-border-opacity: 1;border-color:rgb(250 250 248 / var(--tw-border-opacity, 1))}.hover\:bg-\[\#08080A\]:hover{--tw-bg-opacity: 1;background-color:rgb(8 8 10 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#A6301A\]:hover{--tw-bg-opacity: 1;background-color:rgb(166 48 26 / var(--tw-bg-opacity, 1))}.hover\:bg-ink:hover{--tw-bg-opacity: 1;background-color:rgb(22 22 26 / var(--tw-bg-opacity, 1))}.hover\:bg-paper-alt:hover{--tw-bg-opacity: 1;background-color:rgb(244 244 239 / var(--tw-bg-opacity, 1))}.hover\:text-ink:hover{--tw-text-opacity: 1;color:rgb(22 22 26 / var(--tw-text-opacity, 1))}.hover\:text-on-dark-primary:hover,.hover\:text-paper:hover{--tw-text-opacity: 1;color:rgb(250 250 248 / var(--tw-text-opacity, 1))}.hover\:text-signal-text:hover{--tw-text-opacity: 1;color:rgb(193 58 32 / var(--tw-text-opacity, 1))}.focus\:border-ink:focus{--tw-border-opacity: 1;border-color:rgb(22 22 26 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:-outline-offset-2:focus-visible{outline-offset:-2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-ink:focus-visible{outline-color:#16161a}.focus-visible\:outline-on-dark-primary:focus-visible{outline-color:#fafaf8}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-muted:disabled{--tw-bg-opacity: 1;background-color:rgb(90 90 94 / var(--tw-bg-opacity, 1))}@media(min-width:640px){.sm\:left-4{left:1rem}.sm\:right-4{right:1rem}.sm\:inline{display:inline}.sm\:hidden{display:none}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-4{padding-top:1rem;padding-bottom:1rem}}@media(min-width:700px){.type\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.type\:gap-x-\[30px\]{-moz-column-gap:30px;column-gap:30px}.type\:text-h2{font-size:40px;line-height:1.1;letter-spacing:-.025em}.type\:text-h2-major{font-size:44px;line-height:1.08;letter-spacing:-.025em}.type\:text-h2-minor{font-size:38px;line-height:1.1;letter-spacing:-.025em}.type\:text-hero{font-size:66px;line-height:1.02;letter-spacing:-.032em}.type\:text-page-title{font-size:58px;line-height:1.03;letter-spacing:-.03em}}@media(min-width:1080px){.rail\:col-span-2{grid-column:span 2 / span 2}.rail\:mb-0{margin-bottom:0}.rail\:mb-2\.5{margin-bottom:.625rem}.rail\:mt-0{margin-top:0}.rail\:block{display:block}.rail\:grid{display:grid}.rail\:hidden{display:none}.rail\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.rail\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.rail\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.rail\:grid-cols-\[1\.1fr_1\.3fr_1\.3fr\]{grid-template-columns:1.1fr 1.3fr 1.3fr}.rail\:grid-cols-\[minmax\(0\,1fr\)_280px\]{grid-template-columns:minmax(0,1fr) 280px}.rail\:grid-cols-hero{grid-template-columns:1fr 300px}.rail\:grid-cols-rail{grid-template-columns:84px 1fr 1fr}.rail\:grid-cols-rail-1{grid-template-columns:84px 1fr}.rail\:flex-row{flex-direction:row}.rail\:flex-col{flex-direction:column}.rail\:items-start{align-items:flex-start}.rail\:items-center{align-items:center}.rail\:justify-between{justify-content:space-between}.rail\:gap-0{gap:0px}.rail\:gap-grid-gutter{gap:40px}.rail\:border-b{border-bottom-width:1px}.rail\:border-l{border-left-width:1px}.rail\:border-rule{--tw-border-opacity: 1;border-color:rgb(226 226 220 / var(--tw-border-opacity, 1))}.rail\:border-rule-hair{--tw-border-opacity: 1;border-color:rgb(237 237 232 / var(--tw-border-opacity, 1))}.rail\:pb-\[9px\]{padding-bottom:9px}.rail\:pl-6{padding-left:1.5rem}.rail\:pt-2{padding-top:.5rem}.rail\:pt-\[10px\]{padding-top:10px}}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<meta name="theme-color" content="#FAFAF8" />
|
|
7
|
+
|
|
8
|
+
<!-- Primary SEO. Everything between the seo:start/seo:end markers is REPLACED
|
|
9
|
+
per route at build time by prerender.mjs, from the ROUTE_SEO table in
|
|
10
|
+
src/lib/routes.ts — so /pricing ships its own title, description and
|
|
11
|
+
canonical in the HTML rather than inheriting the home page's. What is
|
|
12
|
+
written here is the home-page copy and the dev-server fallback; keep the
|
|
13
|
+
markers, and keep the copy in sync with ROUTE_SEO['/']. -->
|
|
14
|
+
<title>For engineering managers — see the whole review loop, people and bots</title>
|
|
15
|
+
<meta name="description" content="Throughput, lead time and where the waiting happens across every repository you own, with people counted apart from automation — free. Then a forwardable report per sprint, an hour-by-hour account of who was holding each pull request, and a keep / tune / noisy verdict on every review bot you pay for." />
|
|
16
|
+
<meta name="robots" content="index, follow" />
|
|
17
|
+
<link rel="canonical" href="https://pierre-review.com/for-managers" />
|
|
18
|
+
<meta property="og:type" content="website" />
|
|
19
|
+
<meta property="og:site_name" content="Limn" />
|
|
20
|
+
<meta property="og:title" content="For engineering managers — see the whole review loop, people and bots" />
|
|
21
|
+
<meta property="og:description" content="Throughput, lead time and where the waiting happens across every repository you own, with people counted apart from automation — free. Then a forwardable report per sprint, an hour-by-hour account of who was holding each pull request, and a keep / tune / noisy verdict on every review bot you pay for." />
|
|
22
|
+
<meta property="og:url" content="https://pierre-review.com/for-managers" />
|
|
23
|
+
<meta property="og:image" content="https://pierre-review.com/og-image.png" />
|
|
24
|
+
<meta property="og:image:width" content="1200" />
|
|
25
|
+
<meta property="og:image:height" content="630" />
|
|
26
|
+
<meta property="og:image:alt" content="The Limn board showing everything waiting across a team’s repositories, ranked most actionable first." />
|
|
27
|
+
<meta name="twitter:card" content="summary_large_image" />
|
|
28
|
+
<meta name="twitter:title" content="For engineering managers — see the whole review loop, people and bots" />
|
|
29
|
+
<meta name="twitter:description" content="Throughput, lead time and where the waiting happens across every repository you own, with people counted apart from automation — free. Then a forwardable report per sprint, an hour-by-hour account of who was holding each pull request, and a keep / tune / noisy verdict on every review bot you pay for." />
|
|
30
|
+
<meta name="twitter:image" content="https://pierre-review.com/og-image.png" />
|
|
31
|
+
<meta name="twitter:image:alt" content="The Limn board showing everything waiting across a team’s repositories, ranked most actionable first." />
|
|
32
|
+
|
|
33
|
+
<!-- Favicons: the Limn mark, rendered from apps/landing/src/lib/sprites.ts by
|
|
34
|
+
`node scripts/make-favicons.mjs`. Regenerate there, never by hand. -->
|
|
35
|
+
<!-- ⚠ THE SVG MUST STAY FIRST AND KEEP ITS `type`. A tab slot is 16 CSS px — 32 device px
|
|
36
|
+
at DPR 2 — and Chrome picks ONE of these and scales it, so any pick but an exact 1:1
|
|
37
|
+
raster resamples a grid whose features are one pixel wide and reads as blur. Declared
|
|
38
|
+
this way Chrome takes the SVG and `shape-rendering: crispEdges` snaps it to the device
|
|
39
|
+
grid at every DPR. The PNGs remain for Safari < 16.4 and the big-raster surfaces. -->
|
|
40
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
|
|
41
|
+
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png" />
|
|
42
|
+
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png" />
|
|
43
|
+
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48.png" />
|
|
44
|
+
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
|
45
|
+
<link rel="manifest" href="/site.webmanifest" />
|
|
46
|
+
|
|
47
|
+
<!-- Structured data: helps search engines understand what Limn is.
|
|
48
|
+
LANDMINE: this block sits OUTSIDE the seo:start/end markers, so the
|
|
49
|
+
prerenderer copies it verbatim into EVERY route — /privacy and /terms ship
|
|
50
|
+
this price too. It is a second, site-wide copy of both the product name
|
|
51
|
+
and the price; when either changes it must change here as well as in
|
|
52
|
+
src/lib/routes.ts, src/lib/site.ts and src/components/feint/TierTable.tsx.
|
|
53
|
+
⚠ IT WENT STALE ONCE ALREADY: it advertised Pro at $15 and a Pro+ tier at
|
|
54
|
+
$29 for as long as those were true on a pricing page that no longer
|
|
55
|
+
exists, which is exactly the failure a second copy invites.
|
|
56
|
+
Claude Review and AI Fix are FREE and local-only — they belong in the Free
|
|
57
|
+
offer, never the Pro one (they were "Pro+" once; that tier is gone).
|
|
58
|
+
The $25 stays because it is the real LIST price and the tier table says so;
|
|
59
|
+
the free month is described in the offer text rather than by writing "0",
|
|
60
|
+
which would be a different and wrong claim about what Pro costs. -->
|
|
61
|
+
<script type="application/ld+json">
|
|
62
|
+
{
|
|
63
|
+
"@context": "https://schema.org",
|
|
64
|
+
"@graph": [
|
|
65
|
+
{
|
|
66
|
+
"@type": "Organization",
|
|
67
|
+
"@id": "https://pierre-review.com/#org",
|
|
68
|
+
"name": "Limn",
|
|
69
|
+
"url": "https://pierre-review.com/",
|
|
70
|
+
"logo": "https://pierre-review.com/icon-512.png",
|
|
71
|
+
"sameAs": ["https://github.com/alexwakeman/pierre-review"]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"@type": "WebSite",
|
|
75
|
+
"@id": "https://pierre-review.com/#site",
|
|
76
|
+
"name": "Limn",
|
|
77
|
+
"url": "https://pierre-review.com/",
|
|
78
|
+
"publisher": { "@id": "https://pierre-review.com/#org" }
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"@type": "SoftwareApplication",
|
|
82
|
+
"name": "Limn",
|
|
83
|
+
"applicationCategory": "DeveloperApplication",
|
|
84
|
+
"operatingSystem": "Web, macOS, Linux, Windows",
|
|
85
|
+
"description": "Plans your day across every repository a team works in: one ranked board of what is waiting and on whom, by rules each person sets — plus how the work moved over a sprint, and an independent grade on every AI review bot comment.",
|
|
86
|
+
"url": "https://pierre-review.com/",
|
|
87
|
+
"publisher": { "@id": "https://pierre-review.com/#org" },
|
|
88
|
+
"offers": {
|
|
89
|
+
"@type": "AggregateOffer",
|
|
90
|
+
"priceCurrency": "USD",
|
|
91
|
+
"lowPrice": "0",
|
|
92
|
+
"highPrice": "25",
|
|
93
|
+
"offerCount": "2",
|
|
94
|
+
"offers": [
|
|
95
|
+
{
|
|
96
|
+
"@type": "Offer",
|
|
97
|
+
"name": "Free",
|
|
98
|
+
"description": "The open-core product: the ranked cross-repo Pending board and every setting behind it, triaged review threads, merge and conflict resolution in place, flow metrics per workspace, an independent grade on every bot comment, and — run locally — Claude Review and AI Fix on your own Claude Code or Anthropic API key, with no charge from Limn. No repository limit, no user limit, no expiry.",
|
|
99
|
+
"price": "0",
|
|
100
|
+
"priceCurrency": "USD"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"@type": "Offer",
|
|
104
|
+
"name": "Pro",
|
|
105
|
+
"description": "The roll-up across repositories, people and periods: a forwardable report per sprint, Chronology, the per-bot keep / tune / noisy scoreboard and the peer benchmark, plus written summaries on pull requests, a read on a failed build and a written plan for the day. Claude Review and AI Fix are not part of it: they are free. Lists at $25 per user per month; currently free for a month to anyone who asks via the contact form.",
|
|
106
|
+
"price": "25",
|
|
107
|
+
"priceCurrency": "USD",
|
|
108
|
+
"priceSpecification": {
|
|
109
|
+
"@type": "UnitPriceSpecification",
|
|
110
|
+
"price": "25",
|
|
111
|
+
"priceCurrency": "USD",
|
|
112
|
+
"billingIncrement": 1,
|
|
113
|
+
"unitText": "MONTH"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
"softwareHelp": "https://github.com/alexwakeman/pierre-review"
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
</script>
|
|
123
|
+
|
|
124
|
+
<!-- The three typefaces (Archivo, Newsreader, JetBrains Mono) are SELF-HOSTED:
|
|
125
|
+
the @font-face blocks live in src/index.css and the .woff2 files ship from
|
|
126
|
+
src/fonts/. They are never fetched from Google, for three independent
|
|
127
|
+
reasons — `font-src 'self'` in the landing CSP blocks fonts.gstatic.com,
|
|
128
|
+
`style-src 'self' 'unsafe-inline'` does not permit a <link> to
|
|
129
|
+
fonts.googleapis.com, and a test pins that directive so it fails CI before
|
|
130
|
+
a browser ever sees it. On top of that it is a GDPR requirement: a gstatic
|
|
131
|
+
request discloses every visitor's IP to Google before consent, and Google
|
|
132
|
+
Fonts' recommended <link ... onload="this.media='all'"> would force
|
|
133
|
+
script-src 'unsafe-inline'. Same-origin + font-display:swap keeps them off
|
|
134
|
+
the critical path with no inline handler.
|
|
135
|
+
See apps/backend/src/api/plugins/security.ts. -->
|
|
136
|
+
<script type="module" crossorigin src="/assets/index-CA3eEGXO.js"></script>
|
|
137
|
+
<link rel="stylesheet" crossorigin href="/assets/index-naQrQ6Fe.css">
|
|
138
|
+
</head>
|
|
139
|
+
<body>
|
|
140
|
+
<!-- Everything between app:start/app:end is REPLACED at build time by
|
|
141
|
+
prerender.mjs with the route's fully-rendered markup, so the page has real,
|
|
142
|
+
readable content before a single byte of JS executes — for no-JS visitors,
|
|
143
|
+
for AI agents and crawlers that do not run scripts, and as the first paint
|
|
144
|
+
for everyone else. React's createRoot() replaces it on mount exactly as it
|
|
145
|
+
replaced the splash below.
|
|
146
|
+
|
|
147
|
+
What survives here is the DEV-server fallback (prerender.mjs only rewrites
|
|
148
|
+
the built dist/): a plain wordmark on paper, so the first paint is already
|
|
149
|
+
the right colour instead of a white flash. It is set in system-ui rather
|
|
150
|
+
than Archivo because the bundled font has not loaded at this point — and it
|
|
151
|
+
carries no animation, because the site does not move. -->
|
|
152
|
+
<div id="root">
|
|
153
|
+
<div class="mx-auto min-h-screen max-w-canvas"><header class="border-b border-rule px-gutter py-[26px]"><nav aria-label="Primary" class="flex flex-wrap items-baseline justify-between gap-x-6 gap-y-4"><a href="/" aria-label="Home" class="focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink"><span class="inline-flex items-center gap-2.5 font-display font-semibold tracking-[-0.02em] text-ink text-[21px]"><svg width="22" height="18" viewBox="0 0 11 9" shape-rendering="crispEdges" aria-hidden="true" focusable="false" class="shrink-0"><rect x="0" y="0" width="6" height="1" fill="#16161A"></rect><rect x="0" y="1" width="1" height="1" fill="#16161A"></rect><rect x="2" y="1" width="2" height="1" fill="#16161A"></rect><rect x="5" y="1" width="1" height="1" fill="#16161A"></rect><rect x="0" y="2" width="6" height="1" fill="#16161A"></rect><rect x="1" y="3" width="1" height="1" fill="#16161A"></rect><rect x="3" y="4" width="7" height="1" fill="#16161A"></rect><rect x="3" y="5" width="1" height="1" fill="#16161A"></rect><rect x="9" y="5" width="1" height="1" fill="#16161A"></rect><rect x="3" y="6" width="1" height="1" fill="#16161A"></rect><rect x="5" y="6" width="3" height="1" fill="#C13A20"></rect><rect x="9" y="6" width="1" height="1" fill="#16161A"></rect><rect x="3" y="7" width="7" height="1" fill="#16161A"></rect><rect x="5" y="8" width="1" height="1" fill="#16161A"></rect></svg><span>Limn<span class="text-signal-text">.</span></span></span></a><div class="flex flex-wrap items-baseline gap-x-5 gap-y-2 font-mono text-mono-nav text-nav-idle type:gap-x-[30px]"><a href="/for-developers" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">For developers</a><a href="/for-managers" aria-current="page" class="border-b-2 border-signal-fill pb-0.5 text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">For managers</a><a href="/how-we-measure" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">How we measure</a><a href="/contact" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Contact</a><a href="/api/auth/login" class="text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Sign in</a></div></nav></header><main><header class="px-gutter pt-hero-y"><span class="block font-mono uppercase text-mono-label-wide mb-[26px] text-secondary">For engineering managers</span><h1 class="mb-7 max-w-[20ch] text-pretty font-display text-hero-sm font-semibold text-ink type:text-hero">Six repositories, one answer.</h1><p class="mb-[34px] max-w-lede text-pretty text-lede text-ink-soft">Limn lights up what a fortnight of work across every repository you own actually came to — where it happened, how long it waited, and who was holding it — and then what the review bots layered on top cost and returned. It shows what the data can carry and refuses the rest, which is most of what this category sells.</p><div class="mb-4 flex flex-wrap items-center gap-3.5"><a href="/api/auth/login" class="inline-block bg-ink px-6 py-[15px] font-display text-[16px] font-semibold text-paper hover:bg-[#08080A] transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ">Sign in with GitHub</a><a href="/for-developers" class="inline-block border-b border-ink px-1.5 py-[15px] font-display text-[16px] font-medium text-ink hover:text-signal-text transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ">If you write the code →</a></div><p class="mb-11 max-w-reassure font-mono text-mono-nav text-secondary">Sections 02 to 05 are free on every tier. Run the whole free product on your own machine with <span class="text-ink">npx limn-review</span>.</p></header><section class="px-gutter py-section-y border-t border-ink "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]"><span class="rail:block">01<span class="rail:hidden"> / </span></span>The questions</div><div class="rail:col-span-2"><h2 class="mb-[30px] max-w-[30ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2-major">Five questions, and one place that answers them.</h2><div class="grid gap-grid-gutter rail:grid-cols-2"><div><p class="mb-6">Where is the effort going, what is stuck, how long are people waiting. Answering those across a set of repositories means counting the same things the same way in each of them — and then separating what people did from what automation did, because agents now author a real share of the pull requests and several vendors comment on every one.</p><p class="mb-6">The questions beside this are the ones actually asked in a staff meeting. Limn answers each with a stated population and a stated window, or says why it cannot.</p><p>Your team plans its day on the free Pending board — everything waiting on them or on the workspace, in six ranked tabs, by rules each person sets. This page is the same work one grain up: the fortnight, not the morning.</p></div><div><ul class="flex flex-col gap-3.5"><li class="flex gap-3.5 text-body-sm"><span aria-hidden="true" class="pt-1.5 font-mono text-mono-caption text-signal-text">—</span><span>Where is the work actually happening across the repositories I own?</span></li><li class="flex gap-3.5 text-body-sm"><span aria-hidden="true" class="pt-1.5 font-mono text-mono-caption text-signal-text">—</span><span>What is stuck right now, and is it stuck on a reviewer or on the author?</span></li><li class="flex gap-3.5 text-body-sm"><span aria-hidden="true" class="pt-1.5 font-mono text-mono-caption text-signal-text">—</span><span>How much of the review load is people, and how much is automation?</span></li><li class="flex gap-3.5 text-body-sm"><span aria-hidden="true" class="pt-1.5 font-mono text-mono-caption text-signal-text">—</span><span>Which of the bots we pay for is earning its seat?</span></li><li class="flex gap-3.5 text-body-sm"><span aria-hidden="true" class="pt-1.5 font-mono text-mono-caption text-signal-text">—</span><span>What do I put in front of a director on Friday without writing it by hand?</span></li></ul><p class="mt-7 flex items-baseline gap-3.5 border-t border-rule pt-4 font-mono text-mono-nav text-secondary"><span aria-hidden="true" class="text-signal-text">—</span><span><span class="text-ink">Never</span> · a developer leaderboard. There is no such screen in the product.</span></p></div></div></div></div></section><section class="px-gutter py-section-y border-t border-rule bg-paper-alt "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail-1 "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]"><span class="rail:block">02<span class="rail:hidden"> / </span></span>Free</div><div><h2 class="mb-6 max-w-[30ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2">The state of play, at no charge.</h2><div class="max-w-[68ch]"><p class="mb-6">Throughput, lead time, time to a first human review and merge-time build health for the whole workspace — with people counted apart from automation, because a blended median describes no pull request anyone wrote.</p><p class="mb-6">Time to a first human review is the number most worth holding. It is the part of the wait that is entirely yours to spend, it sits ahead of everything else in the queue, and no bot approval is allowed to count towards it.</p><p>A repository added part-way through a window is marked rather than pro-rated, and where a pull request’s size was never observed it says “size unknown” rather than counting it as zero.</p><p class="mt-7 flex items-baseline gap-3.5 border-t border-rule pt-4 font-mono text-mono-nav text-secondary"><span aria-hidden="true" class="text-signal-text">—</span><span><span class="text-ink">Free, on every tier</span> · this whole section, and the two that follow it.</span></p></div></div></div><div class="mt-10"><figure class="border border-rule-strong"><figcaption class="flex items-center justify-between border-b border-rule px-4 py-[11px] font-mono text-mono-caption text-secondary"><span>limn · flow metrics</span><button type="button" class="text-signal-text transition-colors duration-hover ease-standard hover:text-ink focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Enlarge</button></figcaption><button type="button" aria-label="Enlarge screenshot: Workspace flow metrics — throughput, lead time, time to a first human review and merge-time build health — with people counted apart from automation, above per-repository activity rows" class="block w-full cursor-zoom-in focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ink"><span style="height:640px" class="block w-full overflow-hidden bg-paper"><img src="/shots/flow-metrics.png" alt="Workspace flow metrics — throughput, lead time, time to a first human review and merge-time build health — with people counted apart from automation, above per-repository activity rows" loading="lazy" decoding="async" class="h-full w-full object-cover object-top"/></span></button></figure></div></section><section class="px-gutter py-section-y border-t border-rule "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail-1 "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]"><span class="rail:block">03<span class="rail:hidden"> / </span></span>Per repository</div><div><h2 class="mb-6 max-w-[30ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2">Which repository is carrying the fortnight.</h2><div class="max-w-[68ch]"><p class="mb-6">Two columns, two scales, two origins. A bar’s length is a ratio within its own column and never a number you can read across — the two measures are counted in different units, and putting them on one axis would invent a comparison.</p><p class="mb-6">Pull requests opened splits people from automation in the bar itself, so you can see which repositories the agents are working in without doing arithmetic.</p><p>The repository name is written out in full and wraps. The rotated, truncated axis label it replaced rendered six of seven real repositories as “…tric-backend”.</p></div></div></div><div class="mt-10"><figure class="border border-rule"><figcaption class="flex items-center justify-between border-b border-rule px-4 py-[11px] font-mono text-mono-caption text-secondary"><span>limn · repository activity</span><button type="button" class="text-signal-text transition-colors duration-hover ease-standard hover:text-ink focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Enlarge</button></figcaption><button type="button" aria-label="Enlarge screenshot: Where the work is happening: pull requests opened per repository with people stacked separately from automation, beside lines changed per repository" class="block w-full cursor-zoom-in focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ink"><span style="height:560px" class="block w-full overflow-hidden bg-paper"><img src="/shots/repo-rows.png" alt="Where the work is happening: pull requests opened per repository with people stacked separately from automation, beside lines changed per repository" loading="lazy" decoding="async" class="h-full w-full object-contain"/></span></button></figure></div></section><section class="px-gutter py-section-y border-t border-rule bg-paper-alt "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]"><span class="rail:block">04<span class="rail:hidden"> / </span></span>Reach</div><div><h2 class="mb-6 max-w-[26ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2">And how much of it could break something.</h2><p class="mb-6 max-w-[58ch] text-pretty">The open pull requests in each repository, split by how far a change could reach — worked out from what the diff touches: migrations, schemas, interface definitions, infrastructure, and whether files that usually move together are missing from it.</p><p class="max-w-[58ch] text-pretty">It is a snapshot of right now rather than a window, and it says so. Drafts are included, and the draft count is disclosed, because the tile above it excludes them and two numbers that disagree need to explain themselves.</p></div><div class=""><figure class="border border-rule-strong"><figcaption class="flex items-center justify-between border-b border-rule px-4 py-[11px] font-mono text-mono-caption text-secondary"><span>limn · reach</span><button type="button" class="text-signal-text transition-colors duration-hover ease-standard hover:text-ink focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Enlarge</button></figcaption><button type="button" aria-label="Enlarge screenshot: Reach by repository: open pull requests per repository split into low, medium and high reach, with two repositories reporting no reading rather than a zero" class="block w-full cursor-zoom-in focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ink"><span style="height:420px" class="block w-full overflow-hidden bg-paper"><img src="/shots/reach.png" alt="Reach by repository: open pull requests per repository split into low, medium and high reach, with two repositories reporting no reading rather than a zero" loading="lazy" decoding="async" class="h-full w-full object-contain"/></span></button></figure><p class="mt-[18px] max-w-caption text-list text-muted">Two repositories report no reading rather than a zero. The co-change index only exists where the history supports one, and a zero there would read as a clean bill of health.</p></div></div></section><section class="px-gutter py-section-y border-t border-rule "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail-1 "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]"><span class="rail:block">05<span class="rail:hidden"> / </span></span>Your bots</div><div><h2 class="mb-6 max-w-[30ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2">Find every bot. Name it. Price it. Free.</h2><div class="max-w-[68ch]"><p class="mb-6">Limn detects every automated account touching your repositories and separates the review vendors from the dependency bumps, the quality gates, the release automation and the agents that write code — and lets you correct any of it by hand, with your judgement winning in both directions.</p><p class="mb-6">That split is what makes the human numbers above trustworthy. A merged dependency bump and a merged feature are both “a merge” until something tells them apart, and on real data the bumps alone dragged a reported median pull-request size from 142 lines to 68.</p><p>Type in what each one costs a month and the figure is stored per workspace. The grade on every bot comment is free too — a purpose-trained ModernBERT classifier, served as int8 ONNX on ordinary CPU, which — graded blind against a human expert — picked the same severity seven times in ten, where the vendor’s own badge managed fewer than five. The ruler is never the paid part.</p></div></div></div><div class="mt-10"><figure class="border border-rule"><figcaption class="flex items-center justify-between border-b border-rule px-4 py-[11px] font-mono text-mono-caption text-secondary"><span>limn · bot settings</span><button type="button" class="text-signal-text transition-colors duration-hover ease-standard hover:text-ink focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Enlarge</button></figcaption><button type="button" aria-label="Enlarge screenshot: The bot settings table: every detected automated account with its vendor, its role, the confidence behind the call and the monthly price you typed in" class="block w-full cursor-zoom-in focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ink"><span style="height:600px" class="block w-full overflow-hidden bg-paper"><img src="/shots/bot-settings.png" alt="The bot settings table: every detected automated account with its vendor, its role, the confidence behind the call and the monthly price you typed in" loading="lazy" decoding="async" class="h-full w-full object-cover object-top"/></span></button></figure></div></section><section class="px-gutter py-section-y border-t border-ink bg-paper-alt "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail-1 "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]"><span class="rail:block">06<span class="rail:hidden"> / </span></span>Pro</div><div><span class="block font-mono uppercase text-mono-label mb-4 text-signal-text">Pro · $25 per user</span><h2 class="mb-6 max-w-[30ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2">A report per sprint, that you can forward.</h2><div class="max-w-[68ch]"><p class="mb-6">A stored artifact for each completed sprint or calendar month — fifteen metrics, a like-for-like comparison against the previous period, the biggest movers, and a short written summary. Every event in it is timestamped inside the window at both ends, so the document stays reproducible after you send it.</p><p class="mb-6">The comparison is recomputed over the repositories tracked in <em>both</em> periods and says so on the row. Otherwise the delta would be measuring which repositories you onboarded rather than what the team did — and the headline figure and the change would be two different populations wearing one number.</p><p>The forecast refuses at calendar-month grain outright, because months run 28 to 31 days and a trend line fitted through them reads February as a dip every year.</p></div></div></div><div class="mt-10"><figure class="border border-rule-strong"><figcaption class="flex items-center justify-between border-b border-rule px-4 py-[11px] font-mono text-mono-caption text-secondary"><span>limn · period report</span><button type="button" class="text-signal-text transition-colors duration-hover ease-standard hover:text-ink focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Enlarge</button></figcaption><button type="button" aria-label="Enlarge screenshot: A stored sprint report: the effort-versus-automation split, the biggest movers, and fifteen metrics each with this period, the prior period, the change and a forecast column" class="block w-full cursor-zoom-in focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ink"><span style="height:680px" class="block w-full overflow-hidden bg-paper"><img src="/shots/period-report.png" alt="A stored sprint report: the effort-versus-automation split, the biggest movers, and fifteen metrics each with this period, the prior period, the change and a forecast column" loading="lazy" decoding="async" class="h-full w-full object-cover object-top"/></span></button></figure></div></section><section class="px-gutter py-section-y border-t border-rule "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail-1 "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]"><span class="rail:block">07<span class="rail:hidden"> / </span></span>Pro</div><div><h2 class="mb-6 max-w-[30ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2">Where the waiting happens — without naming anyone.</h2><div class="max-w-[68ch]"><p class="mb-6">Every hour a pull request was open belongs to somebody: a reviewer who has not looked, an author who owes a response, or nobody — approved and waiting to land. Chronology attributes all of them and reports the split per repository.</p><p class="mb-6">A bot action never moves the ball, and pull requests no person ever touched are excluded and reported separately — on real data that is 46% of merges, and folding them in would report a reviewer problem that is an automation fact. It speaks up only when a court is both lopsided <em>and</em> slow, because a share without a magnitude invents a crisis in a healthy repository.</p><p>No person is named anywhere in it, and the server sends no actor ids at all — that is structural, not a setting. The People report, for one-to-ones, is the opposite by design: you pick who, the sections are alphabetical, and there is no ranking and no comparison table in it.</p></div></div></div><div class="mt-10"><figure class="border border-rule"><figcaption class="flex items-center justify-between border-b border-rule px-4 py-[11px] font-mono text-mono-caption text-secondary"><span>limn · chronology</span><button type="button" class="text-signal-text transition-colors duration-hover ease-standard hover:text-ink focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Enlarge</button></figcaption><button type="button" aria-label="Enlarge screenshot: The Chronology panel: reviewer, author and landing courts with their share and their magnitude, plus the per-repository rows underneath" class="block w-full cursor-zoom-in focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ink"><span style="height:620px" class="block w-full overflow-hidden bg-paper"><img src="/shots/chronology.png" alt="The Chronology panel: reviewer, author and landing courts with their share and their magnitude, plus the per-repository rows underneath" loading="lazy" decoding="async" class="h-full w-full object-cover object-top"/></span></button></figure><p class="mt-[18px] max-w-caption text-list text-muted">Sixty-six merged pull requests a person actually worked on. The never-human-touched population is reported on its own, never blended in.</p></div></section><section class="px-gutter py-section-y border-t border-rule bg-paper-alt "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail-1 "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]"><span class="rail:block">08<span class="rail:hidden"> / </span></span>Pro</div><div><h2 class="mb-6 max-w-[30ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2">What the bots cost, and what they returned.</h2><div class="max-w-[68ch]"><p class="mb-6">A keep, tune or noisy verdict per vendor, built from how much of what it said your team acted on — and dollars per acted-on comment, divided by one stated calendar month at both ends, with both halves of the division printed on the card.</p><p class="mb-6">Beside it, over-calling as a weekly line: how often a vendor badged something major that our model read as minor. A bot that badges nothing is named and omitted rather than drawn as a zero.</p><p>It refuses where it should. A repository younger than the window, a reviewer with nothing acted on, or fewer than ten acted-on comments each withhold the per-comment figure on their own, while the honest counts still render.</p><p class="mt-7 flex items-baseline gap-3.5 border-t border-rule pt-4 font-mono text-mono-nav text-secondary"><span aria-hidden="true" class="text-signal-text">—</span><span><span class="text-ink">The receipt</span> · 488 bot threads in a fortnight, 62% acted on, six vendors, one of them worth dropping.</span></p></div></div></div><div class="mt-10"><figure class="border border-rule-strong"><figcaption class="flex items-center justify-between border-b border-rule px-4 py-[11px] font-mono text-mono-caption text-secondary"><span>limn · bot roi</span><button type="button" class="text-signal-text transition-colors duration-hover ease-standard hover:text-ink focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Enlarge</button></figcaption><button type="button" aria-label="Enlarge screenshot: The bot ROI panel: six review vendors with thread volume, acted-on rate, overdue counts, time to address and keep or tune verdicts, above charts of weekly volume, effectiveness and severity inflation" class="block w-full cursor-zoom-in focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ink"><span style="height:660px" class="block w-full overflow-hidden bg-paper"><img src="/shots/bot-roi.png" alt="The bot ROI panel: six review vendors with thread volume, acted-on rate, overdue counts, time to address and keep or tune verdicts, above charts of weekly volume, effectiveness and severity inflation" loading="lazy" decoding="async" class="h-full w-full object-cover object-top"/></span></button></figure></div></section><section class="px-gutter py-section-y border-t border-rule "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail-1 "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]"><span class="rail:block">09<span class="rail:hidden"> / </span></span>Pro</div><div><h2 class="mb-6 max-w-[30ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2">And how that compares to everyone else.</h2><div class="max-w-[68ch]"><p class="mb-6">Your vendors placed against a cohort of 2,204 repositories, banded by how busy a repository is, so a quiet service is not compared against a monorepo. Every percentile carries the number of repositories behind it and which band it sat in.</p><p>Where the cohort is too thin to answer, it says so in words — there are fourteen distinct refusal sentences in this panel, and they are the feature. A percentile drawn from four repositories is a number that will move on its own next month.</p></div></div></div><div class="mt-10"><figure class="border border-rule"><figcaption class="flex items-center justify-between border-b border-rule px-4 py-[11px] font-mono text-mono-caption text-secondary"><span>limn · benchmark</span><button type="button" class="text-signal-text transition-colors duration-hover ease-standard hover:text-ink focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Enlarge</button></figcaption><button type="button" aria-label="Enlarge screenshot: The peer benchmark panel placing each vendor against a cohort of repositories, with per-metric percentiles carrying their cohort size and written refusals where the cohort is too thin" class="block w-full cursor-zoom-in focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ink"><span style="height:620px" class="block w-full overflow-hidden bg-paper"><img src="/shots/benchmark.png" alt="The peer benchmark panel placing each vendor against a cohort of repositories, with per-metric percentiles carrying their cohort size and written refusals where the cohort is too thin" loading="lazy" decoding="async" class="h-full w-full object-cover object-top"/></span></button></figure></div></section><section id="pricing" class="px-gutter border-t border-ink py-14"><div class="grid items-start gap-grid-gutter rail:grid-cols-rail-1 "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]">Free vs Pro</div><div><h2 class="mb-6 max-w-[30ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2">Free answers one pull request. Pro answers the fortnight.</h2><p class="mb-10 max-w-[62ch] text-pretty text-lede text-ink-soft">Limn is open core. The free tier is the product, not a trial — it has no repository limit, no user limit and no expiry, and every action you take on a pull request lives in it. Pro is what happens when you need the same truth one grain up: across repositories, across people, across a period.</p><div class="border-t border-ink"><div class="hidden gap-grid-gutter border-b border-rule-strong py-3 rail:grid rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><span class="block font-mono uppercase text-mono-label text-secondary">Question</span><span class="block font-mono uppercase text-mono-label text-secondary">Free · open core</span><span class="block font-mono uppercase text-mono-label text-signal-text">Pro · free for a month</span></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">What should I work on today?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Pending: everything waiting on you or your workspace, across every repository, in six ranked tabs — the top five of each marked Do next.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Plan my day: a written headline, a line on what can wait, and a reason on each planned card. The order stays the free one.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Can I change what counts as my turn?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Yes. Switch card types on or off, move your own work into My turn, set the order, choose how every tab ranks, and mute a repository or a workspace.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Everything free does. Your rules are never the paid part.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">What happened on this pull request?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Every thread triaged — untouched, replied, likely addressed, resolved. Blast radius, blockers, merge verdict.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">A short written summary, a read on what a red build means, and a check on whether a comment was really addressed.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Can I act without leaving?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Reply, resolve, approve, merge, merge-when-ready, update from trunk, resolve conflicts hunk by hunk.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Everything free does. Acting on a pull request is never the paid part.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Can Claude review or fix this?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Yes, on your machine, on your own Claude: a review you tick and post, a chat on it, and a fix that is pushed only when you click.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Everything free does. The agents are never the paid part.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Which review bots are worth their seat?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Detect every bot, name it, set its role and record what it costs — and an independent severity grade on every comment it leaves.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">The per-bot scoreboard: keep / tune / noisy, dollars per comment your team acted on, over-calling as a weekly line.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">How does that compare to other teams?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">—</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Your bots placed against a 2,204-repository cohort, with a written refusal wherever the cohort is too thin to answer.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">How is the team doing?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Flow metrics for the workspace, activity and reach by repository, open pull requests and trunk health.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">A stored report per sprint or month, compared like-for-like against the last one, with the coverage stated.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Is a repository about to bite us?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Default-branch health across every repository, the checks failing on it, and the pull request that landed its latest commit.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Everything free does. Trunk health is never the paid part — it is the thing you need at the worst moment.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Where is the time actually going?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">—</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Chronology: every open hour attributed to a reviewer, an author, or waiting to land. Nobody is named.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">What do I take into a one-to-one?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">—</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">A report with a section per person you pick. Preparation, not a ranking — there is no leaderboard anywhere in it.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Can I keep the noise down?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Bots hidden by default, notifications only for work that is yours, and a mute per repository or per workspace.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Everything free does, plus a Slack digest per workspace if you would rather read it there.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Where does it run?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">npx limn-review on your machine, or the hosted service. No repository limit, no user limit. Claude review and fix run on your machine only.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">The same two places. Pro unlocks on whichever one you already use.</p></div></div></div><p class="mt-6 max-w-[62ch] font-mono text-mono-caption text-secondary">Pro lists at $25 per user, and is free for a month to anyone who asks for it. A user is someone who signs in — bots never count, and there is no per-repository charge.</p><p class="mt-2 max-w-[62ch] font-mono text-mono-caption text-secondary">Review and fix run locally only, on your own Claude Code or Anthropic API key. Limn stores no key and charges nothing for it.</p><div class="mt-10"><figure class="border border-rule"><figcaption class="flex items-center justify-between border-b border-rule px-4 py-[11px] font-mono text-mono-caption text-secondary"><span>limn · reports, free account</span><button type="button" class="text-signal-text transition-colors duration-hover ease-standard hover:text-ink focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Enlarge</button></figcaption><button type="button" aria-label="Enlarge screenshot: The Reports pane on a free account: the flow metrics render in full, and the paid period-report panel below them is listed, badged and locked rather than hidden" class="block w-full cursor-zoom-in focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ink"><span style="height:460px" class="block w-full overflow-hidden bg-paper"><img src="/shots/free-reports.png" alt="The Reports pane on a free account: the flow metrics render in full, and the paid period-report panel below them is listed, badged and locked rather than hidden" loading="lazy" decoding="async" class="h-full w-full object-cover object-top"/></span></button></figure><p class="mt-[18px] max-w-caption text-list text-muted">What a free account actually sees. The paid panes are listed and locked rather than hidden, so you can tell what you are not buying before you buy it — and the free metrics above them are the ones that moved here off another tab.</p></div></div></div></section><section class="px-gutter py-section-y-lg "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail-1 "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]">Start</div><div><h2 class="mb-5 max-w-[24ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2-major">Start free. Every repository, nothing missed.</h2><p class="mb-9 max-w-[56ch] text-pretty text-lede text-ink-soft">Sign in with GitHub and the first repositories are on screen in a couple of minutes, or run the whole free tier on your own machine and keep the data there. For Pro, send a message — it is free for a month, for asking.</p><div class="mb-5 flex flex-wrap items-center gap-3.5"><a href="/api/auth/login" class="inline-block bg-ink px-6 py-[15px] font-display text-[16px] font-semibold text-paper hover:bg-[#08080A] transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ">Sign in with GitHub</a><a href="/contact?topic=pro" class="inline-block bg-signal-text px-6 py-[15px] font-display text-[16px] font-semibold text-paper hover:bg-[#A6301A] transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ">Ask for a free month of Pro</a></div><p class="max-w-reassure font-mono text-mono-nav text-secondary">Card payments are not switched on yet, so Pro is not sold from this page — it is given, a month at a time, to anyone who asks. No card, nothing to cancel. Or run the free tier locally: <span class="text-ink">npx limn-review</span></p></div></div></section></main><footer class="border-t border-rule px-gutter py-[26px] font-mono text-mono-caption text-secondary"><div class="flex flex-wrap items-baseline justify-between gap-x-8 gap-y-3"><span>© 2026 Limn. Built for sprint situational awareness.</span><span class="flex flex-wrap items-baseline gap-x-5 gap-y-2"><a href="/for-developers" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">For developers</a><a href="/for-managers" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">For managers</a><a href="/how-we-measure" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">How we measure</a><a href="/contact" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Contact</a><a href="https://github.com/alexwakeman/pierre-review" target="_blank" rel="noreferrer noopener" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">GitHub</a><a href="/privacy" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Privacy</a><a href="/cookies" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Cookies</a><a href="/terms" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Terms</a></span></div><p class="mt-4 max-w-caption">Limn is a desktop experience today. A phone-friendly build is planned.</p></footer></div>
|
|
154
|
+
</div>
|
|
155
|
+
</body>
|
|
156
|
+
</html>
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<meta name="theme-color" content="#FAFAF8" />
|
|
7
|
+
|
|
8
|
+
<!-- Primary SEO. Everything between the seo:start/seo:end markers is REPLACED
|
|
9
|
+
per route at build time by prerender.mjs, from the ROUTE_SEO table in
|
|
10
|
+
src/lib/routes.ts — so /pricing ships its own title, description and
|
|
11
|
+
canonical in the HTML rather than inheriting the home page's. What is
|
|
12
|
+
written here is the home-page copy and the dev-server fallback; keep the
|
|
13
|
+
markers, and keep the copy in sync with ROUTE_SEO['/']. -->
|
|
14
|
+
<title>Contact — a free month of Pro, for asking</title>
|
|
15
|
+
<meta name="description" content="Card payments are not switched on yet, so Pro is free for a month to anyone who asks for it: every paid surface, no card, nothing to cancel. Send a message and it is enabled on your account. The free tier needs none of this — it works today." />
|
|
16
|
+
<meta name="robots" content="index, follow" />
|
|
17
|
+
<link rel="canonical" href="https://pierre-review.com/contact" />
|
|
18
|
+
<meta property="og:type" content="website" />
|
|
19
|
+
<meta property="og:site_name" content="Limn" />
|
|
20
|
+
<meta property="og:title" content="Contact — a free month of Pro, for asking" />
|
|
21
|
+
<meta property="og:description" content="Card payments are not switched on yet, so Pro is free for a month to anyone who asks for it: every paid surface, no card, nothing to cancel. Send a message and it is enabled on your account. The free tier needs none of this — it works today." />
|
|
22
|
+
<meta property="og:url" content="https://pierre-review.com/contact" />
|
|
23
|
+
<meta property="og:image" content="https://pierre-review.com/og-image.png" />
|
|
24
|
+
<meta property="og:image:width" content="1200" />
|
|
25
|
+
<meta property="og:image:height" content="630" />
|
|
26
|
+
<meta property="og:image:alt" content="The Limn board showing everything waiting across a team’s repositories, ranked most actionable first." />
|
|
27
|
+
<meta name="twitter:card" content="summary_large_image" />
|
|
28
|
+
<meta name="twitter:title" content="Contact — a free month of Pro, for asking" />
|
|
29
|
+
<meta name="twitter:description" content="Card payments are not switched on yet, so Pro is free for a month to anyone who asks for it: every paid surface, no card, nothing to cancel. Send a message and it is enabled on your account. The free tier needs none of this — it works today." />
|
|
30
|
+
<meta name="twitter:image" content="https://pierre-review.com/og-image.png" />
|
|
31
|
+
<meta name="twitter:image:alt" content="The Limn board showing everything waiting across a team’s repositories, ranked most actionable first." />
|
|
32
|
+
|
|
33
|
+
<!-- Favicons: the Limn mark, rendered from apps/landing/src/lib/sprites.ts by
|
|
34
|
+
`node scripts/make-favicons.mjs`. Regenerate there, never by hand. -->
|
|
35
|
+
<!-- ⚠ THE SVG MUST STAY FIRST AND KEEP ITS `type`. A tab slot is 16 CSS px — 32 device px
|
|
36
|
+
at DPR 2 — and Chrome picks ONE of these and scales it, so any pick but an exact 1:1
|
|
37
|
+
raster resamples a grid whose features are one pixel wide and reads as blur. Declared
|
|
38
|
+
this way Chrome takes the SVG and `shape-rendering: crispEdges` snaps it to the device
|
|
39
|
+
grid at every DPR. The PNGs remain for Safari < 16.4 and the big-raster surfaces. -->
|
|
40
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
|
|
41
|
+
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png" />
|
|
42
|
+
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png" />
|
|
43
|
+
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48.png" />
|
|
44
|
+
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
|
45
|
+
<link rel="manifest" href="/site.webmanifest" />
|
|
46
|
+
|
|
47
|
+
<!-- Structured data: helps search engines understand what Limn is.
|
|
48
|
+
LANDMINE: this block sits OUTSIDE the seo:start/end markers, so the
|
|
49
|
+
prerenderer copies it verbatim into EVERY route — /privacy and /terms ship
|
|
50
|
+
this price too. It is a second, site-wide copy of both the product name
|
|
51
|
+
and the price; when either changes it must change here as well as in
|
|
52
|
+
src/lib/routes.ts, src/lib/site.ts and src/components/feint/TierTable.tsx.
|
|
53
|
+
⚠ IT WENT STALE ONCE ALREADY: it advertised Pro at $15 and a Pro+ tier at
|
|
54
|
+
$29 for as long as those were true on a pricing page that no longer
|
|
55
|
+
exists, which is exactly the failure a second copy invites.
|
|
56
|
+
Claude Review and AI Fix are FREE and local-only — they belong in the Free
|
|
57
|
+
offer, never the Pro one (they were "Pro+" once; that tier is gone).
|
|
58
|
+
The $25 stays because it is the real LIST price and the tier table says so;
|
|
59
|
+
the free month is described in the offer text rather than by writing "0",
|
|
60
|
+
which would be a different and wrong claim about what Pro costs. -->
|
|
61
|
+
<script type="application/ld+json">
|
|
62
|
+
{
|
|
63
|
+
"@context": "https://schema.org",
|
|
64
|
+
"@graph": [
|
|
65
|
+
{
|
|
66
|
+
"@type": "Organization",
|
|
67
|
+
"@id": "https://pierre-review.com/#org",
|
|
68
|
+
"name": "Limn",
|
|
69
|
+
"url": "https://pierre-review.com/",
|
|
70
|
+
"logo": "https://pierre-review.com/icon-512.png",
|
|
71
|
+
"sameAs": ["https://github.com/alexwakeman/pierre-review"]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"@type": "WebSite",
|
|
75
|
+
"@id": "https://pierre-review.com/#site",
|
|
76
|
+
"name": "Limn",
|
|
77
|
+
"url": "https://pierre-review.com/",
|
|
78
|
+
"publisher": { "@id": "https://pierre-review.com/#org" }
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"@type": "SoftwareApplication",
|
|
82
|
+
"name": "Limn",
|
|
83
|
+
"applicationCategory": "DeveloperApplication",
|
|
84
|
+
"operatingSystem": "Web, macOS, Linux, Windows",
|
|
85
|
+
"description": "Plans your day across every repository a team works in: one ranked board of what is waiting and on whom, by rules each person sets — plus how the work moved over a sprint, and an independent grade on every AI review bot comment.",
|
|
86
|
+
"url": "https://pierre-review.com/",
|
|
87
|
+
"publisher": { "@id": "https://pierre-review.com/#org" },
|
|
88
|
+
"offers": {
|
|
89
|
+
"@type": "AggregateOffer",
|
|
90
|
+
"priceCurrency": "USD",
|
|
91
|
+
"lowPrice": "0",
|
|
92
|
+
"highPrice": "25",
|
|
93
|
+
"offerCount": "2",
|
|
94
|
+
"offers": [
|
|
95
|
+
{
|
|
96
|
+
"@type": "Offer",
|
|
97
|
+
"name": "Free",
|
|
98
|
+
"description": "The open-core product: the ranked cross-repo Pending board and every setting behind it, triaged review threads, merge and conflict resolution in place, flow metrics per workspace, an independent grade on every bot comment, and — run locally — Claude Review and AI Fix on your own Claude Code or Anthropic API key, with no charge from Limn. No repository limit, no user limit, no expiry.",
|
|
99
|
+
"price": "0",
|
|
100
|
+
"priceCurrency": "USD"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"@type": "Offer",
|
|
104
|
+
"name": "Pro",
|
|
105
|
+
"description": "The roll-up across repositories, people and periods: a forwardable report per sprint, Chronology, the per-bot keep / tune / noisy scoreboard and the peer benchmark, plus written summaries on pull requests, a read on a failed build and a written plan for the day. Claude Review and AI Fix are not part of it: they are free. Lists at $25 per user per month; currently free for a month to anyone who asks via the contact form.",
|
|
106
|
+
"price": "25",
|
|
107
|
+
"priceCurrency": "USD",
|
|
108
|
+
"priceSpecification": {
|
|
109
|
+
"@type": "UnitPriceSpecification",
|
|
110
|
+
"price": "25",
|
|
111
|
+
"priceCurrency": "USD",
|
|
112
|
+
"billingIncrement": 1,
|
|
113
|
+
"unitText": "MONTH"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
"softwareHelp": "https://github.com/alexwakeman/pierre-review"
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
</script>
|
|
123
|
+
|
|
124
|
+
<!-- The three typefaces (Archivo, Newsreader, JetBrains Mono) are SELF-HOSTED:
|
|
125
|
+
the @font-face blocks live in src/index.css and the .woff2 files ship from
|
|
126
|
+
src/fonts/. They are never fetched from Google, for three independent
|
|
127
|
+
reasons — `font-src 'self'` in the landing CSP blocks fonts.gstatic.com,
|
|
128
|
+
`style-src 'self' 'unsafe-inline'` does not permit a <link> to
|
|
129
|
+
fonts.googleapis.com, and a test pins that directive so it fails CI before
|
|
130
|
+
a browser ever sees it. On top of that it is a GDPR requirement: a gstatic
|
|
131
|
+
request discloses every visitor's IP to Google before consent, and Google
|
|
132
|
+
Fonts' recommended <link ... onload="this.media='all'"> would force
|
|
133
|
+
script-src 'unsafe-inline'. Same-origin + font-display:swap keeps them off
|
|
134
|
+
the critical path with no inline handler.
|
|
135
|
+
See apps/backend/src/api/plugins/security.ts. -->
|
|
136
|
+
<script type="module" crossorigin src="/assets/index-CA3eEGXO.js"></script>
|
|
137
|
+
<link rel="stylesheet" crossorigin href="/assets/index-naQrQ6Fe.css">
|
|
138
|
+
</head>
|
|
139
|
+
<body>
|
|
140
|
+
<!-- Everything between app:start/app:end is REPLACED at build time by
|
|
141
|
+
prerender.mjs with the route's fully-rendered markup, so the page has real,
|
|
142
|
+
readable content before a single byte of JS executes — for no-JS visitors,
|
|
143
|
+
for AI agents and crawlers that do not run scripts, and as the first paint
|
|
144
|
+
for everyone else. React's createRoot() replaces it on mount exactly as it
|
|
145
|
+
replaced the splash below.
|
|
146
|
+
|
|
147
|
+
What survives here is the DEV-server fallback (prerender.mjs only rewrites
|
|
148
|
+
the built dist/): a plain wordmark on paper, so the first paint is already
|
|
149
|
+
the right colour instead of a white flash. It is set in system-ui rather
|
|
150
|
+
than Archivo because the bundled font has not loaded at this point — and it
|
|
151
|
+
carries no animation, because the site does not move. -->
|
|
152
|
+
<div id="root">
|
|
153
|
+
<div class="mx-auto min-h-screen max-w-canvas"><header class="border-b border-rule px-gutter py-[26px]"><nav aria-label="Primary" class="flex flex-wrap items-baseline justify-between gap-x-6 gap-y-4"><a href="/" aria-label="Home" class="focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink"><span class="inline-flex items-center gap-2.5 font-display font-semibold tracking-[-0.02em] text-ink text-[21px]"><svg width="22" height="18" viewBox="0 0 11 9" shape-rendering="crispEdges" aria-hidden="true" focusable="false" class="shrink-0"><rect x="0" y="0" width="6" height="1" fill="#16161A"></rect><rect x="0" y="1" width="1" height="1" fill="#16161A"></rect><rect x="2" y="1" width="2" height="1" fill="#16161A"></rect><rect x="5" y="1" width="1" height="1" fill="#16161A"></rect><rect x="0" y="2" width="6" height="1" fill="#16161A"></rect><rect x="1" y="3" width="1" height="1" fill="#16161A"></rect><rect x="3" y="4" width="7" height="1" fill="#16161A"></rect><rect x="3" y="5" width="1" height="1" fill="#16161A"></rect><rect x="9" y="5" width="1" height="1" fill="#16161A"></rect><rect x="3" y="6" width="1" height="1" fill="#16161A"></rect><rect x="5" y="6" width="3" height="1" fill="#C13A20"></rect><rect x="9" y="6" width="1" height="1" fill="#16161A"></rect><rect x="3" y="7" width="7" height="1" fill="#16161A"></rect><rect x="5" y="8" width="1" height="1" fill="#16161A"></rect></svg><span>Limn<span class="text-signal-text">.</span></span></span></a><div class="flex flex-wrap items-baseline gap-x-5 gap-y-2 font-mono text-mono-nav text-nav-idle type:gap-x-[30px]"><a href="/for-developers" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">For developers</a><a href="/for-managers" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">For managers</a><a href="/how-we-measure" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">How we measure</a><a href="/contact" aria-current="page" class="border-b-2 border-signal-fill pb-0.5 text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Contact</a><a href="/api/auth/login" class="text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Sign in</a></div></nav></header><main><header class="px-gutter pb-[52px] pt-hero-y"><span class="block font-mono uppercase text-mono-label-wide mb-5 text-secondary">Contact</span><h1 class="mb-6 max-w-[19ch] text-pretty font-display text-hero-sm font-semibold text-ink type:text-page-title">Ask, and Pro is on us for a month.</h1><p class="mb-[34px] max-w-lede text-pretty text-lede text-ink-soft">Card payments are not switched on yet, and rather than hold Pro back until they are, we are giving it away for a month to anyone who asks. Send a message, and Pro is enabled on your account — every paid surface, no card, nothing to cancel.</p><div class="mb-4 flex flex-wrap items-center gap-3.5"><a href="/for-developers" class="inline-block border-b border-ink px-1.5 py-[15px] font-display text-[16px] font-medium text-ink hover:text-signal-text transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ">What you get, for developers →</a><a href="/for-managers" class="inline-block border-b border-ink px-1.5 py-[15px] font-display text-[16px] font-medium text-ink hover:text-signal-text transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ">And for managers →</a></div><p class="mb-11 max-w-reassure font-mono text-mono-nav text-secondary">The free tier needs none of this — sign in, or run <span class="text-ink">npx limn-review</span> on your own machine, and it works today.</p></header><section class="px-gutter py-section-y border-t border-ink "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]"><span class="rail:block">01<span class="rail:hidden"> / </span></span>Message</div><div class="rail:col-span-2 rail:grid rail:grid-cols-2 rail:gap-grid-gutter"><div><form class="max-w-answer border-t border-ink pt-8"><div class="mb-7"><label for="contact-topic" class="mb-2 block"><span class="block font-mono uppercase text-mono-label text-secondary">What is this about</span></label><select id="contact-topic" class="w-full border-b border-rule-strong bg-transparent py-2.5 font-display text-body-sm text-ink placeholder:text-secondary hover:border-ink focus:border-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink appearance-none"><option value="pro_trial" selected="">Start a free month of Pro</option><option value="question">A question about the product</option><option value="problem">Something is broken</option><option value="other">Something else</option></select></div><div class="mb-7"><label for="contact-name" class="mb-2 block"><span class="block font-mono uppercase text-mono-label text-secondary">Your name</span></label><input id="contact-name" name="name" type="text" required="" maxLength="120" autoComplete="name" class="w-full border-b border-rule-strong bg-transparent py-2.5 font-display text-body-sm text-ink placeholder:text-secondary hover:border-ink focus:border-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink" value=""/></div><div class="mb-7"><label for="contact-email" class="mb-2 block"><span class="block font-mono uppercase text-mono-label text-secondary">Email</span></label><input id="contact-email" name="email" type="email" required="" maxLength="254" autoComplete="email" class="w-full border-b border-rule-strong bg-transparent py-2.5 font-display text-body-sm text-ink placeholder:text-secondary hover:border-ink focus:border-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink" value=""/><p class="mt-2 font-mono text-mono-caption text-secondary">Used to reply to you, and for nothing else. It is not added to a list.</p></div><div class="mb-7"><label for="contact-message" class="mb-2 block"><span class="block font-mono uppercase text-mono-label text-secondary">Message</span></label><textarea id="contact-message" name="message" required="" rows="6" maxLength="2500" class="w-full border-b border-rule-strong bg-transparent py-2.5 font-display text-body-sm text-ink placeholder:text-secondary hover:border-ink focus:border-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink resize-y"></textarea><p class="mt-2 font-mono text-mono-caption text-secondary">How many repositories, and which review bots you run, is the useful part — it is usually what the reply turns on.</p></div><div aria-hidden="true" class="absolute left-[-9999px] top-auto h-px w-px overflow-hidden"><label for="contact-website">Website</label><input id="contact-website" name="website" type="text" tabindex="-1" autoComplete="off" value=""/></div><noscript><p class="mb-6 border-l border-signal-fill pl-4 text-body-sm text-ink-body">This form needs JavaScript to send. With it switched off, open an issue at github.com/alexwakeman/pierre-review/issues instead — it reaches the same person.</p></noscript><button type="submit" disabled="" class="inline-block bg-ink px-6 py-[15px] font-display text-[16px] font-semibold text-paper hover:bg-[#08080A] disabled:cursor-not-allowed disabled:bg-muted transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Send</button><p class="mt-5 max-w-reassure font-mono text-mono-nav text-secondary">Your message goes to one person, not a ticketing queue. What the form collects and how long it is kept is in the <a href="/privacy" class="border-b border-signal-fill text-ink hover:text-signal-text focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">privacy policy</a>.</p></form></div><div class="mt-12 rail:mt-0"><h2 class="mb-5 max-w-[24ch] text-pretty font-display text-h3 font-semibold text-ink">What happens next</h2><ul class="mb-9 flex flex-col gap-3.5 text-ink-body"><li class="flex gap-3.5 text-body-sm"><span aria-hidden="true" class="pt-1.5 font-mono text-mono-caption text-signal-text">—</span><span>It reaches one person, who replies — usually the same day, and always within two working days.</span></li><li class="flex gap-3.5 text-body-sm"><span aria-hidden="true" class="pt-1.5 font-mono text-mono-caption text-signal-text">—</span><span>If you asked for the Pro month, the reply says how it is turned on. There is no card, no invoice and no auto-renewal at the end of it.</span></li><li class="flex gap-3.5 text-body-sm"><span aria-hidden="true" class="pt-1.5 font-mono text-mono-caption text-signal-text">—</span><span>If you found something broken, the reply comes from the person who will fix it.</span></li><li class="flex gap-3.5 text-body-sm"><span aria-hidden="true" class="pt-1.5 font-mono text-mono-caption text-signal-text">—</span><span>Your email is used to answer you. It is not added to a mailing list and it is not passed to anyone.</span></li></ul><h2 class="mb-5 max-w-[24ch] text-pretty font-display text-h3 font-semibold text-ink">Why a month, free</h2><p class="mb-4 max-w-answer text-body-sm text-ink-body">Limn measures things most teams have never had measured — what a fortnight of review actually cost, and what the bots on top of it returned. Those readings get better the more estates they are run against, and the fastest way to make them better is for people to run them and say what was wrong.</p><p class="max-w-answer text-body-sm text-ink-body">So the month is not a discount waiting to convert. It buys the one thing that cannot be bought later: being told what the report got wrong by someone who knows their own team.</p></div></div></div></section><section class="px-gutter py-section-y-lg border-t border-rule "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]"><span class="rail:block">02<span class="rail:hidden"> / </span></span>Elsewhere</div><div class="rail:col-span-2"><h2 class="mb-5 max-w-[28ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2">Or skip the form entirely.</h2><p class="mb-4 max-w-answer text-body-sm text-ink-body">The whole free tier is open core and it installs in one command. Nothing on this page is a gate in front of it — <span class="font-mono text-mono-row text-ink">npx limn-review</span> runs it against your own repositories using your existing <span class="font-mono text-mono-row text-ink">gh</span> login, stores no credentials, and sends nothing to us.</p><p class="max-w-answer text-body-sm text-ink-body">Bugs and feature requests are better as issues than as messages: they are public, they are searchable, and somebody else hitting the same thing can add to them.</p></div></div></section><section id="pricing" class="px-gutter border-t border-ink py-14"><div class="grid items-start gap-grid-gutter rail:grid-cols-rail-1 "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]">Free vs Pro</div><div><h2 class="mb-6 max-w-[30ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2">Free answers one pull request. Pro answers the fortnight.</h2><p class="mb-10 max-w-[62ch] text-pretty text-lede text-ink-soft">Limn is open core. The free tier is the product, not a trial — it has no repository limit, no user limit and no expiry, and every action you take on a pull request lives in it. Pro is what happens when you need the same truth one grain up: across repositories, across people, across a period.</p><div class="border-t border-ink"><div class="hidden gap-grid-gutter border-b border-rule-strong py-3 rail:grid rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><span class="block font-mono uppercase text-mono-label text-secondary">Question</span><span class="block font-mono uppercase text-mono-label text-secondary">Free · open core</span><span class="block font-mono uppercase text-mono-label text-signal-text">Pro · free for a month</span></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">What should I work on today?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Pending: everything waiting on you or your workspace, across every repository, in six ranked tabs — the top five of each marked Do next.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Plan my day: a written headline, a line on what can wait, and a reason on each planned card. The order stays the free one.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Can I change what counts as my turn?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Yes. Switch card types on or off, move your own work into My turn, set the order, choose how every tab ranks, and mute a repository or a workspace.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Everything free does. Your rules are never the paid part.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">What happened on this pull request?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Every thread triaged — untouched, replied, likely addressed, resolved. Blast radius, blockers, merge verdict.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">A short written summary, a read on what a red build means, and a check on whether a comment was really addressed.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Can I act without leaving?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Reply, resolve, approve, merge, merge-when-ready, update from trunk, resolve conflicts hunk by hunk.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Everything free does. Acting on a pull request is never the paid part.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Can Claude review or fix this?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Yes, on your machine, on your own Claude: a review you tick and post, a chat on it, and a fix that is pushed only when you click.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Everything free does. The agents are never the paid part.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Which review bots are worth their seat?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Detect every bot, name it, set its role and record what it costs — and an independent severity grade on every comment it leaves.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">The per-bot scoreboard: keep / tune / noisy, dollars per comment your team acted on, over-calling as a weekly line.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">How does that compare to other teams?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">—</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Your bots placed against a 2,204-repository cohort, with a written refusal wherever the cohort is too thin to answer.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">How is the team doing?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Flow metrics for the workspace, activity and reach by repository, open pull requests and trunk health.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">A stored report per sprint or month, compared like-for-like against the last one, with the coverage stated.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Is a repository about to bite us?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Default-branch health across every repository, the checks failing on it, and the pull request that landed its latest commit.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Everything free does. Trunk health is never the paid part — it is the thing you need at the worst moment.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Where is the time actually going?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">—</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Chronology: every open hour attributed to a reviewer, an author, or waiting to land. Nobody is named.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">What do I take into a one-to-one?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">—</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">A report with a section per person you pick. Preparation, not a ranking — there is no leaderboard anywhere in it.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Can I keep the noise down?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">Bots hidden by default, notifications only for work that is yours, and a mute per repository or per workspace.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">Everything free does, plus a Slack digest per workspace if you would rather read it there.</p></div></div><div class="grid gap-x-grid-gutter gap-y-2 border-b border-rule-hair py-[18px] rail:grid-cols-[1.1fr_1.3fr_1.3fr]"><p class="font-display text-list font-semibold text-ink">Where does it run?</p><div><span class="block font-mono uppercase text-mono-label mb-1 text-secondary rail:hidden">Free</span><p class="text-list text-ink-body">npx limn-review on your machine, or the hosted service. No repository limit, no user limit. Claude review and fix run on your machine only.</p></div><div><span class="block font-mono uppercase text-mono-label mb-1 text-signal-text rail:hidden">Pro</span><p class="text-list text-ink-body">The same two places. Pro unlocks on whichever one you already use.</p></div></div></div><p class="mt-6 max-w-[62ch] font-mono text-mono-caption text-secondary">Pro lists at $25 per user, and is free for a month to anyone who asks for it. A user is someone who signs in — bots never count, and there is no per-repository charge.</p><p class="mt-2 max-w-[62ch] font-mono text-mono-caption text-secondary">Review and fix run locally only, on your own Claude Code or Anthropic API key. Limn stores no key and charges nothing for it.</p><div class="mt-10"><figure class="border border-rule"><figcaption class="flex items-center justify-between border-b border-rule px-4 py-[11px] font-mono text-mono-caption text-secondary"><span>limn · reports, free account</span><button type="button" class="text-signal-text transition-colors duration-hover ease-standard hover:text-ink focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Enlarge</button></figcaption><button type="button" aria-label="Enlarge screenshot: The Reports pane on a free account: the flow metrics render in full, and the paid period-report panel below them is listed, badged and locked rather than hidden" class="block w-full cursor-zoom-in focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ink"><span style="height:460px" class="block w-full overflow-hidden bg-paper"><img src="/shots/free-reports.png" alt="The Reports pane on a free account: the flow metrics render in full, and the paid period-report panel below them is listed, badged and locked rather than hidden" loading="lazy" decoding="async" class="h-full w-full object-cover object-top"/></span></button></figure><p class="mt-[18px] max-w-caption text-list text-muted">What a free account actually sees. The paid panes are listed and locked rather than hidden, so you can tell what you are not buying before you buy it — and the free metrics above them are the ones that moved here off another tab.</p></div></div></div></section><section class="px-gutter py-section-y-lg "><div class="grid items-start gap-grid-gutter rail:grid-cols-rail-1 "><div class="mb-6 font-mono text-mono-label uppercase text-secondary rail:mb-0 rail:pt-[10px]">Start</div><div><h2 class="mb-5 max-w-[24ch] text-pretty font-display text-h2-sm font-semibold text-ink type:text-h2-major">Start free. Every repository, nothing missed.</h2><p class="mb-9 max-w-[56ch] text-pretty text-lede text-ink-soft">Sign in with GitHub and the first repositories are on screen in a couple of minutes, or run the whole free tier on your own machine and keep the data there. For Pro, send a message — it is free for a month, for asking.</p><div class="mb-5 flex flex-wrap items-center gap-3.5"><a href="/api/auth/login" class="inline-block bg-ink px-6 py-[15px] font-display text-[16px] font-semibold text-paper hover:bg-[#08080A] transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ">Sign in with GitHub</a><a href="/contact?topic=pro" class="inline-block bg-signal-text px-6 py-[15px] font-display text-[16px] font-semibold text-paper hover:bg-[#A6301A] transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ">Ask for a free month of Pro</a></div><p class="max-w-reassure font-mono text-mono-nav text-secondary">Card payments are not switched on yet, so Pro is not sold from this page — it is given, a month at a time, to anyone who asks. No card, nothing to cancel. Or run the free tier locally: <span class="text-ink">npx limn-review</span></p></div></div></section></main><footer class="border-t border-rule px-gutter py-[26px] font-mono text-mono-caption text-secondary"><div class="flex flex-wrap items-baseline justify-between gap-x-8 gap-y-3"><span>© 2026 Limn. Built for sprint situational awareness.</span><span class="flex flex-wrap items-baseline gap-x-5 gap-y-2"><a href="/for-developers" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">For developers</a><a href="/for-managers" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">For managers</a><a href="/how-we-measure" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">How we measure</a><a href="/contact" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Contact</a><a href="https://github.com/alexwakeman/pierre-review" target="_blank" rel="noreferrer noopener" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">GitHub</a><a href="/privacy" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Privacy</a><a href="/cookies" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Cookies</a><a href="/terms" class="hover:text-ink transition-colors duration-hover ease-standard focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink">Terms</a></span></div><p class="mt-4 max-w-caption">Limn is a desktop experience today. A phone-friendly build is planned.</p></footer></div>
|
|
154
|
+
</div>
|
|
155
|
+
</body>
|
|
156
|
+
</html>
|