04b — Installation in classic mode
Classic mode is TYPO3 without Composer: you download the TYPO3 source as an archive, unpack the extensions into a folder, and switch them on in the backend. No composer.json, no vendor/bin, no dependency resolution — and no command line needed for the parts that matter.
This is the path for hosting that gives you FTP and a database and nothing else. It works with TYPO3 v14, and both the theme and its dependencies are available as plain archives.
What you need
| PHP | 8.2 or newer, with pdo_mysql, gd, intl, zip |
| Database | MySQL 8 or MariaDB 10.6+, and a user who may create tables |
| Web server | Apache with .htaccess honoured, or nginx with TYPO3's configuration |
| Image processing | ImageMagick or GraphicsMagick command line tools — see 03b |
| Disk | about 300 MB for TYPO3, the extensions and the demo media |
The four archives
Everything is a download. Nothing is resolved for you, so collect these first:
| Archive | Where from | Size |
|---|---|---|
typo3_src-14.3.5.tar.gz | get.typo3.org | 29 MB |
bootstrap_package 16.0.0 | extensions.typo3.org → Download ZIP | 2 MB |
container 3.2.2 | extensions.typo3.org → Download ZIP | 115 KB |
yavi-lucerne.zip | licence.yavithemes.com → Konto → Downloads | 57 MB |
Both TER extensions declare support for TYPO3 v14 (bootstrap_package up to 14.4.99, container up to 14.99.99). Take the ZIP, not the T3X: T3X is an old packing format that only the extension manager can unpack.
1. Unpack TYPO3
tar xzf typo3_src-14.3.5.tar.gz
mv typo3_src-14.3.5 my-site
cd my-site
mkdir -p typo3conf/ext fileadmin typo3temp varThe source archive is self-contained — it brings its own vendor/ folder with every PHP library TYPO3 needs. That is the whole point of classic mode.
The document root is the project folder itself. There is no public/. Point the vhost at my-site/, not at a subfolder — this is the single biggest difference to a Composer installation, and it changes every path below.
2. Unpack the extensions
Four folders go into typo3conf/ext/:
typo3conf/ext/container/
typo3conf/ext/bootstrap_package/
typo3conf/ext/yavi-core/
typo3conf/ext/yavi-lucerne/The two Yavi folders come straight out of the portal ZIP, from yavi-lucerne/packages/. Do not rename them. Older documentation says the folder name has to be the extension key with underscores; since TYPO3 v14 (Breaking #108310) the key is read from extra.typo3/cms.extension-key in the extension's composer.json, and both packages carry it. A folder called yavi-core is recognised as the extension yavi_core, and the site renders byte for byte the same as with the underscore spelling.
Unpack each TER ZIP so that ext_emconf.php sits directly in the extension folder — not in a subfolder inside it.
3. Run the installer
Through the browser: open your domain, and TYPO3's setup takes over. It asks for the database connection, creates the tables and sets up an administrator.
On the command line the same thing is one call. Note the path to the binary — in classic mode it is inside typo3/sysext/, not in vendor/bin/:
php -d memory_limit=512M typo3/sysext/core/bin/typo3 setup \
--no-interaction \
--driver=mysqli \
--server-type=apache \
--host=127.0.0.1 --port=3306 \
--dbname=your_database --username=your_user --password=your_password \
--admin-username=admin --admin-user-password='choose-a-strong-one' \
--admin-email=you@example.com \
--project-name="My Site"--server-type=apache makes the installer write a 14 KB .htaccess into the project root. You want it: it carries the rewrite rules, the cache headers and the deny rules that keep typo3conf/ out of reach. Use other for nginx and take the server configuration from TYPO3's own documentation.
The result is typo3conf/system/settings.php — the classic-mode equivalent of config/system/settings.php.
memory_limit matters on the command line. With the usual 128 MB, cache:flush dies inside TcaSchemaFactory while building the schema. Raise it in php.ini or prefix each command as shown.4. Switch the extensions on
Open the backend at /typo3/, log in, and go to Admin Tools → Extensions. Activate in this order, because each depends on the one before it:
1. container
2. bootstrap_package
3. yavi_core
4. yavi_lucerneThat is all — the extension manager writes typo3conf/PackageStates.php and regenerates the class loading information in one step.
extension:list and extension:setup, but nothing that activates an extension; that command used to come from typo3_console, which is a Composer-mode tool. If you script the installation, use the same API the module uses — PackageManager::activatePackage() — and then run php typo3/sysext/core/bin/typo3 dumpautoload. Editing typo3conf/PackageStates.php by hand is not enough. The file only records which packages are active; the PSR-4 map lives separately in typo3conf/autoload/, and nothing in the bootstrap regenerates it. TYPO3 then aborts with `` Expected to find class "B13\Container\…\RecordContextMenuItemProvider" in file "…/typo3conf/ext/container/Classes/…" while importing services from resource "../Classes/*", but it was not found! ` even though the file and the class are exactly where the message says. The fix is dumpautoload`.Then perform the database migrations:
php -d memory_limit=512M typo3/sysext/core/bin/typo3 extension:setup
php -d memory_limit=512M typo3/sysext/core/bin/typo3 cache:flushextension:setup adds the theme's columns to tt_content and creates the eight item tables, and copies Initialisation/Files/ into fileadmin/yavi_lucerne/ (405 files, 24 MB). In the backend the same work is done by Admin Tools → Maintenance → Analyze Database Structure.
5. Decide on the demo content
5a. With the demo content
gunzip -c .tarballs/yavi-demo.sql.gz | mysql -u your_user -p your_databaseOr through phpMyAdmin, which every hoster provides — the file is 208 KB packed, well within any upload limit.
DROP TABLE IF EXISTS for every table, be_users included. That is intended: it ships without any accounts, and you create yours in step 7. It also means the import replaces the whole database.Then copy the media, because the demo's file records expect them directly below fileadmin/:
cp -R typo3conf/ext/yavi-lucerne/Initialisation/Files/. fileadmin/This is a flat copy — the result is fileadmin/dummy-media/…, not fileadmin/yavi-lucerne/dummy-media/…. The copy that extension:setup made into fileadmin/yavi_lucerne/ is a second, separate one and is not what the demo uses.
5b. Without the demo content
Skip the import. After step 6 you run one helper that creates a root page and brings in the theme's base structure — topbar, footer, and the pages the footer menu links to.
6. The site configuration
In classic mode site configurations live in typo3conf/sites/, not in config/sites/.
mkdir -p typo3conf/sites/mysite
cp -R typo3conf/ext/yavi-lucerne/Initialisation/Site/yavilucerne/. typo3conf/sites/mysite/That copies three files, and the theme needs all three:
| File | What it carries |
|---|---|
config.yaml | base, languages, and the dependencies — the Sets |
page.tsconfig | page TSconfig: backend layouts, the RTE preset, TCEFORM/TCEMAIN, and the content element definitions |
settings.yaml | the theme's settings, including the uids of the topbar, the sticky bar and the five footer columns, and the licence key |
TYPO3 reads page.tsconfig and settings.yaml out of the site folder by itself — there is nothing to include anywhere. If you create the site in the backend instead of copying the folder, you get a config.yaml and nothing else: the frontend then renders, which makes it look finished, while the backend is missing its layouts, its RTE configuration and the theme's content elements. Copy the other two files in by hand in that case.
Then edit typo3conf/sites/mysite/config.yaml:
base: 'https://example.com/'
# delete the whole baseVariants block
languages:
-
base: / # was %env(DDEV_BASE)%
-
base: /de/ # was %env(DDEV_BASE_DE)%The language base values are relative to the site base, so they stay / and /de/ whatever the domain is.
Without the demo, run the helper now — it needs the site configuration, because it writes into it:
php -d memory_limit=512M init-static-elements.php mysite
php -d memory_limit=512M typo3/sysext/core/bin/typo3 cache:flushCopy init-static-elements.php and .tarballs/ out of the portal ZIP into the project root first. The script detects the layout itself and works in both modes. It prints the uids it assigned. The cache flush is not optional: the helper writes settings after TypoScript has already been built, and the topbar and footer stay empty until the next flush.
With the demo, do not run the helper — the dump already carries those records, and settings.yaml already points at them.
Either way, check that the root page has a backend layout: Page properties → Appearance → Backend Layout (this page only) and (subpages of this page), both set to Yavi Core - Default. Without it the page has no columns to put content into and the frontend renders an empty frame, with nothing reporting a problem. The demo and the helper set it for you; a root page you created yourself does not have it. See 05 — Setting up the first site.
7. Create your backend user
Only after importing the demo. Step 3 created an account, but the dump in 5a drops be_users and ships without accounts of its own, so that account is gone.
php -d memory_limit=512M typo3/sysext/core/bin/typo3 backend:user:create \
--username=admin --password='choose-a-strong-one' \
--email=you@example.com --admin --no-interactionGive --no-interaction in its long form. Without it the command creates the user and then waits for an answer that never comes.
8. Web server configuration
Apache needs to honour the .htaccess TYPO3 wrote:
<Directory "/path/to/my-site">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>AllowOverride All is not optional, and a hand-written rewrite rule is not a substitute. The obvious one,
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]silently breaks the backend: /typo3/ is a real directory on disk, so the condition excludes it, the request never reaches index.php, and Apache answers 404 — while the frontend works perfectly and gives you no hint. TYPO3's own .htaccess handles the case correctly.
Writable by the web server user:
typo3conf/sites/<id>/settings.yaml the backend module saves here
typo3conf/system/ settings.php
typo3temp/ caches, compiled CSS, processed images
fileadmin/ uploads
var/9. Check
php -d memory_limit=512M typo3/sysext/core/bin/typo3 extension:list | grep -E 'yavi|bootstrap|container'Four lines, all active. Then open the site: with the demo you land on the finished standard site, without it on a page with the theme's frame around it. The backend is at /typo3/.
Continue with 05 — Setting up the first site for the licence key and the first content.
Every path that differs from Composer mode
| Composer mode | classic mode | |
|---|---|---|
| Document root | public/ | the project folder |
| CLI binary | vendor/bin/typo3 | typo3/sysext/core/bin/typo3 |
| Extensions | vendor/, symlinked from packages/ | typo3conf/ext/ |
| Settings | config/system/settings.php | typo3conf/system/settings.php |
| Site configurations | config/sites/ | typo3conf/sites/ |
| Caches and logs | var/ | typo3temp/var/ |
| Activating an extension | composer require | the extension manager, or PackageManager + dumpautoload |
| Which packages are active | the lock file | typo3conf/PackageStates.php |
Updating
- Back up the database and the project folder.
- TYPO3 itself: unpack the new source archive next to the old one, then move
typo3conf/,fileadmin/,typo3temp/andvar/over — or unpack over the installation and delete the oldtypo3/andvendor/folders first. - The framework: delete
typo3conf/ext/yavi-core, then unpack the new version. Do not unpack over the old one — files the new version removed would stay behind. Leavetypo3conf/ext/yavi-lucerneuntouched: the theme is yours, and an update must not overwrite your SCSS and templates. php typo3/sysext/core/bin/typo3 dumpautoloadphp typo3/sysext/core/bin/typo3 extension:setupphp typo3/sysext/core/bin/typo3 cache:flush
Step 4 is the one that is easy to forget and hard to diagnose: without it, new PHP classes are invisible and TYPO3 reports them as missing from files that obviously contain them.
What classic mode does not give you
| Limitation | Effect |
|---|---|
| No dependency resolution | A wrong bootstrap_package or container version fails at runtime, not at install time. Check the version constraints on the TER page yourself. |
| No autoloader regeneration | Every file change that adds a class needs dumpautoload. |
| Manual security updates | TYPO3 and both TER extensions have to be watched and replaced by hand. |