Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
cfe871d
Add "Continue with GitHub" onboarding with the LiveReview GitHub App
LinceMathew Oct 21, 2026
27f3781
Fix security scan findings (govulncheck, OSV, semgrep)
LinceMathew Oct 21, 2026
d85d433
fix: docs
lovestaco Oct 21, 2026
266b4ee
fix: env example
lovestaco Oct 21, 2026
34f2cde
Open web reviews, git providers and members (up to 3) on the Free plan
lovestaco Oct 22, 2026
10ebbc1
Fix Users table column widths after removing the git-lrc Access column
lovestaco Oct 22, 2026
207dab8
Re-activate a deactivated member when they are invited again
lovestaco Oct 22, 2026
add42dd
Fix review findings in the GitHub App flow
lovestaco Oct 22, 2026
75df949
Move the managed AI model off retired Gemini 2.5 (Vertex) to Gemini 3.x
lovestaco Oct 22, 2026
2585a8c
Managed AI admin page and LiveReview model for launch-trial sign-ups
lovestaco Oct 22, 2026
e9afd07
Run every paid plan's reviews on the LiveReview AI Model when it's se…
lovestaco Oct 22, 2026
eb4ea60
Fix Managed AI table header (TableHead already renders the row)
lovestaco Oct 22, 2026
e07bc32
Stop browsers autofilling the Managed AI form with saved logins
lovestaco Oct 22, 2026
744da58
Managed AI: test before saving, and suggest models from the catalog
lovestaco Oct 22, 2026
13a0492
Use the AI Providers model picker on the Managed AI page
lovestaco Oct 22, 2026
29496fe
Update Managed AI route doc for the shared model picker
lovestaco Oct 22, 2026
4c21ab9
Bump mcp to 1.30.0 and Werkzeug to 3.1.9 (Dependabot)
lovestaco Oct 22, 2026
6496aa3
Use a placeholder for GITHUB_APP_WEBHOOK_SECRET in .env.example
lovestaco Oct 22, 2026
93b1101
Bump dompurify to 3.4.17 and ip-address to 10.7.4 (OSV)
lovestaco Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -104,3 +104,6 @@ Makefile*
docker-compose.yml
docker-compose.*.yml
docker/docker-compose.*.yml

# GitHub App private key - never bake into images
*.pem
13 changes: 13 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ LIVEREVIEW_IS_CLOUD=false
# Cloud authentication (required when LIVEREVIEW_IS_CLOUD=true)
# CLOUD_JWT_SECRET=your_cloud_jwt_secret_here
# FW_PARSE_ADMIN_SECRET=your_parse_admin_secret_here
# FW_PARSE_BASE_URL="https://parse.domain.com"

# Discord webhook for signup notifications (Cloud Only)
# DISCORD_SIGNUP_WEBHOOK_URL=https://discord.com/api/webhooks/...
Expand Down Expand Up @@ -96,3 +97,15 @@ LIVEREVIEW_IS_CLOUD=false
# RAZORPAY_LIVE_LOW_PRICING_YEARLY_PLAN_ID_USD=plan_xxxxxxxxxxxxxx
# RAZORPAY_LIVE_LOW_PRICING_MONTHLY_PLAN_ID_INR=plan_xxxxxxxxxxxxxx
# RAZORPAY_LIVE_LOW_PRICING_YEARLY_PLAN_ID_INR=plan_xxxxxxxxxxxxxx

# =============================================================================
# GitHub App - "Continue with GitHub"
# =============================================================================

# GITHUB_APP_ID=your_github_app_id_here
# GITHUB_APP_ID=538xxxx
# GITHUB_APP_SLUG=livereview-agent
# GITHUB_APP_CLIENT_ID=Iv2xxxxxxxxxxxxxxxx
# GITHUB_APP_CLIENT_SECRET=45665xxxxxxxxxxxxxxxxxxxxx
# GITHUB_APP_WEBHOOK_SECRET=your_github_app_webhook_secret
# GITHUB_APP_PRIVATE_KEY='-----BEGIN RSA PRIVATE KEY----xxxxxxuy\n-----END RSA PRIVATE KEY-----'
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,6 @@ scripts/prelivi/.venv/
email-preview
email-preview.html
livereview.dtx

# GitHub App private key (GITHUB_APP_PRIVATE_KEY)
*.pem
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# Frozen Docker dependency versions - see docker/docker-deps.env (single source of truth).
# scripts/lrops.py injects these as --build-arg for every build.
ARG NODE_IMAGE_TAG=20.20.2-alpine
ARG GOLANG_IMAGE_TAG=1.26.9-bookworm
ARG GOLANG_IMAGE_TAG=1.26.10-bookworm
ARG DEBIAN_IMAGE_TAG=trixie-20260824-slim

# Stage 1: Build React UI
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile.crosscompile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# Frozen Docker dependency versions - see docker/docker-deps.env (single source of truth).
# scripts/lrops.py injects these as --build-arg for every build.
ARG NODE_IMAGE_TAG=20.20.2-alpine
ARG GOLANG_IMAGE_TAG=1.26.9-bookworm
ARG GOLANG_IMAGE_TAG=1.26.10-bookworm
ARG DEBIAN_IMAGE_TAG=trixie-20260824-slim

