Repository navigation
chore: merge main into m18/cloud (#133, new prices and Pro) - #134
Merged
Merged
Conversation
… card and a news post (#133) - pricing.json: Pro (the `starter` code) $4.99 a month, $39 a year or $79 once, on 3 Macs; Team $12 a seat a month or $120 a seat a year, from 2 seats, with no one-time price. The card shows Team's yearly price as a month's share, billed yearly, and says Team is a subscription when One-time is chosen. - Starter is Pro in every language's copy, catalog and legal page. Release posts keep the name they shipped with. - An Enterprise card: a contact route to hello@ with a fixed subject, so inquiries can be counted. No price, no checkout. - A notice above the plans links the post that explains the change. - The blog gets a third kind, news (`kind: news`), listed first on /blog and in llms.txt's Optional section, with its own test. The first one is new-prices-2026, in English and Vietnamese, with its OG cards. - Copy that said Team can be bought once is corrected in 12 languages.
Brings #133: Pro (the `starter` code) at $4.99/$39/$79, Team at $12 a seat monthly or $120 yearly from 2 seats with no one-time price, Starter renamed Pro, the Enterprise contact card, the new-prices notice, the blog news kind with the new-prices-2026 post, and its test changes. Conflicts and how each was resolved: - resources/data/pricing.json: main's prices on m18's keys. Team has monthly and yearly only and `seats: {min: 2}`; m18 keeps `license.deviceLimit` and no `activations`, `activationsPerSeat` or seat `max`. - resources/js/lib/data/pricing.ts: m18's types with main's TeamCycle. Team prices are monthly and yearly only, tierPrice() returns undefined and sells() false for Team one-time, and teamTotal() takes a TeamCycle and keeps m18's minimum-only clamp. - pricing-card.tsx, pricing-plans.tsx, plan-matrix.tsx, structured-data.ts: m18's signatures (`maxSeats`, no `checkout` prop) and short comments, with main's disabled Team one-time button, the subscription-only note, Team yearly shown per month, and the Enterprise card. - pages/Pricing.tsx: m18's page with main's price-change notice above the plans. - i18n/messages/*/pricing.ts (12): m18's Team activation ("one person per seat, on up to N Macs"); main's "Everything in Pro", the `subscriptionOnly` note and the Enterprise messages. - content/*/faq.json, features/sync-and-teams.json, pricing.json (36): m18's account-model copy, with Starter renamed Pro. - legal/*/privacy.md, refund-policy.md, terms.md (36): m18's text with Starter renamed Pro, updatedAt 2026-11-02. - PricingDataTest, LegalPagesTest, PricingPageTest, compare-model.test.ts: m18's assertions at the new prices and dates, with the Pro name. Changes for main's decisions in copy that exists only on m18: - "Starter" is Pro in the pricing page's "Using TablePro at work" ask and the refund policy's self-refund paragraph, in 12 languages. - "A team without a subscription buys more one-time seats there" now says a team keeps its one-time seats and adds seats with a Team subscription (FAQ, pricing, Sync & Teams; 12 languages). Team Lifetime is no longer sold. - ReviewedFactsTest pinned that sentence; it now pins the new one and rules out the old. - tests/js/regional-pricing.test.ts models GET /v2/pricing at the new prices: Team from 2 seats with no lifetime plan. It adds the new prices' rounding cases.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Merges
mainintom18/cloud.m18/cloudwas one commit behind: #133, live on tablepro.app since 2026-11-02. It brings:pricing.json: Pro (thestartercode) at $4.99 a month, $39 a year or $79 once; Team at $12 a seat a month or $120 a year, from 2 seats, with no one-time price.tiers.team.subscriptionOnly).content.priceChange), and the blog news kind with thenew-prices-2026post in English and Vietnamese, with its OG cards.Conflicts
resources/data/pricing.json: main's prices on m18's keys. Team has monthly and yearly prices only, andseats: {min: 2}. m18 keepslicense.deviceLimitand has noactivations,activationsPerSeator seatmax.resources/js/lib/data/pricing.ts: m18's types with main'sTeamCycle. Team prices are monthly and yearly only.tierPrice()returns undefined andsells()false for Team one-time.teamTotal()takes aTeamCycleand keeps m18's minimum-only clamp.pricing-card.tsx,pricing-plans.tsx,plan-matrix.tsx,structured-data.ts: m18's signatures (maxSeats, nocheckoutprop) and short comments. On top of them: main's disabled Team one-time button, the subscription-only note, Team yearly shown per month, and the Enterprise card.pages/Pricing.tsx: m18's page, with main's price-change notice above the plans.i18n/messages/*/pricing.ts(12 locales): m18's Team activation line ("one person per seat, on up to N Macs"), plus main's "Everything in Pro",subscriptionOnlyand theenterprisemessages.content/*/faq.json,features/sync-and-teams.json,pricing.json(36 files): m18's account-model copy, with Starter renamed Pro.legal/*/privacy.md,refund-policy.md,terms.md(36 files): m18's text, with Starter renamed Pro andupdatedAtset to 2026-11-02.PricingDataTest,LegalPagesTest,PricingPageTest,compare-model.test.ts: m18's assertions at the new prices and dates, with the Pro name.Main's decisions in copy that exists only on m18
Tests changed on purpose
tests/Feature/Content/ReviewedFactsTest.php: the pricing page's reviewed fact pinned "buys more one-time seats there". It now pins "more seats come with a Team subscription" and rules out the old sentence.tests/js/regional-pricing.test.ts: modelsGET /v2/pricingat the new prices, with Team from 2 seats and no lifetime plan. The seat-maximum case moves to Team yearly. It adds the new prices' rounding cases, such as $4.99 at 50% giving $2.49.Merge
Merge with a merge commit, not a squash, so the next sync starts from this one.
Checks
php -d memory_limit=2G vendor/bin/pest --exclude-group=ssr: 1999 passed.npm run typecheck: passes.npm run test:js: 292 passed.vendor/bin/pint --test: passed.php artisan assets:generate --check: up to date.composer audit --locked: no advisories.npm run build, thenREQUIRE_SSR=1 php -d memory_limit=2G vendor/bin/pest --group=ssrwith the SSR service on the.envport: 259 passed and 1 skipped (the hero is supplied). The only failures are 9 inPageChunkTest, which fails locally on every branch becausenode_modulesis a symlink.