Changelog

Release archive

Older Pushify releases. The latest updates live on the main changelog.

v0.2.0-beta.21

Platform & API

Security

  • OAuth login no longer bypasses two-factor authentication. Google and GitHub sign-in issued a full session immediately, ignoring the account's twoFactorEnabled flag — so a user who had enabled 2FA (or whose email/password account got linked to an OAuth identity) could log in without the second factor. googleLogin/githubLogin now apply the same 2FA gate as password login: when 2FA is enabled they return a short-lived requiresTwoFactor challenge instead of tokens, and the client completes via the existing POST /auth/login/2fa. No full session is created until the second factor is verified.

v0.2.0-beta.20

Platform & API

Changed

  • Transactional emails are now light-themed ("Clean Pro"), matching the dashboard light mode. Flipped the shared email-templates.ts palette (light canvas/card, dark text, indigo #6366f1 button) and replaced the hardcoded near-white emphasis (#fafafa) with dark #18181b so bold text is readable on light cards. Deployment/health status accents (green/red/gray) are unchanged.

Added

  • Six new account & security emails, all bilingual (EN/TR), sent fire-and-forget so a mail failure never breaks the underlying flow: - Welcome — on registration (alongside email verification), with a button to the dashboard. - Password changed — confirmation after a successful password change, with a security note and reset link. - 2FA enabled / 2FA disabled — security confirmations wired into the two-factor enable/disable flow. - Server ready — sent when a managed server finishes setup (both the managed-server setup worker and the BYOS path), deep-linking to the server. - New sign-in — alert when an account is accessed from a new device. Only fires when the user has prior sessions and none used the same user-agent (no spam on first login or known devices); password-login sessions now also store IP/user-agent to power this detection.

v0.2.0-beta.30

Dashboard

Changed

  • Redesigned the Settings tabs to a clean, airy Cal.com-style layout using a new reusable SettingsCard primitive (quiet bordered panel: title + muted description header, body, and an optional tinted footer bar that right-aligns the primary action). Applied consistently across Profile, Appearance, Notifications, Security, Sessions, and API Keys — all on the existing design tokens. Presentational only: hooks, handlers, and sonner toasts are unchanged; typecheck clean.

v0.2.0-beta.29

Dashboard

Changed

  • Settings tabs (Profile, Appearance, Notifications, Sessions) now use the app-wide sonner toast for save/validation feedback instead of inline AlertBox "saved" banners — consistent with the rest of the app. Removed the local saved/error state + timeouts; added the matching toasts i18n keys (EN + TR). Server/mutation errors flow through the existing global error toast.

v0.2.0-beta.28

Dashboard

Changed

  • Finished the new-project page refactor: the Step 1 "import source" block (GitHub/GitLab connect, repo/branch selection, framework detection) was moved into a useImportSource hook plus a presentational ImportSourceStep component. page.tsx is now 462 lines (down from the original 1,489). The step's props are typed via Pick<ReturnType<typeof useImportSource>> so the compiler enforces complete prop threading. Pure refactor — state/effects moved verbatim, typecheck clean.

v0.2.0-beta.27

Dashboard

Changed

  • Continued component extraction across four more large files (pure refactors, no behavior change, typecheck clean): - Monitoring page: 687 → 212 lines — helpers + chart/table sections into monitoring/components/. - Server detail page: 650 → 396 lines — status banners + provider/network sections into servers/components/. - Database detail sections: split the 670-line DatabaseDetailSections.tsx into one file per component under components/databases/detail/; the original file is now a thin re-export so import sites are unchanged. - Site editor: extracted the ToolbarToggle/SectionHeading/Field helpers into site-editor/parts/; the stateful editor panels were intentionally left in the parent to avoid risky prop threading.

v0.2.0-beta.26

Dashboard

Changed

  • Continued the component-extraction cleanup on the two next-largest pages (pure refactors, no behavior change, typecheck clean): - Docs page (app/docs/page.tsx): 1,445 → 247 lines. Extracted the 10 API-reference sections into app/docs/sections/ with a shared shared.ts (types + param defs). - New project page (projects/new/page.tsx): 1,489 → 1,067 lines. Extracted the step panels (ProgressSteps, ConfigureStep, EnvironmentStep, ReviewStep), EnvVariableRow, and WebhookSecretModal into projects/new/components/. The Step 1 "import source" block (deeply entangled with 25+ state values) was intentionally left in the parent for now.

v0.2.0-beta.25

Dashboard

Changed

  • Refactored the project detail page from a single 3,546-line file into a thin orchestrator (492 lines) plus 12 extracted components under projects/[id]/components/ (OverviewTab, DeploymentsTab, EnvironmentTab, DomainsTab, DomainCard, NginxSettingsModal, ToggleOption, SettingsTab, NotificationsTab, HealthCheckSection, PreviewDeploymentsSection, MetricsSection). Pure refactor — no behavior change; typecheck clean.

v0.2.0-beta.24

Dashboard

Fixed

  • Project detail data (status, production URL, last-deployed time) now refreshes automatically when a deployment finishes. The deployment:status realtime handler previously invalidated only the deployment queries; it now also invalidates the project detail query (and the domains list on first success), so the page no longer shows stale info after a deploy.

v0.2.0-beta.23

Dashboard

Added

  • Supabase marketplace projects show an info note on the Environment tab explaining how to enable social login (OAuth): set GOOGLE_ENABLED/GOOGLE_CLIENT_ID/GOOGLE_SECRET and Redeploy, with the exact provider callback URL (<app-url>/auth/v1/callback) for the project. No SSH needed — the existing env-edit + redeploy flow already applies it.

v0.2.0-beta.22

Dashboard

Fixed

  • Mobile sidebar: the page behind the drawer no longer scrolls while it's open — background scroll is now locked (body overflow) and the backdrop ignores touch gestures (touch-none, overscroll-contain). The sidebar also uses h-dvh so its full height (including the user row) fits the visible viewport on mobile browsers with dynamic chrome.

v0.2.0-beta.21

Dashboard

Fixed

  • Dark mode on the auth (login/register) and landing pages now follows the app theme toggle. Tailwind v4's dark: variant was defaulting to the OS prefers-color-scheme because no @custom-variant dark was defined — so when the app theme was dark but the OS was light, those pages stayed in light styles. Added @custom-variant dark (&:where(.dark, .dark *)) so dark: utilities are driven by the .dark class set in stores/theme.ts, consistent with the rest of the app.

v0.2.0-beta.20

Dashboard

Changed

  • Language is no longer switchable from the public UI — removed the language toggle from the landing navbar, dashboard header, and auth screens. Language now auto-detects the device/browser language on first visit and is changed only from Settings → Appearance. (Browser auto-detection in stores/locale.ts and the Settings language control already existed; this removes the redundant public toggles.)

v0.2.0-beta.19

Dashboard

Fixed

  • Content-Security-Policy was blocking Google Analytics — script-src now allows https://www.googletagmanager.com and https://www.google-analytics.com, so GA4 (gtag.js) loads. (connect-src/img-src already permit https: for the analytics beacons.)

v0.2.0-beta.18

Dashboard

SEO

  • FAQPage structured data on the comparison pages (/vs/coolify, /vs/vercel), generated from the FAQ content already on each page — unlocks FAQ rich results in Google for "pushify vs coolify / vercel" queries.
  • Internal linking for topical authority: comparison pages now cross-link to each other plus a deploy guide, pricing, and features; framework deploy pages link to the comparison pages and features.
  • AI-search (GEO): strengthened llms.txt with explicit "alternative to Coolify/Vercel/Heroku/Render/Railway" framing and links to the comparison guides; added llms-full.txt — a self-contained product overview (definition, comparisons, features, quick-start, FAQ) for AI assistants doing deep research.

v0.2.0-beta.17

Dashboard

Added

  • Google Analytics 4 integration (Measurement ID G-SW4LNQEV9M, overridable via NEXT_PUBLIC_GA_ID). Loads in production builds only — local dev stays tracking-free.

v0.2.0-beta.16

Dashboard

Added

  • Workspace switcher in the sidebar footer: users who belong to more than one organization can switch the active workspace from a dropdown (shows each org + the user's role, with the current one checked). Switching re-scopes the session and refetches all org data (projects, servers, billing, members…).
  • Accepting a team invitation now auto-switches the member into that team's workspace, so they immediately land on the team's resources instead of their own (empty) personal workspace.

v0.2.0-beta.15

Dashboard

Fixed

  • Team invite links now work for already-signed-in users. The (auth) layout used to redirect any authenticated visitor to the dashboard before /accept-invitation could render, so clicking an invite link from email appeared to "do nothing". The layout now makes an exception for the invite flow, letting logged-in invitees see and click "Accept".

Added

  • Server creation page now shows the plan's server quota ("{used} of {limit} servers used on your {plan} plan"). When the limit is reached it switches to an upgrade prompt (link to Compare Plans) and disables the Create button, instead of only surfacing a 403 after submit.

v0.2.0-beta.19

Platform & API

Added

  • Workspace switching for multi-org users. New GET /organizations/mine (lists every org the user belongs to, with their role) and POST /organizations/switch (verifies membership, then re-issues a token pair scoped to the target org). This is what lets an invited team member actually reach the inviting org's projects/servers — previously their session stayed locked to their personal org.

v0.2.0-beta.18

Platform & API

Fixed

  • Included compute credit is now sized dynamically to the cheapest plan-eligible server's *current* monthly price (live Hetzner + dynamic FX, plus headroom), capped at a per-plan ceiling — instead of a fixed amount that could fall just short of the wallet threshold required to start a server as FX / IPv4 prices moved. Fixes paying customers being unable to start their entry server despite the credit having been granted. includedInfraCreditCents is now the ceiling, not the exact grant; new getCheapestEligibleMonthlyCents() and computeIncludedCreditTargetCents(). The backfill script reuses the same dynamic target (--dry-run reports it).

v0.2.0-beta.17

Platform & API

Added

  • Included compute credit per plan: paid plans now bundle a monthly managed-infra allowance (Hobby ~$6.50, Pro ~$18, Business ~$45) so a paying customer can start their entry server without a separate top-up. Credit is granted on every paid invoice (initial checkout + renewals) by topping the infra wallet up to the plan allowance — never above it. New includedInfraCreditCents field on each plan and infraBillingService.grantIncludedInfraCredit().

Notes

  • Loss-prevention by design: each allowance is kept below the plan's net margin; the grant never over-credits (a customer who already holds ≥ the allowance gets nothing) and is idempotent across webhook retries; and the existing "wallet hits 0 → suspend server" backstop still caps provider spend at what the customer funded.
  • Bundled grants are recorded as credit_topup ledger entries tagged metadata.bundled = true (no schema migration required).
  • Backfill for customers who subscribed before this release: npm run backfill:infra-credit (add -- --dry-run to preview). Idempotent — only tops up organizations still below their plan allowance.

v0.2.0-beta.16

Platform & API

Fixed

  • Billing checkout no longer returns a 500 (No such customer) when an organization carries a Stripe customer ID created in a different mode — e.g. a leftover test-mode customer after switching to live keys. getOrCreateCustomer now verifies the stored customer exists in the current Stripe mode and transparently recreates it if it is missing or deleted.

v0.2.0-beta.15

Platform & API

Improved

  • Managed-infra billing now uses a live EUR→USD exchange rate (ECB via Frankfurter, cached in-memory with a 12h refresh) instead of a hardcoded 1.08, so a strengthening EUR no longer erodes the infra margin. Pricing reads the cached rate synchronously (never blocks on the network); on fetch failure it falls back to the configured floor.

Added

  • INFRA_FX_BUFFER_PERCENT (default 2) — safety buffer % applied on top of the live FX rate to absorb intraday swings.
  • INFRA_PROVIDER_SURCHARGE_EUR (default 0) — flat per-server surcharge in EUR added before margin to cover provider extras like IPv4 (~0.50).

Changed

  • INFRA_EUR_TO_USD_RATE is now the fallback/floor rate (used only when the live FX fetch fails or returns a lower value), not the primary conversion rate.

v0.2.0-beta.14

Dashboard

Added

  • Site Editor full-screen professional shell (WordPress-style): top toolbar (device/mode toggles, Save/Publish), left icon rail with contextual panels (pages, blocks, design, SEO, CMS, settings), center canvas, right inspector.
  • Multi-page management (PagesPanel): add, rename, delete, and switch pages.
  • Design gallery (DesignGallery) template picker for swapping the whole site design.
  • Static-site stack option in Site Studio (launch without a CMS / without a domain).

Fixed

  • Editor canvas now scrolls vertically so the full page (down to the footer) is reachable in edit mode.

v0.2.0-beta.14

Platform & API

Added

  • Static-site stack: publish editor sites on an auto-assigned port with no domain required (port-mode nginx + automatic firewall opening), alongside the existing domain/SSL path.
  • Multi-page sites: new pages jsonb column (migration 0029, with backfill of existing single-page sites) and a PUT pages API; renderer emits multi-file output (index.html + per-page directories) with a shared sticky nav.
  • Design gallery API (getDesigns / applyTemplate) powering the editor's template picker.

Fixed

  • Static-site deploys now run through the standard deployment pipeline (deployment record + worker), so deployments start automatically after launch.
  • RHEL/CentOS compatibility: write site nginx configs to conf.d (not sites-available) and apply SELinux port/content labels (semanage + chcon) — fixes BYOS "SFTP: No such file" and port-not-open failures.

Improved

  • Site publish writes all pages to the server (container or static fallback) in a single pass.

v0.2.0-beta.13

Dashboard

Improved

  • Site Editor: direct canvas drag-to-reorder with a hover/selected drag handle, floating DragOverlay preview, and animated insertion; contextual block insertion (after the selected block); polished layers-panel DnD.

Security

  • Sanitize block URLs and theme colors in the client site renderer; add a Content-Security-Policy header.

v0.2.0-beta.13

Platform & API

Security

  • Fix authenticated command injection via project env-var values in remote/local Docker deploys (shell-quote all values).
  • Add missing organization-ownership checks: notification channels, marketplace deploy serverId, database disconnect.
  • Authorize WebSocket channel subscriptions (resolve project:/server:/database: to the owning org).
  • Add SSRF guard for health-check, notification webhook/Slack, and CMS-sync outbound fetches.
  • 2FA brute-force attempt limiting; derive the rate-limit client IP from the socket (TRUSTED_PROXY_HOPS).
  • Stripe webhooks: derive plan from the real price, make the DB the authoritative subscription→org mapping, fail dedupe closed.
  • Sanitize site renderer (theme colors + block URLs); role gates on billing, database connect, domain and env-var writes.

Fixed

  • Robust deploy firewall port opening for BYOS servers — works without sudo/ufw (ufw → firewalld → iptables, root-first).

Improved

  • Strapi marketplace template auto-provisions Postgres and injects DB env (zero manual setup).
  • Data-driven Site Studio template catalog with per-template themes (sites/site-templates.ts).

v0.2.0-beta.12

Dashboard

Added

  • Site Editor at /dashboard/projects/[id]/site-editor: drag-and-drop blocks (@dnd-kit), layers, palette, inspector.
  • Canvas click-to-edit (inline contentEditable) and Preview iframe mode.
  • Theme panel (colors, fonts) and image upload field (server assets or base64 fallback).
  • New blocks UI: banner, stats, pricing, FAQ; Design | CMS & SEO | Headless CMS tabs.
  • Server terminal view component (WebSocket shell).

Improved

  • Project detail: Site Editor entry link; server terminal page refactor; i18n (en / tr).

v0.2.0-beta.12

Platform & API

Added

  • Site Editor API: block CRUD, theme, publish to /pushify-site/, asset upload (SSH → container assets).
  • Headless CMS bridge (Strapi/Directus URLs) and optional CMS sync on publish.
  • Block types: hero, features, banner, stats, pricing, FAQ, CTA, footer; HTML renderer + default blocks.
  • Migrations 0027_project_site_editor, 0028_site_editor_theme.
  • Server terminal WebSocket (/api/v1/servers/:id/terminal/ws) with shell session helper.
  • Deployment queue worker, scheduler, and deploy concurrency limits.
  • Read-through cache helper; dashboard attention summary fields.

Fixed

  • BullMQ deploy job IDs: deploy-{id} (colons rejected by BullMQ — fixes Site Studio launch queue errors).

Improved

  • Site Studio launch initializes project_site_editor row.
  • Deployment worker scheduling; metrics worker filters; SSH utilities for asset upload.

v0.2.0-beta.11

Dashboard

Added

  • Dashboard attention summary row opens a detail sheet (fix styles via dash-app scope).

Improved

  • Compact “needs attention” strip; clearer storage quota label and peak note.