TubePress changelog
Latest release: v1.2.42 · October 20, 2026 · 180 releases and counting
Every TubePress core release, newest first — published from the same release system that powers the free download and the one-click updater inside the admin, and mirrored to GitHub Releases. Each package is Ed25519-signed and verified before it is applied, with an automatic backup taken first, so updating never costs you your settings, themes or content. Premium plugins and themes ship separately through the marketplace and have their own release notes.
October 2026
Video sitemap: no more "Missing thumbnail" errors in Google Search Console
- On storages with Secure URLs, imported videos no longer list an admin-only thumbnail link that Google cannot open.
- A video with no public thumbnail is now listed as a normal page instead of an invalid video entry, so Search Console stops reporting errors and the page is still crawled.
- After updating, open SEO → Sitemap, click Regenerate, then resubmit your sitemap in Search Console.
More reliable update downloads
- If the connection to the update server drops or the server is briefly unavailable while an update, plugin or theme is downloading, TubePress now retries automatically (up to 3 attempts) instead of failing at once.
- If the update server really cannot be reached, the message now says so plainly: nothing was changed on your site, and you can try again in a few minutes.
The installer and Server Health now check that your theme files load
- At the end of the installation, TubePress checks that your theme's stylesheet really loads. If your server answers it with an error, which happens on aaPanel and other panels that disable PHP's symlink() function, it shows exactly what to add to your Nginx configuration.
- Settings → Maintenance → Server Health has a new Theme assets check that runs the same test at any time and gives the fix to apply when your site shows without styling.
- The command-line installer reports the same problem in its result.
Ads: automated browsers in disguise are not counted either
- Impressions, popunder opens and ad clicks from automated browsers are no longer counted when they hide the automation flag and pretend to be a normal Chrome, Safari or Firefox. The ads still show and still lead to the advertiser.
- Real visitors are counted exactly as before.
Ads: the push card never covers the video player
- On a watch page, the push ad card no longer lands on the video. On computers it uses the bottom corner the player leaves free; on phones held sideways and on tablets it waits until the visitor scrolls past the player, and it is only counted once it shows.
- If the player comes back behind it, the push card (like the sticky bar on phones held sideways) slides away and returns when the player moves on. While away, neither can be reached with the keyboard.
- Visitors who ask for less motion no longer see these ads slide.
Ads: the sticky bar never covers the video, the player fits a phone held sideways
- On phones held sideways, the sticky ad bar now steps aside while it would cover the video player, and comes back below it. The play, pause and full-screen buttons are never under an ad, and the bar is not counted while it is aside.
- The video player now fits the screen height on phones held sideways (and in short, wide windows), so the whole video and its controls are visible at once.
- The pause ad card no longer covers the player's control bar on small screens.
Ads: older banners hosted elsewhere get their size by themselves, automated browsers no longer counted
- Ads saved before 1.2.34 with an image hosted on another site no longer need to be opened and saved: the site reads their size by itself in the background after a page view, so their place is reserved and nothing jumps. If an image cannot be read, its zone says so and the site tries again every day.
- Browsers driven by automation tools (Selenium, Puppeteer, Playwright) no longer add impressions, popunder opens or clicks to your reports, even when they pretend to be a normal browser. Their clicks still lead to the advertiser.
- Turkish: the Skip button of video ads now says "Reklamı atla", the wording of Google's players.
Ads: right-to-left pages, the video-ad Skip button in every language, only real visitors counted
- Arabic, Hebrew and Persian pages now mirror the ad controls: close buttons on the left, the Ad label on the right, and the push card in the bottom-right corner on computers.
- A long push-card headline no longer runs under its close button, and on phones the push card is centred with equal margins.
- Visitors whose device asks for reduced motion get the push card without its slide-in animation.
- Before the player has loaded, the video already fills its frame: on phones the page no longer gets wider than the screen while the player loads.
- The Skip button of video ads (VAST) now speaks the language of the page, in all 30 languages.
- Search robots, link previews (WhatsApp, Slack…), scripts, headless browsers, page-speed tests and browser prefetches no longer add clicks, impressions or popunder opens to your ad reports. They are still sent on to the advertiser.
Ads: banner images hosted on another site keep their place while they load
- When you save an ad whose image is on another site, its size is now read and kept, so the page reserves its place before the image arrives: nothing jumps when it appears (Google counts such jumps in Core Web Vitals) and the close button no longer moves under the visitor's finger.
- Ads saved before this update show "Image size unknown: open and save it once" in their zone: opening and saving them is enough.
Ads: ad images keep their size while loading, player ads fit the player and never cover the play button
- Banner ads, the phone sticky bar and the player overlay have their final size before their image has loaded: the page no longer jumps and the close button no longer moves under the visitor's finger.
- The player overlay (image or HTML) now shows only while the video plays. On phones it covered part of the big play button, so a tap meant to start the video could open the ad; it also overlapped the pause ad. It is now counted only when it was really on screen.
- The pause ad and the player overlay always fit inside the player, whatever the shape of the image (a 300×600 half-page went out of the player, hiding the close button), in full screen and when the phone is turned as well. A wide banner used as pause ad is shown larger on phones.
- On phones, the sticky bar and the player overlay keep the proportions of any image, without empty bands, and never enlarge an image beyond its own size.
Ads: Age Gate respected, network code only where its ad shows, popunders on any tap on iPhones
- With the Age Gate plugin on, no ad shows over the gate, no popunder opens and nothing is counted until the visitor enters, even on slow pages.
- Ad-network code now runs only where its ad is on screen, so networks never count hidden ads: the interstitial loads its code once per visit and opens only if the network fills it, the pause card waits for the first pause, the player overlay loads once, and the sidebar, related column and hero squares wait until they are shown. Closed zones are not sent again during the visit.
- Ad-network code that runs after the page has loaded (interstitial, pause card, overlay, album pages loaded by infinite scroll) works as it does on page load: its load handlers run and document.write lands in place, without ever wiping the page.
- iPhones: the site-wide popunder now also opens on a tap on text or empty space, but not on a tap that only stops scrolling.
- Popunders stay at least 30 seconds apart from one page or tab to the next.
- A video shows one overlay at a time (VAST or HTML, picked by weight).
- Ad labels (Sponsored, Promoted, Advertisement, Close ad) are shown in the visitor's language; the sticky bar's label no longer covers the banner.
- Ads in album pages loaded by infinite scroll now run, are counted and stay closed once closed; closing an ad hides the other ads of that zone on the page.
- The player's overlay and pause ads stay under the site's header and windows, the push under its menus, and the overlay fits small phones.
- The interstitial works with the keyboard and screen readers, even after a click in the player, and closes when its ad is clicked.
- Ad images keep their shape and reserve their space while loading; ad styles load with the page.
- Video ads near the end of a video are credited to the right spot; Space and Enter pause and play like a click.
- New setting "Allow interactive video ads (VPAID)", off by default: such ads used to be skipped without a word.
- Ad clicks are counted only for real visitors (no robots, link checkers or paused spots) and kept out of search engines.
- Admin: addresses with spaces are saved correctly, ads.txt can hold 60 KB (with a warning if it has to be cut), in-feed cards made of ad-network code can have a headline, clearer notes for player popunder triggers and https warnings, and the alert bar no longer covers the last button.
Ads: player popunders open in every browser, video ads counted when they play, weights and house ads honoured
- "On pause" and "On play" player popunders now open in Firefox and Safari too (their popup blockers stopped them).
- Video ads: the player's warm-up clip is no longer counted, a post-roll is no longer counted as a mid-roll, and each mid-roll is credited to its own spot.
- Pause and play popunders and the pause card react only to the viewer, not to seeking, ad breaks or a double-click.
- Clicking an ad (banner, in-feed card, push, interstitial, video ad, Skip) no longer also opens the site-wide popunder.
- Several popunders, network codes or video ads for the same moment now take turns by weight; house ads only fill in.
- The interstitial and the push show once per visit even when several tabs open at once, and never in a background tab.
- Reports: popunder opens are counted apart and no longer inflate the CTR; days follow your site's timezone.
- Visitors whose browser blocks storage no longer get popunders, interstitials or pushes on every page.
- In full screen the pause ad and the player overlay now show; the overlay no longer hides the Skip button.
- Embedded videos: the first click is never lost to the popunder layer when no popunder can open.
- Behind Cloudflare, Docker or another proxy, rate limits and captcha checks use the visitor's own address.
- Translated pages show the header banner where it belongs; phones held sideways get the sticky banner; iPads in apps get desktop ads.
- Popunder preview never leaves the page; ad-network code with several scripts runs them in order.
- Saving warns about http:// ad addresses on https sites; hero squares say when no hero banner can show them.
Ads: popunder script always up to date, accurate video ad counts, country codes checked
- The popunder script is now delivered with every update (sites updated from the admin kept an old copy).
- Video ads in the player count an impression when they start playing, not when the page loads.
- "Unlimited" popunders are no longer capped per period; only the safety limit of 10 per visit remains.
- Country targeting checks the codes you enter: UK is saved as GB (the code for the United Kingdom) and codes that are not countries are reported.
- Closing the mobile sticky ad no longer leaves an empty band at the bottom of the page.
- /ads.txt answers "not found" until you add lines, instead of an empty file.
- Tablets now get the desktop ads, like iPads already did; Mobile means phones.
- Opening the link of a deleted ad now tells you it no longer exists.
Ads: player popunders, pause card, preview and saving fixes
- "Once per visit" now holds across tabs: the interstitial and push no longer show again, and a closed ad no longer comes back, when a visitor opens videos in new tabs; a popunder limited per browser session is limited across all its tabs.
- A player popunder set to open "On pause" now opens when the viewer pauses the video, not when a pre-roll ends or the video finishes; "On play" opens when the viewer starts or resumes, not when the video restarts by itself after an ad.
- The pause ad no longer flashes for a moment when a video ad hands over to the video.
- "Preview on your site" on the Player Popunder zone now opens one of your videos, and the preview explains why nothing would open when that is the case.
- If a save is refused (for example after signing in again in another tab, or when the form is larger than your server accepts), you now stay on the form with a message instead of losing your changes silently.
- Saving a mobile sticky ad no longer changes its device setting.
Ads: saving an ad keeps everything you did not change
- Saving an ad spot no longer resets settings that are not shown for its type (for example the click address of a VAST ad, or a popunder's settings), so switching a spot's type later finds its earlier settings intact.
Ads: no more empty ad places, overlays appear with their image
- An active ad spot whose code or image is missing no longer leaves its zone empty on part of your pages: the other ads of the zone, or your house ad, now fill the place.
- Full-screen (interstitial), push and pause ads now load their image before they appear, so visitors on slow connections no longer see an empty box first. A full-screen ad whose image cannot load is not shown at all.
- The two squares beside the homepage hero are only shown on wide screens: "Mobile only" is no longer offered there, and the zone page says so.
Help Center: advertising guides
- The Help button now has an Advertising section: setting up your first ad, which zone goes where, popunders and their preview, video player ads (VAST), targeting and scheduling, ad settings and ads.txt, reports, and what to check when an ad does not show. On the Ads page it suggests the guides for the tab you are on.
- The download queue guide explains the new Retry AI button.
Catalogue imports: clear AI errors and a Retry AI button
- When the AI service refuses an import's AI (for example when your credits run out), the import no longer retries for minutes: the video is imported right away with its original title, and the reason is shown.
- On the Downloads page, an import whose AI failed now shows "AI failed" with the reason, and a Retry AI button. "Retry failed AI" in the toolbar retries them all. The AI options were paid at import, so retrying costs nothing. The video keeps its address; only its title, description and translations are updated.
- Gallery imports whose AI failed were shown as "AI done". They are now marked as failed, and Retry AI redoes only the steps that failed.
- A rewritten description is no longer lost when an import resumes after a pause.
Ads: every switch, setting and zone checked
- Zone and ad-spot switches now always save what you see. If the change cannot be saved (expired session, lost connection), the switch goes back and tells you why. A spot switch could also flip the wrong way after a double click; fixed.
- Saving an ad spot no longer fails with a server error on long addresses or long country lists. Web addresses can be up to 2,048 characters, and a wrong address is refused with a message naming the field.
- After saving, and in the zone list, you are told when a spot cannot show or cannot count: no ad code, no web address, no image, an image without a click address (not clickable), a schedule that has ended or not started, countries chosen while the site is not behind Cloudflare, or "Mobile only" in a zone that is hidden on phones.
- Ticking a box on the Settings tab no longer sends you back to the first tab.
- Zone pages say when ads, the zone or popunders are switched off. Popunder zones have a "Preview on your site" button: it shows what would open, without opening anything or leaving the page.
- Full-screen (interstitial) and push ads always keep their close button, even when "Visitors can close ads" is off. Banner close buttons now sit on the banner itself.
- On phones, the push ad no longer covers the sticky bottom banner.
- An image ad without a click address is shown as a plain image: it no longer counts fake clicks or sends visitors to your homepage.
- The player popunder now also works on embedded videos (iframe players): the first click on the player opens it.
- Reports: the 7-day and 30-day totals covered one extra day; fixed.
- "Between related" now recommends its real size (600 × 340 in-feed card), and several zone descriptions were corrected.
- Visitors' browsers now load the latest popunder script after each update.
Homepage hero: no more empty ad box
- When a homepage hero spot had no usable creative (its code cleared, or an image spot without an image), an empty "Sponsored" box still showed at the top of the homepage, and empty squares beside the hero. Such spots are now skipped, as in every other ad zone. Ads that have a creative look exactly the same.
In-Page Push zone: ad-network tags now show up
- The In-Page Push zone only displayed TubePress's own push card (icon + headline). An HTML / JS code spot in it, such as ExoClick's In-Page Push tag, was skipped, so the network never received a single impression.
- Code spots in this zone now load your network's tag on every page, and the network decides when to show its notification. Image spots keep the built-in card, unchanged.
- The zone description in Advertising now explains both options.
Contact form, report and upload e-mails now reach you when Contact email is empty
- Settings → Contact → Transport says the Contact email receives contact-form messages, report alerts and test e-mails, and falls back to your admin account address when left empty. Only the test e-mail did that: with the field empty, contact-form messages, content-report alerts and member-upload notices were shown in the admin Inbox but never e-mailed.
- They now go to your Contact email when it is set, otherwise to your admin account address. Nothing changes when a Contact email is set, and an e-mail type switched off in Settings → Contact → Email types stays off.
Backup sources: let visitors switch between several players for the same video
- In the video form (Media tab), add up to 10 backup sources under the main one: other embed codes for the same video, each with an optional label.
- When a video has more than one source, a Sources bar appears under the player. Visitors switch instantly without reloading the page, and the source they leave stops playing. The /embed/ player has the same switch.
- Paste several embed codes at once and each one gets its own row. An embed code that can't be used is pointed out before you save.
- CSV and JSON imports accept a new Backup Sources column: one or more embed codes or player URLs, separated by | or a new line.
- Fix: embed codes whose address carries several parameters, such as ?id=12&start=30, now play with all of them. Videos saved before are repaired automatically.
Hide already-imported content in the catalogue, and AI translation into your site's main language
- Import → Catalogue has a new Hide imported switch, for videos and galleries: what you have already imported disappears from the results, and the totals, page numbers and Download all cover only what you can still import. Your choice is remembered.
- Already-imported content is now recognised across your whole library, however large, and galleries still waiting in the import queue count as imported.
- Catalogue AI translation now includes your site's main language when it isn't English: the translated title and description become the main ones, and the English version keeps the original text.
- English is no longer sent for translation or billed, since catalogue content is already in English.
Background tasks on LiteSpeed hosting, and catalogue downloads that resume
- On LiteSpeed servers, background tasks (catalogue downloads, video conversions, imports, the sitemap and update checks) now run after every page view, as they already did on PHP-FPM, instead of only while an admin page is open.
- A catalogue video download interrupted by the hosting, for example by a time limit on PHP processes, now continues where it stopped on the next attempt instead of starting again from zero, so large videos finish on hosts that stop long-running PHP processes.
- Settings → Maintenance → Server Health now recognises LiteSpeed in the Background tasks check.
Clear warning when the domain does not serve TubePress's public folder
- The installer now stops with clear instructions when your domain serves a copy or a renamed version of TubePress's public/ folder, a setup in which uploaded images and videos kept on your server cannot load.
- Sites already set up that way show the same warning at the top of the admin and in Settings → Maintenance → Server Health.
- In that setup the admin now keeps its styling and scripts.
Security and reliability update
- Moderator accounts can no longer open the areas reserved for administrators (ads, pages, languages, support, purchases and billing, theme SEO and appearance settings).
- Two-factor authentication can no longer be skipped by signing in to another account in the same browser.
- Changing a password now signs out your other sessions.
- Saving a video or a gallery no longer removes pornstars or channels listed beyond the first 1,000 names, and the picker now finds every name.
- Saving a deactivated user no longer re-activates the account; user forms explain duplicate names, emails and short passwords.
- Transcoding: an interrupted encode is no longer taken for a finished one, so the original upload is kept; failed jobs stop retrying after three rounds.
- Catalogue purchases are never sent twice after a network timeout.
- Comments: visitors now see whether their comment was published, is waiting for approval or was refused, and keep their text after an error.
- Watch pages show pornstar photos and channel logos; sort menus keep the page language; gallery category, tag, pornstar and channel counts stay up to date.
- Contact form messages are translated and the form keeps what the visitor typed after an error.
- Many smaller fixes: requests that caused server errors, sitemaps, search, tags page, secure video links, time zones, updates on a full disk, mail errors now logged.
Update Simply / Hentai Noir and CTR Ranking as well.
Admin video and album lists open at once on large libraries
- Admin → Videos and Admin → Albums open at once even with tens of thousands of pornstars or categories; the full filter lists fill in a moment after the page.
- Nothing else changes.
Related videos and galleries: exact and fast on large libraries
- Related galleries now load in a fraction of a second on large gallery libraries.
- On sites without CTR Ranking, related videos on large libraries are again exactly the best matches, as on smaller libraries, and still load in a fraction of a second.
- Nothing else changes.
Galleries stay fast on large libraries
- Gallery listings, gallery category, tag, pornstar and channel pages open in a fraction of a second on large gallery libraries, for every sort.
- The gallery results of the search page come back several times faster.
- Admin → Albums and the gallery categories, tags, pornstars and channels lists open quickly; on very large lists the video counts fill in a moment after the page.
- Admin → Albums: the category and pornstar filters now list gallery categories and gallery pornstars.
- Nothing changes in what is shown.
Watch pages no longer pause during the background recount
- Every 10 minutes TubePress recounts the videos of each category, pornstar, channel and tag. On large libraries that recount could make a watch page opened at the same moment wait a few seconds. It now runs without holding up any page.
- Admin → Categories, Tags, Pornstars and Channels: the "With videos" and "Without videos" filters open in a fraction of a second on large libraries.
- The sitemap of a large library is rebuilt several times faster.
- Nothing changes in what is shown.
Card display settings now apply on every page
- The video card settings (Appearance → Cards: left and right meta, title, duration, title lines) are now applied on every page. They were ignored on server-rendered pages, so cards always showed views and date.
- Views, likes or date hidden under Appearance → Watch are now hidden on cards too, as the Cards page already showed.
Faster administration on large video libraries
- The Tags, Pornstars, Channels and Categories lists open much faster: only the entries shown on the page have their videos counted.
- The Videos list opens much faster on large libraries, with the same order as before.
- The dashboard statistics load faster.
Faster search on large video libraries
- Search results open much faster on large libraries, especially for common words: the number of results and the page are now found without reading every matching video. Results are unchanged.
- Search suggestions while typing come back several times faster.
- The database backup taken automatically before a core update now works when the database uses a custom port or socket, and stays fast on very large databases when mysqldump is not available.
Faster pages on large video libraries
- The home page, category, tag, pornstar and channel pages and the Newest sort no longer slow down as the library grows.
- Watch pages open faster: on very large libraries, related videos are now found without reading every video that shares a category or tag.
- Every page no longer scans the whole library to find which video types are published.
- The admin dashboard lists the latest videos instantly.
- Together with CTR Ranking 3.1.2, category, pornstar and channel thumbnails stay fast when CTR Ranking is active.
Edit Video: a missing thumbnail can be replaced again
- On remote storage (FTP, S3, WebDAV), a video without a thumbnail opened Edit Video with an empty, collapsed Thumbnail box that could not be clicked, so no thumbnail could be uploaded. The box now shows "Click to upload" whenever the current thumbnail cannot be loaded.
Video conversion on your own server starts on its own
- Conversions on your own server no longer wait forever: on many sites the "Concurrent jobs" setting was stored as 0, which kept local encoding off even with Transcoding switched on. It now counts as 1 unless you use remote conversion servers, so queued videos start converting after this update.
- Settings → Transcoding → Servers shows the real state of This Server (jobs in progress, or Remote only) and offers 0 (remote only) as soon as a remote server is set up.
- Server Health has a new Background tasks line. Without PHP-FPM, conversions, imports, the sitemap and update checks only move forward while you browse the admin, and the line tells you when that is the case.
Clear storage test results, and Save anyway
- Settings → Storage: when the connection test fails, the panel now says why and how to fix it, for example a firewall that blocks FTP file transfers (passive mode) or an FTP account without write permission.
- You can now save an existing storage even when its test fails (Save anyway), for example to change its Media URL or turn it off while its server is down.
- FTP uploads that cannot reach the server now stop within seconds with a clear reason in the error log and the import history, instead of hanging for up to 5 minutes.
- The storage health check now warns you when an FTP storage accepts the login but blocks file transfers.
- FTP storages whose remote path is not / now create new video folders in the right place.
FFmpeg installed in your home folder is now detected
- TubePress now also looks for FFmpeg in ~/bin and ~/.local/bin, where it is usually installed on shared hosting.
- When you enter a custom FFmpeg path in Settings → Transcoding → Servers, FFprobe is picked up from the same folder, so jobs that read the video's details no longer fail.
- The FFmpeg path you enter is checked by running it: a wrong path is refused, and a valid one is accepted even on hosts that restrict PHP's file access (open_basedir).
Reliability update: restricted hosts, MariaDB, uploads and ads
- Hosts that disable PHP functions such as shell_exec, exec or proc_open no longer break Server Health, Settings → Transcoding or video processing: TubePress uses whichever method your server allows and tells you exactly what is blocked.
- FFmpeg and the PHP command line are now detected on hosts that use open_basedir (aaPanel, cPanel and similar), and Server Health checks match the real requirements (PHP 8.2+, MySQL 8.0+ or MariaDB 10.4+, sodium for updates).
- Catalogue downloads and the transcoding queue work again on MariaDB 10.4 and 10.5.
- When an image or file is refused (logo, favicon, thumbnails, ad banners, watermark, intro/outro, album images, video thumbnails), the admin now tells you why instead of showing "saved successfully".
- The automatic updates switch in Settings → Branding now shows its real state; saving that tab no longer turns automatic updates off.
- In-player Overlay ads work: VAST overlays play as banners over the video and HTML/JS overlay banners are displayed.
- The embed player lists every available quality with its real label and loads the player from your own site.
- Buying catalogue videos or galleries while every storage is full is refused before any credit is spent.
- Duplicate-comment and duplicate-report protection now works on albums.
- Long transfers to and from remote conversion servers are no longer cut after 10–30 minutes (download a fresh worker script from Settings → Transcoding → Servers).
- The in-admin Help Center was reviewed against the product: tab names, buttons and defaults are now accurate.
Theme updates work again on hardened hosts
- On servers whose PHP disables proc_open (common on aaPanel, cPanel and shared hosting), Review Changes for a theme update failed with HTTP 500, so themes could not be updated. The change preview no longer needs proc_open or the diff command.
- If a change preview still cannot be built, the panel now shows the reason instead of a bare HTTP 500.
- Core updates no longer stop at the pre-update database backup when exec() is disabled.
Help Center search and French wording polish
- Help Center search now ranks the article whose title matches your word first: searching "subscribe" opens Channel subscriptions before the RSS feed guide, and "pwa" finds both installable-app articles.
- French: the new subscription and member-upload texts use non-breaking spaces before « : », « ? » and « ! », so a colon or question mark never wraps alone onto the next line.
- To get the redesigned Subscribe button, channel page and upload screens, also update your theme in Admin → Updates (Simply 1.0.29 or Hentai Noir 1.0.16).
Channel subscriptions, member video uploads and an installable mobile app
- Channel subscriptions: signed-in visitors can subscribe to any channel from the channel page or right under the player. Their profile gets a Subscriptions tab with the channels they follow and a feed of their latest videos, with a "New" badge on everything published since their last visit and a reminder badge in the account menu. It is free for your members and on by default (Settings → Community). The Channels list now shows how many subscribers each channel has.
- Member video uploads (off by default): switch them on in Settings → Community and members get an Upload button and a guided upload page. Large files travel in small pieces and resume on their own after a dropped connection; members fill in the title, description, categories and tags while the file uploads, pick a thumbnail from their video, and confirm they hold the rights and that everyone shown is a consenting adult. They follow every video in My uploads.
- Review before publishing (on by default): new uploads wait in Videos → Member uploads, where you can preview them, approve, reject with a reason the member sees, or edit and publish in one go. Members are emailed when a video is approved or rejected; you get a Telegram alert if you use Telegram notifications and, if you want, an email. You also choose the maximum file size, a daily limit per member and the rules shown on the upload page.
- Every uploaded file is checked before it is accepted. With transcoding on, members can send MOV, MKV, AVI and other common formats, converted for the web automatically; without it, only browser-ready videos are accepted.
- Installable mobile app (off by default): in Settings → Mobile app, let visitors add your site to their home screen with your own name, icon and colours. It opens full screen, shows a clean "You're offline" page instead of a browser error, and can suggest the install with a discreet banner (with the two steps explained on iPhone). Your site must use HTTPS.
- Six new Help Center articles explain these features, and every new screen is translated into all 30 languages.
- To show these features, also update your theme in Admin → Updates (Simply 1.0.28 or Hentai Noir 1.0.15). Older themes keep working exactly as before; they just don't show the new features.
September 2026
Share previews use the right image address again
- When CTR Ranking picks the social share image (og:image) of your homepage and listing pages, it now points to the thumbnail on your media storage. On sites whose videos are on a remote storage (S3, FTP, WebDAV or a CDN), it pointed to your own domain instead, so social networks and messaging apps showed no image.
- Videos whose thumbnail is an external address now use that address as their share image instead of a broken link.
Manually uploaded videos keep their thumbnail on the front end
- Fixed: a video uploaded from the admin (single or Bulk Upload) only ever stored thumb.jpg, while every listing card requests thumb_small.jpg. On remote storage (S3 / FTP / WebDAV) the card cannot fall back to the full-size file, so thumbnails appeared in the admin but returned 404 on the site. Catalogue imports were unaffected, which is why only uploaded videos looked broken.
- The small thumbnail is now generated (320 px, GD, original bytes as a fallback where GD is absent) and stored next to the full-size one, on local and remote storage alike.
- Existing videos are repaired automatically: a background task rebuilds the missing file from the thumbnail already on your storage. No re-upload and no re-import.
The A-Z tag index now lists every letter in full, accents included
- Each letter of the tag index again shows up to 200 tags. Sites whose taxonomy exists for several video types were seeing only about a third of them, because the limit was counted before duplicate names were merged.
- Tags starting with an accented letter (É, Â, Ç, Ñ, Ø …) are now grouped under their own letter instead of the "#" section, and are no longer listed in both places.
- On some sites a single accented tag could push an entire letter section into "#"; those sections are back where they belong.
Storage: a brief network hiccup no longer aborts a large FTP upload
- Fixed: on FTP storage, uploading a finished rendition failed with "Failed to upload <file> to remote storage (FTP/S3 error)" whenever the storage server went quiet for more than 15 seconds mid-transfer. The job then restarted the whole encode and re-uploaded from the beginning, so large files could retry indefinitely.
- FTP transfers now tolerate up to 300 seconds of no progress, matching the S3 backend. Connecting still fails fast after 15 seconds, and storage checks and deletions are unchanged.
- Only affects the FTP storage backend; S3 and WebDAV already had this tolerance.
Videos now show the date they actually went live
- The publication date of a video is now set when its conversion finishes and it becomes available on your site, instead of when it was imported or uploaded — a video that took hours or days to convert is no longer backdated.
- A video that is still converting no longer carries a publication date at all, and it stays where you added it in the admin video list instead of dropping to the last page.
- A video that was already published keeps its original publication date when its file is re-encoded or re-downloaded.
Transcoding queue: one failing file no longer stops all encoding
- Fixed: a single video whose rendition failed to upload could freeze the entire transcoding queue. The conversion server stayed reserved for that video for the whole retry window (up to 4 hours), so no other video could start — even with the server completely idle. Importing a new file was the only way to resume.
- The reservation now only accounts for renditions that are actually ready to run, and reserves that many job slots instead of the whole server.
- Fixed: when a conversion server went into error, renditions produced from a source it had already encoded stayed stranded on that dead server instead of moving to a healthy one.
Fixes video renditions failing after a source re-encode on a remote conversion server
- When a video's source was re-encoded on a remote conversion server, later quality renditions could fail to download the source file and stayed stuck, reporting HTTP 404. Renditions of the same video that had already started were unaffected, so a video could end up with some qualities available and the rest permanently pending.
- Videos already stuck this way now recover automatically on their next retry — no need to re-upload anything.
- A conversion server that fails to upload a finished re-encode back to your storage no longer removes the original source file, so the job can be retried safely.
An in-feed ad spot with no creative no longer renders an empty Sponsored card
- Removing the ad code from a spot in an in-feed placement now genuinely removes the ad. Previously the spot still rendered a clickable, empty "Sponsored / Promoted" card with a blank thumbnail.
- Same fix applies to an image spot with no image selected, and to a VAST spot placed in an in-feed zone (VAST only plays inside the player).
- Affects the between-videos, related-videos, homepage, listing, category, performer, tag and gallery-listing placements.
- Ad spots that do have a code or image creative render exactly as before.
Fixes the Advertising on/off switches and Delete button
- Turning an ad zone or an ad spot off in Admin → Advertising now takes effect — previously the switch moved but the change was never saved, so the ad stayed active and kept being served.
- Deleting an ad spot now works — previously the confirmation appeared but the spot was never removed, with no error message shown.
- Root cause: the admin layout did not emit the CSRF meta tag that the Advertising scripts read, so those requests failed silently before being sent.
Bulk video upload
- New Videos → Bulk Upload page: drop any number of video files, edit the proposed titles, set the status, type, description, categories, tags, pornstars and channels for the whole batch, and start — each file becomes its own video, uploaded one after the other with per-file and overall progress, speed and time left.
- The duration and a poster thumbnail are read from each file in your browser before it is sent, so every video arrives with a thumbnail even when your server has no FFmpeg; transcoding is queued exactly as for a single upload.
- You can keep adding files while a batch runs, remove files before they are sent, cancel at any time (videos already created are kept) and retry any file that failed, with the server's reason shown on the row.
- The Help Center gained an “Upload many videos at once” guide, and the New Video page links to the bulk uploader.
VAST tags on the Pause Ad placement
- The Pause Ad placement now accepts a VAST tag URL next to HTML/JS code and image banners: pick “VAST Tag” when creating the spot and paste your ad network's in-video banner tag set to the On Pause trigger (for example an ExoClick In-Video Banner).
- The player requests the tag when the viewer pauses, shows the returned banner (non-linear creatives, ideally 300×250) centred over the paused video, and hides it as soon as playback resumes. Impressions are counted in Advertising only when the banner is actually shown.
- Saving any VAST spot without a valid http(s) tag URL now warns you instead of silently showing nothing.
Accurate description for the Secure URLs option
- The Storage form no longer says signed media links are tied to the visitor's IP address. They never have been, by design, because a forwarded IP can be spoofed.
- It now states that on a remote storage the signed link redirects to your storage domain, so hotlink protection there is what blocks a direct download.
Fixes the silent no-op core update introduced by 1.1.26
- 1.1.26 was packaged with config/app.php still declaring APP_VERSION 1.1.25. Because that file is replaced by every core update, applying 1.1.26 succeeded but left the install reporting 1.1.25.
- Admin -> Updates therefore kept showing the old version and kept re-offering the same update, with no error message and nothing recorded in the update log — the update appeared to do nothing.
- 1.1.27 restores the version constant. Installs on 1.1.25, and installs that already applied 1.1.26, both converge here. No database migration is required.
- No functional change: the catalogue ownership fix shipped in 1.1.26 is unaffected and remains in place.
Imported catalogue videos no longer reappear for sale after you clear the download queue
- Fixed: clearing the download queue in Import → Catalogue (Clear finished, delete entry, delete batch) made every already-imported video lose its IMPORTED badge and come back as available stock. Because the catalogue charges again for a video you already own, that housekeeping action could lead to paying twice for the same video.
- A video's imported state is now read from the video itself, the same way imported galleries have always worked, instead of only from the download queue rows.
- Self-healing: if your queue was already cleared, the IMPORTED badges come back as soon as you update — nothing to re-import and nothing to reconfigure.
- Purchases still in progress continue to count as imported, and deleting a video locally still puts it back on sale as before.
August 2026
The custom top-up amount can be paid again
- Typing your own amount in the top-up window and pressing Continue now opens the payment step. The button did nothing at all before, so only the four fixed credit packs could be bought.
Fixes the unstyled admin some sites saw after updating to 1.1.23
- If you updated to 1.1.23 and your admin panel lost all its styling, install this update — it restores it. Nothing else on your site was affected.
- Cause: 1.1.23 placed the new compiled stylesheet and scripts in a folder that the updater already running on your site does not install. The files were in the package but never reached your server, so the stylesheet returned 404.
- They now ship in a location every version of the updater has always installed, and which your web server serves directly. Verified end to end on a real install.
- All the 1.1.23 performance work is unchanged and still applies.
Admin panel: 4.5x faster to load, and no longer depends on any third-party CDN
- The admin stylesheet is now compiled and shipped with the release. It used to be generated inside your browser on every page load by the Tailwind Play CDN — a 407 KB compiler that re-ran on every DOM change. On the Import screen this cut DOMContentLoaded from 1250 ms to 277 ms and JavaScript CPU time from 251 ms to 14 ms, measured on the same machine.
- About 440 KB of admin JavaScript (Import, help panel, support bubble, marketplace) now loads from cacheable files instead of being inlined into every page, so your browser downloads and parses it once instead of on every navigation. The Import page's HTML dropped from 664 KB to 415 KB.
- Country flags are served from your own install — the admin no longer loads anything from a third-party CDN.
- Catalogue thumbnails are cached on your server. Opening the Import screen used to re-download every thumbnail through PHP on every visit.
- Admin background requests no longer hold the PHP session lock while they contact tubepress.io. One slow call used to block every other admin request behind it — most visibly, the admin froze while an import job was running.
- Catalogue pricing refreshes in the background instead of delaying the Import page.
- The video preview player is downloaded only when you open a preview.
- The updater now installs new admin asset folders, which previously only arrived with a fresh install.
Buy credits with any amount, and see the free credits you get
- The Top Up panel now shows what each pack really gives you: the credits you pay for, the credits offered on top, and the bonus percentage.
- You can now enter any amount instead of picking a pack. The free credits are applied automatically on the same scale as the packs, so an amount matching a pack's price gives you exactly what that pack gives.
- The credits are recalculated as you type, and the order summary tells you how many of them are free before you pay.
Missing ad zones restored on the Advertising page
- The Player, Homepage, Categories and Performers tabs in Admin → Advertising were empty on new installs because their ad zones were never created. They are now, so VAST pre-roll / mid-roll / post-roll, the pause ad and the player popunder can be set up again.
- The In-Player Ads zone now appears under the Player tab instead of Watch Page, and the Interstitial, In-Page Push, Before Comments, Between Related Videos and Top of Listings zones are back.
- Existing zones and ad spots are untouched by the update.
Long transcodes no longer restart from the beginning
- Large 2160p/4K jobs are now watched by their actual encoding progress instead of a fixed time limit, so a video that needs 3, 4 or 6 hours finishes instead of being reset to 0% and re-queued after about two hours.
- A job that has genuinely stopped responding is still recovered just as quickly, and remote conversion servers are covered by the same change.
- Intro/outro assembly and preview-timeline generation now report progress while they run, so long videos are no longer interrupted during those steps.
Help Center now covers the taxonomy indexing threshold
- The in-admin Help Center still described only the older whole-type noindex switches. Its "noindex thin pages", "Sitemap" and "Tags" articles now explain the per-page "Minimum items required to index a taxonomy page" setting introduced in 1.1.18 — what it does to the page and to the sitemap, that it reverts on its own once a page grows, and that the panel counts the effect live before you save. Searching the Help Center for "threshold", "minimum items" or "discovered not indexed" now finds it.
Hide taxonomy pages that have too little on them
- Admin → SEO → Indexing now carries a "Minimum items required to index a taxonomy page" setting. Under that number a category, tag, pornstar, channel or album-taxonomy page is still served normally to visitors and keeps every internal link, but it is marked noindex, follow and left out of your sitemap, so search engines spend their crawl budget on your videos and albums instead.
- A page becomes indexable again and returns to the sitemap on its own as soon as it reaches the number. Nothing is stored per page and nothing has to be switched back by hand.
- An option keeps any category, pornstar or channel carrying at least 50 characters of its own description indexable even under the number, because that text is content in its own right. It is read from your default language, so a page can never be indexable in one language and withheld in another. Tags have no description field and always follow the number.
- Before you save, the panel shows live from your own database how many pages each taxonomy type would hide.
- The setting ships switched off, so an install that updates and changes nothing renders and generates exactly what it did before.
- Also fixed: on an install whose theme does not provide the SEO page, the "Discourage search engines from indexing this site" box in Settings → Branding always displayed as unticked whatever the stored value was, so saving that page could silently make a hidden site visible to search engines again.
Multilingual SEO: non-canonical slug aliases now redirect
- In a non-default language, reaching an entity by its base (untranslated) slug returned 200 with a canonical pointing at the translated URL. That alias now returns 301 to the canonical translated URL, so the duplicate consolidates instead of competing.
- Applies to /video, /category, /tag, /pornstar, /channel, /album and the four album taxonomy routes; the query string (pagination, sort) is preserved.
- Matches the behaviour the /videos/... listing routes already had. The default language, pages with no translated slug, and /embed/ URLs are unchanged.
Multilingual SEO: consistent language-root URLs
- A language home page now emits the same slashless URL in its hreflang tags, og:url and language-switcher links as in its canonical (https://example.com/pl, not https://example.com/pl/). The self-referencing hreflang no longer contradicts the canonical.
- The sitemap advertises the same slashless language roots, so Search Console stops reporting them as alternates pointing to a different canonical.
- The default-language root keeps its bare slash (https://example.com/), and secondary video-type roots (/gay, /hentai) follow the same rule.
Public pages no longer fail with a database collation error
- On servers where the database connection collation differs from the character set default, the ad scheduling filter compared dates as text and the database refused the comparison (error 1267 Illegal mix of collations), which returned Something went wrong on every public page, even with no ad spots configured.
- Ad scheduling now compares real date and time values, so start and end windows behave exactly as before on every server.
Cost calculator now quotes your real credit rate
- The import cost calculator converted credits to dollars at a fixed rate and named a credit pack that is no longer offered. It now reads the live rate from your account, so its dollar estimate matches what you are charged and follows any price change automatically.
Dashboard Views Trend now keeps a real 30-day history
- Daily view totals are recorded as views are counted, so Today, Avg/day, Peak, 30d total and the 30-day chart no longer drop during the day.
- The view de-duplication log keeps its short retention, so the fix adds no meaningful database growth.
- The 30-day history builds forward from this update; days before it show no data.
Faster category, pornstar and channel thumbnails
- Listing pages no longer rank an entity's entire video library to pick its cover image, so the header menu, the home page and the category, pornstar and channel listings load far faster on large sites.
- The thumbnails chosen are unchanged - only the work needed to find them is.
GPU transcoding now completes on NVIDIA, AMD, Intel and Apple conversion workers
- The worker's GPU command dropped the output pixel format, so a source that was not already 8-bit 4:2:0 (10-bit HEVC, 4:2:2 footage) was handed to the GPU encoder in a format it cannot accept and the encode was refused.
- When a GPU encode was refused the worker retried on CPU, produced a valid file, then still reported the job as failed and discarded it. Those jobs now complete.
- The CPU retry now uses the quality settings configured for that format instead of a fixed fallback, so the fallback rendition matches the one you set up.
- The worker console and the job error message now carry FFmpeg's own reason when a GPU encode is refused.
- After updating, re-download transcode-worker.php from Settings > Transcoding > Servers and restart your worker: that script runs on your own conversion server, so a CMS update alone does not update it.
GPU encoding now works on transcode workers
- The transcode worker now correctly detects NVIDIA NVENC, AMD AMF, Intel QSV and Apple VideoToolbox instead of silently encoding everything on the CPU: the test clip it used to check the encoder was smaller than the minimum frame size NVENC accepts, so the check failed even on a perfectly working GPU.
- A working GPU is no longer rejected just because FFmpeg printed a harmless warning while that check ran.
- When an encoder genuinely is unavailable, the worker now prints FFmpeg's own reason for it instead of a bare "not functional".
- After updating, re-download transcode-worker.php from Settings → Transcoding → Servers and restart your worker so it picks up this fix.
Signed media links no longer break on S3 storage with a prefix
- When a storage uses an S3 prefix together with Secure URLs, video, album and thumbnail links were redirected to an address without that prefix and returned "not found"; signed links now point at the real file. Storages without a prefix, and local, FTP and WebDAV storages, are unchanged.
Credits come back when an AI translation fails
- AI Translate now returns the credits for anything a translation job was charged for but never delivered — a job that fails, that you stop, or that the AI service could not complete refunds what it did not produce, on its own.
- Translations you did receive are never refunded, each charge is refunded once and never more than it cost, and running Retry failed after a refund is charged again.
- The job summary now shows how much went back next to how much was used.
- Includes the 1.1.7 related-videos fix.
Related videos no longer scan the whole library
- The related-videos block on the watch page scored candidates by joining every published video and discarding the non-matching ones afterwards, so its cost grew with the size of the library and forced an on-disk temporary table on every view. Busy sites with large libraries could saturate MySQL from watch-page traffic alone.
- Scores now come from the category and tag indexes, and only the videos actually displayed are loaded. Measured on a 100,000-video library: 1,150 ms to 90 ms per watch page.
- The related-galleries block on album pages had the same defect and is fixed the same way.
- Ranking, ordering and the number of items shown are unchanged, and there is no database migration.
Catalogue imports no longer stall when the AI pass fails
- An import whose AI title or description step kept failing retried forever and never produced the video, leaving the job stuck between downloading and rewriting. The AI pass now stops after its retries, is marked Failed with the error kept on the job, and the video is imported with its original title.
- Fixed the built-in AI prompts used when the prompt service cannot be reached: they asked for plain text while the importer expected tagged output, so every attempt failed.
- Server Health: "Pseudo-cron (last run)" always reported Never, even on sites whose background tasks were running normally. It now reports the real last run.
Importing now keeps your original files by default
- The catalogue import panel opens on "Keep originals only": videos are imported as they are, with no conversion, no extra disk use and nothing queued for transcoding.
- "Stream smoothly" and "Shrink to save space" are unchanged and remain one click away.
- The "Recommended" badge has been removed, so the panel no longer pushes one outcome over the one it preselects.
Translated tags no longer appear twice on the same page
- When several tags translate to the same name in your language, that name is now shown once — on the video page, on album pages and in the Tags listing.
- Nothing is merged behind the scenes: every tag keeps its own id, its own localized address and its own videos, and each one is still reachable at its own URL.
- The tag kept on screen is the one with the most videos, so the link always points to the fullest page.
See real progress while a video uploads
- The New Video page now shows a live progress bar with the percentage, the uploaded size against the total, the current upload speed and the estimated time remaining.
- The upload reports the stage it has reached — Uploading, then Processing while the server saves the file, then Completed.
- An upload in progress can be cancelled, and the page warns you before you navigate away from one.
- A file larger than the server accepts is refused straight away, showing both sizes, instead of failing after a long upload.
Large catalogue videos now download without timing out
- Catalogue video downloads are no longer cut off after 10 minutes. A transfer is now only abandoned when it genuinely stalls, so large files can take as long as they need.
- An interrupted download resumes from the bytes already received instead of starting over, so a brief network problem no longer wastes the whole transfer.
- Videos previously marked as failed can be requeued with "Retry all failed" in the Download Queue after updating.
Sitemaps now follow every control on the SEO page
- Max URLs per file (SEO -> Sitemap) works again. In 1.0.99 the field had no effect; it is now applied as an extra cap on top of Google's own limits, so it can only make files smaller.
- The Categories / Tags / Pornstars / Channels / Albums index pages added in 1.0.99 now respect the matching checkboxes. Unchecking a type removes both its sitemap file and its index page; the home page follows the Pages checkbox.
- A content type set to noindex (SEO -> Indexing) is no longer listed in the sitemap. Submitting a page you have asked Google not to index is reported as an error in Search Console. The Categories/Tags/Pornstars/Channels index pages stay listed, because the noindex option only applies to the individual pages - Albums is the exception, where the option covers the index page too.
- Turning on "Discourage search engines" now also empties the sitemaps, not just robots.txt.
Themes (simply 1.0.25, hentai 1.0.12).
- SEO -> Robots showed an example robots.txt that was out of date: it still blocked /embed/ and paginated pages, which 1.0.99 deliberately stopped blocking. Copying it into the custom box would have silently re-blocked the embed player Google needs to crawl in order to index your videos. The example now always matches what your site actually serves. Themes are not updated by a core update - install these from Admin -> Themes to get the corrected example.
Sitemaps — rebuilt for search engines
- Sitemap files can no longer exceed Google's limits (50,000 URLs / 50 MB uncompressed). On a site with many tags and several languages enabled, the tag sitemap could grow past 50 MB and be rejected by Google in full; the generator now measures what it writes and splits automatically.
- Languages that have no translated slug for an item no longer produce broken URLs in the sitemap (previously these were emitted with an empty slug and also poisoned the hreflang links).
- Each sitemap file now reports its own accurate last-modified date instead of one shared date for the whole content type.
- New sitemap-hubs.xml: the Categories, Tags, Pornstars, Channels and Albums index pages, the video listing pages (New, Top rated, Most viewed, Most favorited) and the home page — in every enabled language. None of these were listed before.
- Video entries are now correct on installs using remote storage or a CDN: thumbnails and video file URLs were malformed or missing, which made those entries invalid for Google Video.
- robots.txt no longer blocks /embed/ — Google must be able to crawl the embed player to index a video. The player page itself stays noindex.
- robots.txt now also protects the login, register, profile, search and account pages in every language (only the default language was covered), and no longer blocks paginated pages.
- Sitemap files are no longer sent gzip-encoded to clients that did not ask for it.
- On large libraries, sitemap generation is now spread over several background runs instead of doing everything in one request.
Import → Catalogue — galleries.
- Galleries you have already imported are now moved to the END of the listing instead of filling the first pages, which is how the video catalogue already behaved. Nothing is hidden: the totals and page count stay exact and every gallery remains reachable.
No more empty pages in the catalogue browser
- Import → Catalogue no longer discards galleries and videos you have already imported after a page has loaded, so pages are never left empty or half full.
- Items already in your library stay visible, greyed out and marked IMPORTED, and cannot be selected by mistake.
- The result count and the number of pages now match exactly what the browser shows.
Large album sitemaps no longer exceed Google's 50 MB limit
- Album, category, tag, performer and channel sitemaps are now split into several files when they would grow past Google's size limit, and every part is listed in the sitemap index.
- The split now accounts for hreflang alternates, so multilingual sites no longer produce oversized sitemap files that Search Console rejects.
- Existing sitemap URLs keep working — an entity that still fits in a single file keeps its current filename.
TubePress 1.0.96
- Fix: admin panel showed a fatal "Call to undefined function shell_exec()" error on every page when the host's disable_functions restricted shell_exec (e.g. a PHP-FPM pool with disable_functions = exec,passthru,shell_exec,system). The admin's server-health widget now degrades gracefully instead of crashing, matching how it already handles a missing sys_getloadavg(). No functional change to background tasks: the heartbeat and task scheduler only ever require exec(), never shell_exec/passthru/system.
Transcoding Queue stays live while you watch it
- The queue counters, the active-jobs pill and the Queue tab badge now refresh on their own instead of staying frozen until you reload the page.
- Auto-refresh also starts when you open the Queue while it is empty, so newly queued videos appear without a manual refresh.
- Refresh failures are now reported in the browser console instead of being silently ignored.
Intro and outro clips no longer break the video timeline
- Videos with an intro or outro attached are now joined using the same frame rate, time base and audio settings as the video itself, so playback no longer stalls or buffers once the intro ends.
- The finished file is checked before it replaces the original: if its timeline or stream durations come out malformed, the original video is kept instead.
Gallery imports now start on their own on every host
- Fixes catalogue gallery purchases that stayed at pending forever, with no attempts and no error, on servers where a background worker process cannot be started. Galleries now use the same exec-less worker the video queue has, so the queue drains without any manual step, cron or heartbeat.
- The importer now checks that a worker really started instead of assuming it did, and falls back automatically when it did not.
- PHP command-line binaries installed by cPanel and CloudLinux are now detected, so servers using those layouts can start workers normally.
Slug field is saved, Load more works on every theme
- The Slug field on videos, categories, tags, pornstars, channels and albums is now saved exactly as you type it — and a page you simply re-save keeps its URL instead of silently changing it. Leave the field empty and it is still generated from the title, as before.
- Load more under the recommended videos now works on every theme, not only Simply.
- Pages no longer return a server error when a crawler adds a malformed parameter to the URL.
- AI translation jobs no longer stop with an internal error when they run in the background.
Galleries you already paid for are never charged again
- Fixes a defect where selecting a catalogue gallery whose import had not finished, or had failed, charged your credits a second time. The purchase check now recognises a gallery that is already paid for and waiting in the import queue, and retrying a failed gallery import costs nothing.
- Deleting an ad spot reported success even when the delete was rejected, for example after a session or security token had expired. The real result is now shown instead.
AI Translate now covers names, not only biographies and descriptions
Performers, album performers, channels and album channels gain a Name field: the name is written in the reader's own script (Arabic, Cyrillic, Chinese and so on) and returned unchanged for languages using the Latin alphabet. Translating a name also rebuilds that language's URL slug, and both are used on the site immediately. Text you have already translated is kept and is not billed again.
Catalogue downloads start again after updating to 1.0.88
- Fixes a regression in 1.0.88 where a purchased catalogue download could stay at pending with no attempts, no error and no worker running, on servers where the worker slot file could not be created. Downloads start normally again.
- If no download worker can be started at all, the queue now falls back to the exec-less workers instead of stalling.
- A worker slot whose recorded process id had been reused by an unrelated process no longer blocks the queue permanently.
July 2026
Multilingual video sitemaps and stuck catalogue downloads
- Video sitemaps now include hreflang alternate links and one entry per language when "Include hreflang alternates" is enabled, matching the categories, tags, performers, channels, albums and pages sitemaps.
- A catalogue download could stay in the queue forever, with no attempts and no error recorded, on servers where the site timezone and the database timezone differ. Downloads now retry on schedule, and any download already stuck is released when you update.
- Several catalogue workers could start for the same queue slot when downloads were triggered from more than one place at once. Only one worker now starts per slot.
The catalogue no longer lists what this site has already imported, for videos as well as galleries, instead of merely sorting them to the end of the page you were looking at. Whether you own something is decided by this site's own library, so several sites on one account stay independent, moving to another domain changes nothing, and deleting a video or an album puts it back on sale straight away.
Galleries you have already imported are now listed last in the catalogue, the way already-imported videos are, so the page opens on what is still available.
Purchasing galleries now confirms the same way purchasing videos does: a bar above the catalogue saying the imports are being processed, with a button through to the download queue, instead of a spinner on the modal button.
The Parallel setting on the Downloads page now applies to gallery imports as well as video downloads; choosing 2 or 3 previously changed nothing for galleries. The queue banner and result count no longer say videos when what is queued is galleries.
Fixes a gallery import starting a background process on every refresh of the Downloads page
Reviving an unfinished queue is left to the scheduled task that already does it.
Gallery imports are now rows of the same queue as video downloads, with the cover, title, live AI badge and the same Cancel, Retry, Edit and Remove buttons, and they are covered by the existing filters, search and counters. AI enhancement chosen at import time now runs on each gallery as soon as its images are in, instead of waiting for the whole batch to finish; on a large import that made it look as though the AI options were being ignored.
Gallery imports now appear in Import > Downloads, next to video downloads
Each gallery is a queue entry with its own status, retried up to three times and left visible with its error if it cannot succeed. An import interrupted by a restart resumes instead of being lost, and a queue with work left restarts its worker by itself. The panel adds Retry failed and Clear finished. Re-importing a gallery you already bought is never charged twice.
Gallery imports now run in the background
Importing a large selection used to download every image inside the request itself, which held a PHP worker for minutes, left the button stuck on Importing... and, with several attempts running, could exhaust the pool and take the site offline. The request now charges and hands the work to a background worker, reporting real progress. The 25-gallery per-request cap, which silently dropped the rest of a bigger selection, is gone. Clicking beside a modal no longer closes it; use its close button.
Feed Import keeps its speed as your library grows
- Importing got slower the more you had already imported: attaching each video to its tags and categories re-counted those tags and categories across the whole library, once per tag, for every row. A feed with 17 tags per video triggered around 21 full recounts per import.
- Counts are now adjusted by the change instead of recalculated. On a 400,000-video library with a 17-tag feed this took one row from 164 ms to 4.5 ms, and the cost no longer grows with the size of your library.
Updates only lists what you actually have installed
- Admin → Updates offered marketplace themes and plugins that were never installed on the site, and automatic updates would then install them without being asked. Only extensions present on your site are listed now.
- Updating an extension can no longer create one: an update for something you do not have is refused. Installing a theme or plugin from the marketplace still works exactly as before.
Select page and Download all now work on the gallery catalogue
- The bar above the catalogue results hid both of its buttons whenever you were browsing galleries, so bulk selection was only ever available for videos. Both work for galleries now.
- Select page takes the whole page and leaves out anything you have already imported.
- Download all appears once you narrow the galleries by source, category, performer, channel, tag or image count, and tells you how many it will take. As with videos it stays hidden on the unfiltered catalogue, so a single click can never buy everything.
AI translation no longer charges for work it discards, and the front end is far faster at scale
- A translation batch that could not finish inside one worker pass was charged in full, sent only in part, and then counted as done — the job moved on and never came back to those videos, which is how a run could report Completed with nothing failed while most translations were missing. A batch now keeps its place and resumes until it is genuinely finished.
- Resuming a batch can no longer be charged twice. The charge is now tied to the exact items it covers, and each job records what it has already paid for, so retrying, resuming or recovering from an interruption costs nothing extra.
- The credits shown against a job now match what was actually taken, and the translated counter counts videos rather than passes. A job reports Completed only when every item really is translated; anything that failed is counted as failed.
- Large libraries: the home page now issues 12 queries instead of 60, and pages that were dominated by counting videos no longer are. Measured on a one-million-video database with no caching: 498 ms down to 11 ms. Category and tag pages get the same treatment. Nothing is cached and no total is approximated on a normal-sized site.
Galleries you have already imported are marked in the catalogue
- A gallery you imported stayed in the catalogue looking like one you had never bought. It now appears greyed out with an IMPORTED badge, cannot be selected, and is skipped by Select all — the same treatment the video catalogue already gave imported videos.
- Your credits were never at risk: the import screen already dropped galleries whose album exists before charging, the import re-checked, and the database enforced it. The protection was there; the indication was not.
- Re-buying a gallery after deleting its album locally still works and is still charged, as intended.
Robustness pass over the 1.0.73 translation work
- The one-off repair that removes English written over your translations now claims its run atomically and works in batches. On a 29-language site it used to issue one statement per string per language — 1601 of them inside a single page view, with nothing stopping a second visitor starting the same work. The same repair is now 58 statements and finishes in well under a tenth of a second.
- A footer configuration in an unexpected shape can no longer take the front page down. Values are checked before use, so a partially written or hand-edited footer setting renders what it can instead of raising an error.
- Catalogue import: a sidebar section you collapse stays collapsed. It was springing back open every time a filter was cleared or a chip removed.
- Mobile menu: the language list can no longer run past the bottom of the drawer on a short screen — that area now scrolls.
Editing your translations no longer replaces them with English
- Admin → Languages → Edit translations showed the English text, not your translation, for every string that comes from your theme. Saving the page then stored that English over the translation for good — on a 29-language site that was 56 strings per language, including the whole Albums interface and headings such as TRENDING, WATCH IT AGAIN, More and Powered by. The editor now shows what your site shows, and saving an untouched form changes nothing.
- Installing this release repairs the entries that were already overwritten. Translations you deliberately customised are kept, including a string you chose to leave in English.
- Core updates now install the translation files. They have always been inside the update package but were never applied, so a translation fix or a newly translated string could only ever reach a brand-new install.
- Footer badges and column headings follow the site language again (18+ Only, Free Content, HD Videos, Navigation, Pages, About), and the per-language text saved for a footer logo description is now used. Your own wording is untouched.
- Catalogue import: every sidebar heading now shows how many values are behind it, and the galleries view opens on Categories instead of a column of empty headings.
Translate a single row or a single language, and site visibility moves next to the other indexing controls
- Every listing row — categories, tags, pornstars, channels (videos and albums), plus videos, albums and pages — now has a small language button beside Edit. It opens the same AI Translate window scoped to that one item, with the same language choice, field choice and price shown before anything is charged.
- On the page editor, each language tab has its own button: "Translate to FR" translates that language alone, and the default tab opens the full picker for that page.
- "Discourage search engines from indexing this site" now sits at the top of SEO → Indexing, above the per-page-type list, instead of on the Advanced tab. While it is on, the per-type list is dimmed and explains that the site-wide switch is what applies.
Search engine visibility stays reachable however old your theme is
- "Discourage search engines from indexing this site" moved to SEO → Advanced in 1.0.70, but themes are updated on your own schedule, so an install running an older theme could end up with the setting nowhere at all. Settings now shows it again automatically whenever your theme does not yet provide it, and hides it the moment the theme does.
- Saving Settings can no longer switch that setting back on or off behind your back.
AI Translate on every content section, per-language branding, and 404 pages that can no longer be indexed
- The "AI Translate" button is now on all eleven content sections — Categories, Tags, Pornstars and Channels (for videos and for albums), plus Videos, Albums and Pages. Pick your target languages one by one or all at once, choose which fields to translate, see the exact cost before you start, and run it in the background with pause, resume, stop and retry.
- You are now charged as the run goes, only for what actually gets translated: anything already translated is skipped free of charge, and stopping a run stops the billing. A run started with a short balance tells you how far it will get and pauses cleanly when it runs out.
- Pornstar and channel NAMES are never translated — only their biography or description. Proper names are left exactly as you wrote them.
- Your site name, site description and homepage title / meta description can now differ per language. Set the default in Settings, then translate them in Languages → Edit translations → Branding; anything you leave empty falls back to the default. The translated value is used in the page title, meta description, Open Graph, Twitter card and WebSite structured data.
- Pages that do not exist now return a real 404 together with "noindex, follow" and a matching X-Robots-Tag, so a missing URL can never be indexed. Sections you switch off answer 410 Gone with the same protection.
- "Discourage search engines from indexing this site" has moved to SEO → Advanced, next to the other indexing controls, and saving Settings no longer switches it back off.
AI translation for album categories and album tags
- Album Categories and Album Tags now offer the same AI translation as videos: "Translate All" in the page header, "Translate" on a selected batch, and the same price of 0.5 credits per item covering every language you have enabled.
- "Skip already translated" only spends credits on entities that are still missing a language, and "Auto-translate new ... as they are added" keeps newly created album categories and tags translated on their own.
- Album categories reuse the same shared translation dictionary as video categories, so a term you already translated on the video side costs you nothing on the album side.
- Album pornstars and album channels are deliberately not translated: those are proper names and are left exactly as you entered them.
Ads no longer stretch the page on phones
- Ad-network banners (728x90 leaderboards, hero billboards, in-feed cards, sidebar and sticky spots) are now scaled down to fit the screen, so the whole ad stays visible on mobile.
- An ad wider than the screen can no longer widen the page itself: ad slots keep your site's width on every device, and desktop banners still display at their full size.
New ad spots can be saved again in every ad zone
- Creating or editing an ad spot in any zone other than Popup/Popunder failed with a 500 error and saved nothing; it now saves normally.
- Popunder spots are unchanged: their URL/code mode, delay, frequency cap and time window keep working as before.
Storage upload errors now say how long the file took to send and how long the storage server then took to answer
When an upload fails, the message separates the two: how many seconds the file spent going out and at what speed, and how many seconds were then spent waiting for the storage server to reply. A slow connection and a slow storage server produce very different numbers there, and they need different fixes. If you report a storage problem, that one line is enough for us to tell them apart.
More reliable uploads to S3 storage, and error messages that actually say what happened
Large files are now uploaded in 8 MB pieces instead of 128 MB, matching what the AWS command line tool and the official S3 libraries do. Each piece is confirmed within seconds rather than holding a single connection open for minutes, which is far more forgiving of firewalls, proxies and busy storage servers.
A single upload that loses its connection is now retried up to three times before giving up. Previously only multi-part uploads retried, so one dropped connection could lose a preview or a rendition outright. Errors that will not change on a second attempt, such as a rejected key, still fail immediately instead of retrying pointlessly.
When an upload does fail, the message now tells you how much of the file actually left your server, out of how much, how long it took and at what speed. That single line usually identifies the cause on its own - whether the file was sent completely and the storage server then went quiet, or whether the connection was cut part way through. If you contact support about a storage problem, copying that one line is now enough.
Faster and more reliable deletion everywhere, not just for videos
Galleries now delete in batches like videos do. Measured on albums of 40 images each: about 600 albums per second, and remote storage is cleaned in one request per thousand files instead of one request per image - deleting 400 galleries went from 16,400 separate storage requests to 17.
Deleting a gallery used to leave its comments, reports, likes, view history and statistics behind for ever, because those rows were never removed. They are now cleaned up, which also stops those tables growing without bound.
Every bulk delete screen - tags, categories, pornstars, channels, their gallery equivalents, comments, pages and users - now deletes in batches instead of row by row, and reports what was really deleted. Previously the confirmation always showed the number you had selected, even if some or all of them had failed, and a large selection could silently stop half way through when the page ran out of time. If that happens now it tells you how many were left so you can finish the job.
Bulk video deletion is much faster and more reliable
Deleting videos in bulk was processing them one at a time, with dozens of database queries per video and, on remote storage, fourteen separate delete requests per video. Videos are now deleted in batches: measured on a 5,000-video library, bulk deletion went from about 13 videos per second to several hundred, and remote storage is cleaned in a single request per batch instead of one per file.
The batch size now tunes itself to your server. There is no setting to adjust: each batch is timed and the next one resized accordingly, so a small shared host takes smaller bites and a powerful server takes larger ones.
Reliability fixes in the same area: - A delete job could report "completed" when a batch had actually failed, leaving videos behind. - With two administrators deleting at once, one progress bar could advance the other's job. - A fast job could stop after its first batch. - Long jobs stopped after ten minutes until an admin page was reopened; they now continue on their own. - Deleted videos left rows behind for ever in the view log, the CTR statistics tables and the homepage pool. These are now cleaned up, which also keeps those tables from growing without bound.
Large file uploads to S3 storage
Files over 64 MB are now uploaded in parts instead of a single request. This removes the previous 5 GB per-file limit (a hard limit of the storage protocol, not a setting), and lets very large videos - up to several terabytes - be stored.
It also makes large uploads far more reliable: each part is confirmed as it goes, and if one part fails it is retried on its own instead of restarting the whole file. Upload speed is unchanged.
Fixes large video uploads to S3 and other remote storage
Large uploads could fail with "Operation too slow" even when the transfer was perfectly healthy. A storage endpoint sitting behind a buffering gateway (nginx and similar) stays silent between the last byte it receives and its reply, for as long as it needs to store the object - several minutes for a large video. The CMS treated that silence as a dead connection and gave up after two minutes. The stall check now only applies while data is still being sent, so the storage server is free to take the time it needs.
Small files were never affected, which is why the storage Test could pass while every video import failed.
Remote storage (S3) reliability and diagnostics
- Upload failures now report the storage server's own error - SignatureDoesNotMatch, NoSuchBucket, AccessDenied, a connection error and so on - in the import log, the storage health check and Settings -> Storage -> Test. Previously these all showed a generic "Failed to upload ... to storage server" or a bare HTTP code, which made a misconfigured storage very hard to diagnose. - Fixed: any file whose name, folder or storage prefix contained a space or a non-ASCII character was never uploaded to S3. Object paths are now percent-encoded in both the request URL and the SigV4 signature. This mainly affected album images and video assets, which keep their original filename. - Fixed: the storage prefix was applied when writing objects but ignored when building playback URLs, so on any storage with a prefix the upload succeeded and every file returned 404 on playback. - The Storage Test now also performs a 2 MB write through the real upload path and shows the request URL it used. A passing test can no longer hide a failing import, because the test and the import finally exercise the same code. - Fixed: the host/port signing fix shipped in 1.0.59 was not applied to the backup plugin, so backups to a storage endpoint with an explicit port kept failing. - Hardened: a missing or unreadable local file during an upload now fails cleanly instead of raising a fatal error.
S3 storage uploads fixed
- Imports no longer fail with "Failed to upload video.mp4 to storage server" when your S3-compatible endpoint URL includes a port (for example MinIO on :9000).
- Large video uploads to S3 are no longer cut off after 5 minutes and now run to completion as long as data keeps flowing.
- The storage Test button now validates these endpoints correctly, and failed S3 uploads are recorded in the PHP error log with the HTTP status for easier diagnosis.
Top up your credits with cryptocurrency
- The Top Up window now offers the payment methods your TubePress account actually has enabled, instead of stalling on an empty Payment step when card payment is unavailable.
- Choose from more than 50 coins and networks, with a search box and the exact amount to send — tax included — shown before you commit to anything.
- The payment step gives you a QR code, the deposit address and the amount with one-click copy, plus the memo or tag as a required field on the networks that need one.
- Your transfer is tracked live and the credits are added automatically once the network confirms, so you can close the window and come back later.
- Anything that goes wrong is now explained inside the window — coin unavailable, amount below that coin's minimum, service unreachable — instead of failing silently.
Import: clearer CPU heads-up before transcoding
- When importing from the catalogue, choosing "Stream smoothly" or "Shrink to save space" now warns you — inline in the option's summary — if no conversion server is set up, since encoding then runs on this server and uses most of its CPU.
- Links to Settings → Transcoding → Servers so you can offload encoding to a dedicated worker.
Import: clearer heads-up before transcoding
- When importing from the catalogue, choosing "Stream smoothly" or "Shrink to save space" now warns you if no conversion server is set up — encoding then runs on this server and uses most of its CPU while it works.
- The notice links to Settings → Transcoding → Servers so you can offload encoding to a dedicated worker.
Admin sidebar: support panel opens again and cleaner menu width
- The support button in the admin sidebar now opens your tickets again.
- The sidebar no longer shows an empty strip next to the menu, so its width matches the menu items.
Admin sidebar polish and internal cleanup
- The admin sidebar no longer becomes narrower the moment its menu grows long enough to scroll: the scrollbar space is now always reserved and the bar itself is a slim, dark-themed 6px.
- Internal source cleanup across the whole codebase — smaller download and update packages, no functional changes.
Much smoother pages on phones and low-end devices
- Video thumbnails no longer create a hidden video player for each card at page load. The hover preview player is now created the moment you first hover a card — previews look and behave exactly as before, while pages load lighter and use far less CPU, GPU and memory.
- Removed the per-card frosted-glass blur effects (duration badge, play icon) and scoped the blurred sticky header to desktop-class devices — long video grids now scroll smoothly on mobile.
- Bundles Simply theme 1.0.16, which carries these performance fixes.
Localized URLs now work in every language
- Fixed 404 errors on the category, tag and pornstar section pages in languages where the translated URL word is identical for singular and plural (Malay, Indonesian, Vietnamese, Czech, Hungarian, Italian).
- Fixed video pages, likes, comments and recommended-video loading returning 404 in Bulgarian, Indonesian, Italian, Malay, Russian, Serbian, Ukrainian and Vietnamese.
Per-language translation pricing and reliable multi-language imports
- Catalogue AI translations are now billed per target language: the import dialog shows the per-language price and the exact total for your enabled languages, for both titles and descriptions.
- You can now translate into up to 30 languages per import (video imports were previously capped at 8).
- Translations run in small batches of up to 5 languages per request, with automatic retries for any missing language — large language sets import reliably instead of failing as one giant request.
- Collected translations are saved as they arrive, so an interrupted import resumes without losing finished translations.
- The purchase summary now itemizes every AI option with live prices, including the description-translation line.
Installation now works on MySQL 8
- Fixed the setup wizard failing at the database step on MySQL 8 with a misleading "user privileges" error — three migrations used MariaDB-only SQL syntax that MySQL rejects.
- Existing sites on MySQL automatically repair the affected album features (comments, reports and taxonomy counters) when applying this update.
Help Center: album layout & sidebar guide
- The in-app Help Center now documents the new album listing options — default Grid/Masonry display, Pages/Infinite navigation and the show/hide sidebar filters — with a one-click link to Appearance > Layout. Search "masonry", "infinite" or "sidebar" to find it.
Album layout defaults (fresh installs)
- New Appearance > Layout > Albums options are pre-seeded on fresh installs: default album display (Grid/Masonry), default navigation (Pages/Infinite) and which sidebar filters show. Existing sites are unaffected and keep their current look.
Reliable bulk delete for videos
- Deleting videos — one by one, or in bulk from the Videos list — is now reliable. Before, removing a video that had any category, tag, performer or channel could silently do nothing.
- Bulk delete now runs straight from your browser with a clear progress bar, so it finishes dependably on every host (no background worker required).
Instant, parallel downloads + close/delete your tickets
- Imported videos now start downloading immediately and respect your chosen number of parallel downloads, even on brand-new sites with no visitors yet.
- You can now close a ticket (a reply reopens it) or permanently delete one, from a menu in the ticket header.
- Clicking the support chat icon when you have replies now always opens your most recently answered ticket.
Much faster catalogue browsing + smarter reply alerts
- The Import catalogue now loads and switches between Videos/Galleries and Straight/Gay/Hentai near-instantly: pages are cached and prefetched in the background, with a smooth loading skeleton.
- Unread support-reply alerts now stay visible until you actually open the reply — navigating between admin pages no longer clears them — and replies that were already waiting for you light up even on a fresh browser.
One-click support chat in the sidebar
- A blue chat button now sits right next to Help Center in the sidebar — one click opens your support tickets directly.
- When our team replies, that chat button pulses with an unread counter and clicking it opens the reply straight away; Help Center itself is back to being your documentation hub.
Support panel stays open + instant reply alerts
- Your open support ticket now stays on screen while you move between admin pages — only the X button closes it, and reply drafts are kept per ticket until you send them.
- When our support team answers you, the red Help Center button in the sidebar now pulses with an unread counter — one click opens the reply directly.
- Unread replies are also highlighted in the ticket list, and indicators refresh automatically while you work.
Polished default appearance for new installations
- New installations now start with a refined out-of-the-box look — colours, dark mode, layout, sorting, video cards, watch page, and the navigation menu (including Albums) — plus a default logo and favicon.
- Photo-album listings and cards now have sensible built-in defaults.
- The catalogue download queue now defaults to 3 parallel downloads.
Security and robustness hardening
- Hardened the built-in static-file fallback so it only ever serves files from your theme and template asset folders.
- The internal keep-alive ping now targets your configured Site URL instead of the incoming request Host header.
Reliability hardening: the CMS now transparently retries a database statement on a transient deadlock instead of showing an error page under heavy concurrent traffic, and a harmless update warning was silenced. Part of a full public-readiness QA pass (no security or logic issues found).
Licensing fix: the vendor's own domain (and its sub-domains) are recognised as first-party, so a self-hosted demo/showcase on the marketplace's own domain is never incorrectly warned that a paid plugin 'does not cover this domain'. No effect on normal customer installs.
June 2026
Albums feature toggle (Settings > General) to cleanly enable/disable galleries site-wide (SEO-safe 410 + removed from menu/search/sitemap when off); profile now shows your favorite & liked Albums via Videos|Albums sub-tabs; new Albums section in the Help Center; Server Health now checks file/folder permissions (and these are sent with support tickets); album categories/tags/pornstars/channels added to the sitemap; new strings translated into all languages.
Albums import parity & admin fixes: Upload File and Feed Import now create Albums (galleries) as well as videos, with a sample feed in Feed Import; fixed the album add/edit error; album category & channel lists show representative cover thumbnails; Data Purge now covers Albums and album taxonomy; removed the 8-language limit; update restore points now show each backup's version.
Watch page: performer chips now show the model's image (best-video thumbnail, CTR-ordered) instead of an initial; dashboard widgets resolve thumbnails correctly (storage_id for video widgets, best-video fallback for Top Performers) — no more 'No img'.
Album CTR support: AlbumAsset exposes image filenames + album archives render a CTR-aware fallback thumbnail (best gallery cover)
Pairs with CTR plugin 3.1.0 + Simply 1.0.11.
Albums become first-class in the admin: a Recent Albums + Top Albums dashboard widget; an independent ad surface (Gallery Page + Gallery Listings zones in /admin/ads); installed-theme thumbnails now render (screenshot.webp support); and every album-page string is translated into all 30 CMS languages. Comments & reports already cover albums.
Appearance admin: Layout gains an Albums tab (albums per page / per row / default sort incl
Most Images). Cards & Watch tabs renamed with nested Videos/Albums sub-tabs (transcode design): album card options (cover badge, title lines, hover, views) + single gallery-page display toggles (views/date/likes/favorites/pornstars/channels/categories/tags), lightbox download, and a related-galleries count. /albums + the gallery page now honor these settings.
Albums reach full parity with videos: report a gallery, like/dislike, and comments (guest + user, moderation, replies) — all in the same admin inboxes as videos. Gallery search on /albums. Mobile-optimized album browsing. Every album/gallery string is translatable in Admin > Languages. Builds on the catalogue gallery purchase + AI import wizard. Migrations 116-120.
Albums + Galleries release
Report a gallery exactly like videos (unified inbox). Catalogue galleries are purchasable with a 3-step import wizard — choose what to import (description/categories/tags/pornstars/channels/views) + optional AI rewrite/translate of title & description (background, #kimi). Albums added to the navigation menu (after Channels). Separate album taxonomy. Update mechanism now delivers bin/ + public/index.php and self-heals the DB schema on update. Migrations 116-119.
Albums now have their OWN separate taxonomy — dedicated Categories, Tags, Pornstars and Channels for albums, fully independent of your video taxonomy. Manage them under Admin > Albums (Categories / Tags / Pornstars / Channels), with front-end archive pages (/album-category, /album-tag, /album-pornstar, /album-channel) and configurable SEO patterns. Also bundles important reliability fixes: in-app updates now correctly run database migrations (a prior bug silently skipped them) and self-heal the schema on the next page load; new feature routes are delivered on update; the Studios-to-Channels rename is reconciled automatically; the ad-zone migration is idempotent. After updating, allow one page load for the database to finish applying.
Pair with Simply theme 1.0.5 (album archive templates).
Admin: the sidebar "Albums" entry is now a collapsible group with quick access to the shared taxonomy (Categories, Tags, Pornstars, Channels), mirroring the Videos group. (The Albums content type and the Studios-to-Channels schema fix shipped in 1.0.27.) Pair with Simply theme 1.0.4 to get the Albums front-end and the Admin > SEO album panels.
Albums — a new image-gallery content type
Admin: create and manage albums (multi-image upload, cover selection, per-language translations, bulk actions), with a new Albums entry in the sidebar, a dashboard card + quick action, and an Albums count column in the Categories / Tags / Pornstars / Channels lists.
Front-end (your active theme): an /albums listing and single-gallery pages with a responsive, count-adaptive photo grid, a built-in lightbox, favourites, copy-link, related galleries and previous/next navigation.
Albums reuse your existing categories, tags, pornstars and channels, are fully translatable (Admin > Languages) and SEO-configurable (Admin > SEO): title/description patterns, a noindex toggle, the XML sitemap and ImageGallery structured data. Site search now returns matching albums too. Designed to scale to large libraries.
Also includes an important schema fix: the Studios-to-Channels rename is now reconciled automatically on install and update, so fresh installs and upgrades correctly create the channels tables (resolves 'Table channels does not exist' 500 errors on the video editor and imports). The migration is idempotent and preserves all existing data.
Galleries dans l'Import : une bascule Vidéos/Galleries ouvre le catalogue d'images PornPics — source PornPics, catégories, recherche pornstars/chaînes/tags et filtre par nombre d'images, avec une visionneuse plein écran. Navigation seule (pas encore d'import). Technique : le template _import.php (287 Ko) a été découpé en partials plus petits (markup vs logique, catalogue vs uploads).
Command-line and automated installation
- TubePress can now be installed non-interactively from the command line with "php bin/install.php" — it provisions the database, admin account and settings in one step, so the CMS can be deployed by a script or an AI agent with no browser.
- The browser-based setup wizard is unchanged; both paths share the same install logic and produce an identical site.
Clear errors in the admin instead of a generic failure page
- When something fails while you're signed in to the admin, the panel now shows the exact error — what went wrong and where — with a reference you can copy, instead of a vague "something went wrong" page.
- Background and bulk actions (such as importing) report the underlying error too, so a failed import is never silent.
- Visitors to your public site still see a neutral page with no technical details exposed.
Performer, channel and category photos now show in the admin
- The Performers, Channels and Categories admin lists show each item's representative image again — it was blank on sites whose media lives on a remote CDN.
- When the CTR Ranking plugin is active, that image is the most engaging video's thumbnail; embed videos (no downloaded file) are supported too.
Smoother updates and a lighter support form
- Admin → Updates now makes clear that a single update installs the latest version directly and lists the combined release notes, so you never apply each version one by one.
- Contacting support is quicker: providing admin access is now optional and collapsed by default when you open a ticket.
Le prix des téléchargements vidéo et des opérations IA (rewrite, traduction) est désormais défini côté place de marché (Admin > Réglages > onglet Price) et non plus codé en dur dans le CMS. Le site importateur n'envoie que les opérations demandées : la place de marché les tarife (facturation autoritaire, le site ne peut plus se sous-facturer). L'UI d'import affiche les prix configurés en direct.
Correctif : la fausse alerte « ce domaine n'est pas couvert » déclenchée par un échec de vérification ponctuel (blip réseau/marketplace) est corrigée — il faut désormais 2 échecs consécutifs avant tout avertissement (les clones restent détectés et désactivés). Inclut l'UX de renouvellement des mises à jour expirées (CTA dans Admin > Mises à jour) et le nettoyage des commentaires décoratifs du code.
Clearer updates & licensing for paid add-ons
- Paid plugins and themes include one year of updates with every purchase, and your installed version always keeps working — even after that window ends.
- When your update window has ended, the Updates page now shows the new version with a one-tap "Renew to update" link instead of a confusing download error.
- Fewer false "licence problem" warnings (briefly-flaky network checks are now ignored).
Theme and admin assets now load on every web server out of the box
- The CMS now serves its own theme, admin and installer styling when the web server doesn't, so installs look correct on Apache, nginx or the PHP built-in server with no extra configuration — and existing sites get the fix on update.
- Local development now works over plain HTTP — run: php -S localhost:8000 -t public public/router.php and open http://localhost:8000 (no HTTPS required).
- Corrected the installer's theme/template symlink target and a fingerprint cookie that did not persist on plain-HTTP (localhost) installs.
Theme and admin assets now load on every web server out of the box
- The CMS now serves its own theme, admin and installer styling when the web server doesn't, so a fresh install looks correct on Apache, nginx or the PHP built-in server with no extra configuration.
- Local development now works over plain HTTP — run: php -S localhost:8000 -t public public/router.php and open http://localhost:8000 (no HTTPS required).
- Corrected the installer's theme/template symlink target and a fingerprint cookie that did not persist on plain-HTTP (localhost) installs.
Accurate, consistent disk usage across the admin
- The header storage gauge now measures the disk where TubePress is installed — its code, uploads and media — instead of the server's OS root partition, so it matches the figure shown on Settings → Storage and the dashboard.
- Local storage usage is now read live from the filesystem, so full-disk warnings and automatic storage rotation react immediately instead of waiting for the periodic health check.
More reliable updates with a paginated history
- The Updates page now verifies the version installed on your site before offering or applying anything, so an update you've already installed is never shown or applied again.
- Update History & Rollback is now paginated, keeping a long list of restore points easy to browse.
- Applying an update now starts with a single click — the extra confirmation prompt has been removed.
Cleaner Updates screen
- The Update History & Rollback panel now lists only your available backups, each with a one-click Rollback, instead of a long repetitive update log.
- Added spacing on the Updates page so the up-to-date notice and the history panel are no longer cramped together.
Fix update history not loading, and allow rolling back the CMS core
- The 'Update History & Rollback' panel in Admin → Updates now loads correctly instead of showing 'Failed to load history'.
- You can now roll back the CMS core to a previous backup directly from that panel, alongside plugins and themes.
Help Center: new guide for automatic updates
- A new "Automatic updates" article in the Help Center explains the Settings → General toggle: it auto-applies signed CMS core and free plugin updates, backs each one up and rolls back automatically if it fails, keeps themes and paid plugins manual, and is off by default.
- The guide is also surfaced as contextual help on the Updates page.
Installer now works on shared hosting and every PHP 8.2+ build
- Setup installs into a database your hosting panel pre-created even when the database user cannot create new databases (the usual cPanel/Plesk case), and shows a clear message if it genuinely cannot.
- The database host field now accepts a port or socket (e.g. db.host:3306), so managed and remote MySQL connect without extra steps.
- Creating the admin account no longer requires the Argon2 extension — it uses bcrypt automatically when Argon2 is missing, so installation succeeds on any PHP 8.2+ server.
- Setup detects HTTPS correctly behind Cloudflare and other reverse proxies, checks that PHP sessions are writable, and creates its writable folders automatically.
Le rapport de santé du serveur est joint automatiquement à chaque demande de support, pour un meilleur diagnostic
Removed a placeholder theme update from the Updates screen
- The Updates page no longer shows a sample "Simply" theme update that was not a real update.
Licence enforcement for paid plugins and themes
- Paid plugins and themes are now valid on a single domain, including all of its sub-domains.
- A site copied to another domain is detected and its paid items are disabled, with a notice shown in the admin.
Faster update detection
- The CMS now checks for updates every 90 seconds, so a new version appears in Admin → Updates almost immediately.
Clearer Updates entry in the admin sidebar
- Redesigned the sidebar Updates item as an aligned card with an icon, a subtitle and a count badge.
Scheduled automatic updates
- When enabled, automatic updates now apply once a day at 1 AM in your site's timezone, instead of throughout the day.
One-click automatic-update toggle
- Settings now has a switch to enable or disable auto-applying CMS core and free plugin updates (off by default).
- Updates are signed, backed up and auto-rolled-back on failure; themes always update manually.
Opt-in automatic updates
- Enable automatic updates in Settings to auto-apply signed CMS core and free plugin/theme updates.
- Every update is backed up first and rolled back automatically if it fails.
Live support chat updates in real time
- Incoming replies now appear instantly, without refreshing the page.
First public release of the TubePress CMS
A free, self-hosted CMS for adult tube sites on modern PHP 8.2+ and MySQL/MariaDB — no ionCube, no Composer, no Node. Includes: bulk CSV/JSON import, the licensed video Catalogue with one-click import, automatic CTR ranking, AI title/description rewriting and translation into 30+ languages, built-in SEO (XML sitemaps, JSON-LD, hreflang, canonicals), a full advertising server, age-gate, comments with spam protection, FFmpeg transcoding, themes and a WordPress-style plugin system, scheduled backups, and a 5-minute web installer.
Nothing matches .
Always up to date — always $0.
Download the latest TubePress, install in five minutes, and update in one click from your admin.