Per-block tier guards: each registered Gutenberg block is now wrapped with Tier::can( $feature ). Locked blocks render an inline “Pro feature” CTA instead of the widget. All v1 blocks remain accessible to anonymous users (matrix default); guards activate for v1.x+ Pro blocks.
0.7.1
New Tier::can( string $feature ): bool checks whether current tier can access a feature.
New Tier::matrix(): array returns feature → allowed tiers map, filterable via astroway_tier_matrix so addons can declare their own features.
New utility class AstroWayWPPluginTier with Tier::current() resolving the user’s plan from cached /v1/auth/keys/me response (30 min TTL). Returns anonymous/free/indie/starter/pro/business/internal.
AddonAPI::current_tier() refactored as facade delegating to Tier::current(). First piece of tier-gating subsystem (v0.7.x).
0.6.5
New developer guide docs/addon-development.md documents the v0.6.x Addon Hooks API + AddonAPI reference + minimal working example.
New example addon scaffold docs/example-addon/ shows shortcode registration + tier check + widget declaration.
Closes the Addon Hooks API atomic stack v0.6.0-v0.6.5. Track 3 addon plugins can now develop against a stable surface.
0.6.4
New public class AstroWayWPPluginAddonAPI — BC-locked stable surface for addon developers. Methods: register_widget(), current_tier(), api_base(), has_key(), cache_key(). Internal classes (RendererDecisions, ApiClient, Cache, Admin) remain unstable.
0.6.3
New filter: astroway_widgets lets addons append entries to the widget registry without touching core. Useful for new shortcodes/blocks that map to api /v1/embed/* endpoints.
0.6.2
New action: astroway_register_blocks fires at end of Blocks::register_assets_and_blocks(). Addons hook here to call register_block_type() for their own astroway/* Gutenberg blocks.
0.6.1
New action: astroway_register_shortcodes fires at end of Shortcodes::register(). Addons hook here to call add_shortcode() for their own astroway_* shortcodes.
0.6.0
New action: astroway_init fires early in plugin boot, signalling addons that core classes are loaded and they can hook into upcoming registration actions.
First atomic piece of the Addon Hooks API (v0.6.0-v0.6.5). Unlocks third-party addon ecosystem.
0.5.5
Admin: new “Update channel” panel on the API Key page shows current channel (A/B), whether PUC library is loaded, whether an API key is set, and last update check timestamp.
Closes the Channel B atomic stack v0.5.0-v0.5.5. Plugin meets the v1.0 “Channel B custom updater” stability gate condition.
0.5.4
Channel B update checks now send Cache-Control: no-cache + Pragma: no-cache headers, ensuring fresh response from astroway.info even if a transit cache sits between WP and the server.
“View details” modal verified to render correctly with PUC defaults — pulls changelog/sections from update.json.
0.5.3
Channel B custom updater wired via plugin-update-checker — registers against https://astroway.info/wp-plugin/update.json with the saved API key carried as ?key= query arg.
When PUC is absent or the server endpoint is unreachable, wp.org Channel A continues to deliver updates as before.
0.5.8
Follow-up hotfix on v0.5.7: also guards require_once for class-updater.php and class_exists() checks around Updater::boot() / ElementorLoader::boot(). All forward-version dependencies in the main plugin file and Plugin::boot() now degrade gracefully if the corresponding includes/ files aren’t bundled in the current ZIP.
0.5.7
Hotfix on top of v0.5.6: the main plugin file required class-tier.php / class-addon-api.php / elementor.php unconditionally, but those classes only ship in later versions and were missing from the v0.5.6 ZIP — every page load fatal-erred. Those three require_once calls are now guarded by file_exists() so older ZIPs load cleanly. Also wraps Tier::current() in class_exists() for the same reason.
No behavior change for v0.5.6 features (review prompt + anonymous rate-limit guard) — they keep working as designed.
0.5.6
Added a one-time review prompt in WP admin shown 14 days after activation, dismissible per-user.
Anonymous rate-limit guard: when the api responds that the public 30/h-per-IP limit is exhausted, the plugin now skips rendering the iframe (no more raw JSON error visible to visitors) and surfaces a one-time admin notice pointing the site owner at a free API key. Paid tiers and any configured API key skip the probe entirely. The probe itself is cached for 5 minutes in a transient so it adds at most one extra api hit per site every five minutes.
0.5.2
Bundled YahnisElsts/plugin-update-checker v5.6 library at includes/lib/plugin-update-checker/ — autoloaded via load-v5p6.php. Foundation for v0.5.3 Channel B update hook.
No new user-visible behavior. PUC is loaded but no update checker instance is created yet.
0.5.1
Channel B download endpoint live at astroway.info/wp-plugin/download/{version}/ — 302-redirects paid-tier keys to versioned ZIP on GitHub Releases.
update.json now returns full download_url field for paid tiers.
No user-visible plugin code change. Plugin-side update hooks land in v0.5.3.
0.5.0
Channel B server endpoint deployed at astroway.info/wp-plugin/update.json — paid-tier auto-update infrastructure (first of 6 atomic pieces, v0.5.0-v0.5.5).
No user-visible plugin code change. Plugin-side updater hooks land in v0.5.3.
0.4.0
CI/Tests infrastructure: PHPUnit unit tests + WPCS lint via GitHub Actions matrix (PHP 8.1-8.4 full test, 7.4/8.0 syntax compat)
Refactor: input sanitization extracted as public statics on Shortcodes class (no behavior change, enables addon reuse)
No user-visible changes — pure foundation for upcoming addon ecosystem (v0.6.0)
0.3.0
New: live Status panel on the API Key admin landing — plan / credits / period / domain pulled from /v1/auth/keys/me (30 min transient cache)
New: lang attribute on all 5 shortcodes (e.g. [astroway_natal date=”…” lang=”ru”]) — 21 api-supported locales
New: Language Inspector dropdown on all 5 Gutenberg blocks — uk, en, de, ru, pl, es, pt, fr, it, nl, cs, ro, hu, el, tr, ar, hi, ja, ko, vi, id
Default lang resolves to the WP site locale; invalid codes silently fall back, no user-facing error
Status panel handles all 5 states: valid / suspended / revoked / invalid_key / api_down with per-state color accent
Requires api.astroway.info v2.33.0+ for /v1/auth/keys/me; falls back to legacy /v1/keys/usage with “Limited data” notice on older self-hosted api
No regressions on v0.2.3 — existing shortcodes/blocks without lang= render in site default exactly as before
0.2.3
All 3 subpages share one hero (brand + status badge + CTAs); only title and tagline vary per page
Right sidebar restored (Resources + System + quote) in a 1fr + 280px grid
Buttons read as buttons in both light panels and the dark hero (ghost variant + on-dark override)
Shortcode reference cards gain proper panel-body inset
New: city → lat/lon/IANA-tz helper on the Shortcodes page (server-side proxy to app.astroway.info atlas + click-to-copy snippet)
Type tokens drop bundled webfont declarations — pure ui-sans-serif/system-ui stack, multi-script coverage via OS fonts
Translation filenames corrected to {textdomain}-{locale}.mo + explicit load_plugin_textdomain call
0.2.2
Admin UI split into 3 submenu pages: API Key (default landing), Settings, Shortcodes
API Key landing rebuilt with 3-tier comparison (Anonymous / Free key / Paid), state badge, key form, prominent CTAs
Settings page focused on diagnostics: Connection ping, Cache stats + purge, System info with Copy diagnostic button
Shortcodes page rebuilt as expanded reference cards (description + copyable code + params table + Gutenberg block hint per shortcode)
JS split per-page (api-key / settings / shortcodes), reducing payload on each admin screen
0.2.1
Settings page promoted to a top-level admin menu item with a custom brand icon (star inside orbit ring, single-path SVG)
Activation notice rebranded with a cosmic-gradient mark, two CTAs (Get free API key / Open Settings), and persistent dismiss (fix for a latent bug where the dismiss action did not survive page reloads)
Settings page fully redesigned with an observatory aesthetic — hero with owl-moon logo, four numbered panels (API key / Connection / Cache / Shortcodes), right-side Resources / System / quote aside, paper-warm cards with gold hairlines
Shortcode rows copy-to-clipboard on click
ASTROWAY_WP_PLUGIN_VERSION constant auto-derived from the plugin header via get_file_data — single source of truth, simpler release pipeline
0.2.0
Settings page under Settings → AstroWay (API key input, Verify Key, Test Connection, Cache controls, shortcode reference, Diagnostics)
API key field accepts both sandbox (aw_test_) and live (aw_live_) keys
All keyed requests now carry X-Api-Key + X-AstroWay-Site-URL headers (lazy domain bind support)
Plugin row links: Settings + Get API Key (with ?source=wp_plugin)
Activation notice CTA URL includes ?source=wp_plugin for referrer-source tracking
New transient cache layer (prefix astroway_v1_) with purge button + stats
Verify Key gracefully falls back to /v1/keys/usage until api ships /v1/auth/keys/me (Block A)
0.1.0
MVP — 5 iframe shortcodes via /v1/embed/* (works without API key, 30/hr per IP)
5 Gutenberg blocks with ServerSideRender
Vanilla CSS theme-overridable via CSS vars (–astroway-*)
i18n .pot + EN/UK/DE/PL base translations
Graceful 429 handler with ‘Get free API key’ admin notice
0.1.0-alpha.1
Initial scaffold (pre-release). Plugin header + PSR-4 autoload + activation hooks. No shortcodes yet — first functional release planned as 0.1.0.