General

Cannot upload files larger than X

Cause: You are most likely using a reverse proxy such as nginx or apache.
Resolution: Increase your reverse proxy configuration for file uploads.

SEO page rendering

Wiki.js is a Single-Page Application (SPA) which loads page contents lazily, on demand. While this is great for user experience, search engines may not render the page properly as a result.

To address this, unauthenticated requests (e.g. search engines, AI bots, etc.) receive a response with the page prerendered content.
This allows for content to be indexed correctly by search engines and bots, without the cost of server-side rendering.

Users with javascript disabled are also able to view the page contents, but without the application shell around it. This provides a fallback for such users.

Why are sub-folder installations not supported?

tl;dr: Because it's not worth the significant downsides.

Long answer: It introduces many problems:

For these reasons, there's no plan to support subfolder installations for the foreseeable future.
Use a subdomain. If you absolutely can't, then sorry, use something else.

Authentication

Reset admin password manually

The only way to change a password, without access to the administration web UI, is via the database. Use a tool like pgAdmin if you're not comfortable with shell commands.

Warning

It's NOT possible to read the current password value. Passwords are stored using a one-way bcrypt hashing process, which is not reversible. You can only overwrite it with a new value.

The code below replaces the config for the Local Authentication strategy (which has a static ID of 5a528c4c-0a82-4ad2-96a5-2b23811e6588) for the [email protected] user (replace with your email address in the code below).

The new config sets a new temporary password of recovery123 and enables the "Must Change Password" flag to force a new password on the next login.

Tip

You can also generate a different password hash using a bcrypt hash generator set to 12 rounds and set the mustChangePwd flag to false. However, it's recommended to use the predefined hash below instead to avoid logging your actual password hash into the shell history.

SQL Query

Using pgAdmin or psql, execute the following query against your wiki database:

UPDATE wiki.users
SET auth = jsonb_set(
  auth,
  '{5a528c4c-0a82-4ad2-96a5-2b23811e6588}',
  '{
    "password": "$2a$12$VzIQGsgG4wjUNSNBPRwif.bDsMwsyy1R3Sox9yfVL1V3fYTya3sMq",
    "tfaSecret": "",
    "tfaIsActive": false,
    "tfaRequired": false,
    "mustChangePwd": true,
    "restrictLogin": false
  }'::jsonb,
  true
)
WHERE email = '[email protected]';

Using docker

Assuming your database container is named db with a wiki user and database name:

docker exec -i db psql -U wiki -d wiki <<'EOF'
UPDATE wiki.users
SET auth = jsonb_set(
  auth,
  '{5a528c4c-0a82-4ad2-96a5-2b23811e6588}',
  '{
    "password": "$2a$12$VzIQGsgG4wjUNSNBPRwif.bDsMwsyy1R3Sox9yfVL1V3fYTya3sMq",
    "tfaSecret": "",
    "tfaIsActive": false,
    "tfaRequired": false,
    "mustChangePwd": true,
    "restrictLogin": false
  }'::jsonb,
  true
)
WHERE email = '[email protected]';
EOF

Development

Are devcontainers required for development?

No but it's highly recommended as it includes all the necessary dependencies. Many IDEs now support devcontainers so you're no longer limited to VS Code.

Was AI used to generate code during development?

Yes. Claude by Anthropic was used as a coding assistant. However, it was always used in a very directed manner for specific features. Every button, form element, API endpoint, DB schema fields, UX behavior, etc. is intentional and reasoned.

Nothing was "vibe-coded" or done using AI agents left on their own with instructions to follow a plan. This is a recipe for disaster and a great way to end up with insecure, buggy and unmaintainable software.

All documentation is written by a human.

Are Pull Requests with AI generated code accepted?

Yes BUT a human must have reviewed the entirety of the proposed code and is fully responsible for it.