Nextcloud 35, marketed as Hub 26 Summer, is out since September 15. Most coverage is about Talk and the new office client. The more interesting changes are a layer below that.
occ commands without a base class
Custom occ commands used to mean extending a Symfony class. Now you write a plain class with an #[AsCommand] attribute and an __invoke() method, listed in info.xml:
#[AsCommand( name: 'myapp:greet', description: 'Print a greeting for a Nextcloud user.', )] class Greet { public function __construct( private IUserManager $userManager, ) { } public function __invoke( IOutput $output, #[Argument(description: 'The username of the user')] string $userId, #[Option(description: 'Print the greeting in uppercase')] bool $shout = false, ): ExitCode { $user = $this->userManager->get($userId); if ($user === null) { $output->writeln("<error>User \"$userId\" not found.</error>"); return ExitCode::Failure; } $greeting = 'Hello, ' . $user->getDisplayName() . '!'; $output->writeln($shout ? strtoupper($greeting) : $greeting); return ExitCode::Success; } }
The signature carries the meaning. A plain string is a required argument, a default value makes it optional, array or variadic makes it repeatable, bool $x = false is a flag and bool $x = true gives you --no-x for free. Put the attribute on methods instead of the class and several commands share one set of dependencies.
Typed query builder
IDBConnection::getTypedQueryBuilder() returns a query builder that knows which columns you selected, so the result is typed instead of mixed and static analysis stops guessing.
In the same area, Nextcloud now wraps the Doctrine DBAL migration classes in its own OCP\DB\Schema. The point is that future Doctrine upgrades no longer ripple into every app.
Database diagnostics in occ
Four new read-only commands, all with --json:
db:infofor engine version and config with health checksdb:sizefor tables by disk usagedb:index-usagefor indexes nobody reads, viaperformance_schemaon MySQL andpg_stat_user_indexeson PostgreSQLdb:locksfor blocking transactions and deadlocks
That replaces the snippet file most admins keep lying around.
If you prefer clicking: the serverinfo app got a Database tab under System, showing connections, transactions per second, latency and a set of checks on cache hit ratio, dead tuples, sequential scans and long-running queries.

Redis without the PHP extension
There is a new cache backend built on predis, a pure PHP client. No php-redis module needed, and it speaks current Redis and Valkey releases. Numbered databases in clusters are still missing.
FrankenPHP support also landed, worker mode included for OCS and WebDAV. Nextcloud explicitly does not recommend switching yet, because possible memory sharing between users on multi-user instances has not been ruled out. Test instance yes, production no.
Streaming AI output
TaskProcessing providers can now report text progressively instead of dropping the whole answer at the end. Providers implement ISynchronousOptionsAwareProvider, clients ask for it with a preferStreaming flag that the OCS API accepts too. That is why the Assistant types its answer out instead of keeping you waiting.
Post-migration repair steps got IRepairStepExpensive, a marker for long-running cleanups that are not needed for a working instance. They only run when an admin asks for them, so upgrades no longer stall on them.
What got removed
The frontend globals deprecated back in Nextcloud 17 are finally gone: moment, _, dav, Clipboard and the whole family around oc_requesttoken and oc_webroot. On the PHP side \OCP\Remote\*, IPreview::registerProvider and AutoCompleteEvent are gone, phpseclib is on 3.x and Symfony Console on 7. The floor moved to PHP 8.3, MariaDB 10.11 and MySQL 8.4.
And the visible half
Nextcloud Office is a shipped app now, with a desktop client for Windows, Linux and macOS. Talk got channels where only moderators post, and conversations marked as classified that disable public links and forwarding. Photos was rebuilt around a density-adjustable grid with map view and an EXIF editor.
Teams own their resources and get their own workspace. And the Assistant can read text from images.