Releases: christinoleo/semantic-posts
Release list
v0.2.2
Cosmetic fix for 0.2.0 / 0.2.1
After a user activated a Pro license, the Freemius admin UI rendered a "Download latest pro version" CTA whose link 404'd. The link tried to fetch a separate premium zip from Freemius's release deployment system — but SemanticPosts is distributed via GitHub Releases, not Freemius Deploy, so nothing was ever uploaded.
Root cause
The SDK init had is_premium: false, signaling "this is the free build, premium is a separate zip." For a single-codebase freemium plugin (Pro features live inline, gated by if checks) the correct flag is is_premium: true — telling the SDK that the code currently running already contains every Pro feature; the free tier is enforced by our own PaywallGate, not by Freemius's split-build mechanism.
Fix
- 'is_premium' => false,
+ 'is_premium' => true,
+ 'is_premium_only' => false, // free users still workSame pattern that WPForms Lite, MonsterInsights, and most modern WP freemium plugins use.
Impact
- Paying users: no more misleading "Download latest pro version" link. UI shows "Pro Active" cleanly.
- Free users: unchanged. Plugin works, paywall banner still appears at 200 posts, Upgrade CTA still visible.
- No functional change to indexing, the paywall gate, or any data.
Upgrade
Dashboard → Updates → Update now. Safe in-place — no data migration.
v0.2.1
Critical hotfix for 0.2.0
The 0.2.0 release zip was missing the bundled Freemius SDK because bin/build-zip.sh only copied src/ templates/ assets/ languages/ includes/ and silently skipped freemius/. Sites that auto-updated from 0.1.x saw sp_fs() return null at runtime — the paywall banner and Upgrade CTA never rendered, but no fatal error was thrown either (PaywallGate gracefully falls back to "not paying" when the SDK is missing).
Fix
- Added
freemiusto the directory list inbin/build-zip.sh. - Prunes Freemius dev-only files (gulp tooling, README, .editorconfig, etc.) before zipping so the runtime payload stays small.
Upgrade
Required if you installed 0.2.0. Dashboard → Updates → Update now. The paywall banner will appear on Settings after the update completes.
Verification
Demo deploy confirmed:
version: 0.2.1freemius/start.php: ✓sp_fs(): ✓ slug=semantic-postsgate.is_locked(200): yes
v0.2.0
What's new
Free-tier paywall. SemanticPosts now ships with a free tier capped at 200 indexed posts — enough for personal blogs and small businesses to use the plugin indefinitely without paying. Beyond that, a Pro license is required to keep adding new posts to the Similarity Graph.
Pricing
| Plan | Price | Best for |
|---|---|---|
| Free | $0 | Up to 200 posts |
| Pro Monthly | $4.99 / mo | Trial or short-term sites |
| Pro Annual | $29.99 / yr | Standard — ~50% off vs monthly |
| Pro Lifetime | $89.99 once | Long-term sites that prefer no renewals |
How the gate behaves
- Existing widgets keep working regardless of license state. Already-indexed posts are never touched.
- Cold start halts gracefully when the gate engages; posts simply stay in the unindexed queue.
- Resumes automatically as soon as Pro is activated — no manual re-trigger needed.
- Filter override: hosting partners can raise/lower the cap via
semantic_posts_free_post_limit.
Settings page UI
A tri-state banner now appears above the form:
- 🟢 Pro active — indexed count displayed, no warnings
- 🔵 Free tier —
X / 200 posts indexed - 🔵 Approaching — same display when ≥80% used, with upgrade CTA
- 🟡 Locked — warning that indexing has paused, prominent Upgrade button
Privacy & WP.org compliance
- Freemius opt-in modal is off by default (
anonymous_mode: true). The plugin works immediately — users can opt in to analytics later from Settings. uninstall.phpnow invokes the Freemius SDK uninstall hook before clearing plugin data, so no account/option residue is left behind.readme.txtadds the required Freemius disclosure for WP.org plugin review.
Internal changes
- New
SemanticPosts\Paywall\PaywallGateclass encapsulates all license-gate logic; the rest of the codebase never touches Freemius types directly. ColdStartProcessor::run_batchchecks the gate per-post so the limit kicks in mid-batch as the count crosses 200.- Bundled Freemius WordPress SDK at
freemius/(5.6 MB). - 6 new PHPUnit tests in
PaywallGateTestpin the gate behavior; full suite stays at 290 / 290 green.
Upgrade
Dashboard → Updates → Update now (the auto-updater finds this release via the GitHub Releases API). Safe in-place — no data migration. Sites already above 200 indexed posts continue serving widgets without interruption; only new posts get the gate.
v0.1.5
What's new
Ships a small, opinion-light frontend stylesheet so the related-posts widget looks polished out-of-box without fighting the theme's design.
What it adds
assets/css/frontend.css— structural only (grid, hover lift, image sizing, radius), enqueued on the public site- Five CSS variables for trivial restyling:
--sp-gap,--sp-radius,--sp-shadow,--sp-shadow-hover,--sp-accent - New filter
semantic_posts_enqueue_stylesfor complete opt-out
Why
The previous philosophy ("the theme decides") meant the widget looked broken on themes that didn't already style .related-posts. This release fixes that without imposing colors or typography — those still inherit from the theme. Industry standard (Jetpack Related Posts, YARPP, Yoast all ship base styles).
Opt out
add_filter( 'semantic_posts_enqueue_styles', '__return_false' );Architectural notes
- AR-14 unaffected — that rule restricts jQuery on the render path, not CSS.
- NFR-PERF-3 unaffected — that rule was about outbound HTTP per render, not plugin-local assets.
- ~1 KB gzipped contribution to page weight.
Upgrade
Dashboard → Updates → Update now. Safe in-place; no data migration.
v0.1.4
SemanticPosts release.
sha256: fb52f2d7b25386dd792b89d42e1115b4ec699c40fdc5250f9a8e86e1b805510d
size: 122254 bytes
Built from 5723ac7.
v0.1.3
SemanticPosts release.
sha256: 894da5068e2c6f9a4651d7561830811a28efde4447195769c7576bcbd949ab9f
size: 121910 bytes
Built from e9311e6.
v0.1.2
SemanticPosts release.
sha256: f3d76b9ccb91b49f674e4256b45a0c18a1565a8ab1327b50ab3537a8c7b7e8e1
size: 121220 bytes
Built from ad52cf9.
v0.1.1
SemanticPosts release.
sha256: 70ffd0f64b6d2cdbdeacb8d0fdb4e78311d466dafe75bb290c3b9ab5af6c5a05
size: 118221 bytes
Built from 54c5290.
v0.1.0
SemanticPosts release.
sha256: 9eb98456b431c3979031969f3dd6db05848187b7b8b45e4536ab88ec157f2930
size: 117895 bytes
Built from 48924ba.