# Stage 1: Build React UI once (architecture-agnostic)
Expand Down
12 changes: 12 additions & 0 deletions db/migrations/20261020090000_github_app_installations.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-- migrate:up
-- One GitHub App installation can belong to exactly one LiveReview org.
CREATE UNIQUE INDEX IF NOT EXISTS uq_integration_tokens_github_app_installation
ON integration_tokens (provider_url, provider_app_id)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: warning

PostgreSQL unique indexes treat NULLs as distinct by default. If provider_url is NULL, duplicate installations can be inserted.

Suggestions:

  1. Add NULLS NOT DISTINCT to the index definition on PostgreSQL 15+.
  2. Alternatively, guarantee provider_url is non-null with a default value like 'https://github.com'.

WHERE token_type = 'GITHUB_APP';

-- How the org was created; 'gh_app' for orgs created through /gh-login. Analytics + onboarding banner only.
ALTER TABLE orgs ADD COLUMN IF NOT EXISTS signup_path TEXT;

-- migrate:down
DROP INDEX IF EXISTS uq_integration_tokens_github_app_installation;
ALTER TABLE orgs DROP COLUMN IF EXISTS signup_path;
24 changes: 24 additions & 0 deletions db/migrations/20261022120000_managed_ai_gemini3_vertex.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
-- migrate:up
-- Google retired Gemini 2.5 Flash / Flash-Lite on Vertex AI on 2026-10-20. The managed tiers run on Gemini Enterprise
-- (Vertex AI), so the earlier bumps (which matched provider_name = 'gemini') never applied to them.
-- Gemini 3.x is only served from the global and us/eu multi-region locations, so the tier also records its location.
ALTER TABLE system_default_ai_configs ADD COLUMN IF NOT EXISTS gcp_location TEXT;

UPDATE system_default_ai_configs
SET model_name = 'gemini-3.8-flash', gcp_location = 'us', updated_at = CURRENT_TIMESTAMP
WHERE tier_name = 'default' AND provider_name = 'gemini-enterprise' AND model_name = 'gemini-2.5-flash';

UPDATE system_default_ai_configs
SET model_name = 'gemini-3.5-flash-lite', gcp_location = 'us', updated_at = CURRENT_TIMESTAMP
WHERE tier_name = 'default_lite' AND provider_name = 'gemini-enterprise' AND model_name = 'gemini-2.5-flash-lite';

-- migrate:down
UPDATE system_default_ai_configs
SET model_name = 'gemini-2.5-flash', updated_at = CURRENT_TIMESTAMP
WHERE tier_name = 'default' AND provider_name = 'gemini-enterprise' AND model_name = 'gemini-3.8-flash';

UPDATE system_default_ai_configs
SET model_name = 'gemini-2.5-flash-lite', updated_at = CURRENT_TIMESTAMP
WHERE tier_name = 'default_lite' AND provider_name = 'gemini-enterprise' AND model_name = 'gemini-3.5-flash-lite';

ALTER TABLE system_default_ai_configs DROP COLUMN IF EXISTS gcp_location;
21 changes: 21 additions & 0 deletions db/migrations/20261022130000_managed_ai_configs_admin.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
-- migrate:up
-- Managed AI admin page: a tier can hold several configurations (e.g. the old Vertex one and a new OpenRouter one),
-- exactly one of them active. GetSystemManagedConfig reads only the active row.
ALTER TABLE system_default_ai_configs DROP CONSTRAINT IF EXISTS system_default_ai_configs_tier_name_key;
CREATE UNIQUE INDEX IF NOT EXISTS uq_system_default_ai_configs_active_tier
ON system_default_ai_configs (tier_name)
WHERE is_active;
ALTER TABLE system_default_ai_configs ADD COLUMN IF NOT EXISTS label TEXT;
ALTER TABLE system_default_ai_configs ADD COLUMN IF NOT EXISTS updated_by_user_id BIGINT;

-- Orgs created through /gh-login?src=launch-trial may run reviews on the LiveReview model while on the Free plan.
ALTER TABLE org_billing_state ADD COLUMN IF NOT EXISTS free_managed_ai_granted_at TIMESTAMPTZ;

-- migrate:down
ALTER TABLE org_billing_state DROP COLUMN IF EXISTS free_managed_ai_granted_at;
ALTER TABLE system_default_ai_configs DROP COLUMN IF EXISTS updated_by_user_id;
ALTER TABLE system_default_ai_configs DROP COLUMN IF EXISTS label;
DROP INDEX IF EXISTS uq_system_default_ai_configs_active_tier;
-- Inactive rows have to go before the per-tier uniqueness can come back.
DELETE FROM system_default_ai_configs WHERE NOT is_active;
ALTER TABLE system_default_ai_configs ADD CONSTRAINT system_default_ai_configs_tier_name_key UNIQUE (tier_name);
Loading
Loading