Skip to content
View in the app

A better way to browse. Learn more.

ernestdefoe.online

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
ernestdefoe.online

Extensions, themes & support for Flarum and Invision Community

Vibe coding for the community web. Report a bug, request a feature, or dig into the source — this is where the tools you use get built, in the open.

We do custom Bespoke Invision Community apps. If you have an idea for something you want then use the contact form to get in touch with us.
Knowledge base

Things that cost me a day, so they cost you none

Working notes from building Invision Community and Flarum applications. Mostly the failures that give no error at all — the ones where everything installs cleanly and quietly does the wrong thing.

92 articles

Invision Community 5

86 articles

Extensions and contracts

39

What each extension point is for, what it must declare, and what happens when it is wrong — which is usually nothing visible.

Languages and text

5

The string table, translation, and the places where text does not appear where you expected it to.

Theming, templates and forms

9

Theme hooks, CSS that survives both colour schemes, and building forms that do not throw on render.

Background work and scheduled tasks

5

The queue system, work that has to happen after the response, and jobs that finish without doing anything.

Data, settings and storage

11

The database layer, settings, tags, file storage, and backing up a live site.

AI features and expectations

5

What these features do, what they cost, and what buyers reasonably but wrongly assume they do.

Application structure and releases

11

The JSON files an application is made of, versioning and upgrade steps, and testing from the command line.

Realtime, chat and calls

1

WebSocket gateways, relays and the server-side pieces live features depend on — where "it works when I test it" and "it works for your members" are different claims.

Nothing matches that.

A stray "menutab_system" in your AdminCP: acpmenu.json tabs are not validated

You install an application and a tab appears in the AdminCP navigation called:

menutab_system

sitting between Community and Members, looking like a corrupted install. Nothing is logged, nothing errors, and the application otherwise works perfectly.

The cause

The tab value in data/acpmenu.json is never validated. Invision Community takes whatever you write, creates a tab for it, and looks up its display name from the language key menutab__<tab> — note the double underscore. If no such key exists anywhere, the AdminCP renders the raw key as the tab's name.

{
    "backup": {
        "archives": {
            "tab": "system",      <-- there is no "system" tab
            "controller": "archives",
            "restriction": "archives_manage"
        }
    }
}

The tabs that exist

Core defines these:

community   core   customization   members   stats   support   developer

The trap is that there is no system tab, even though "System" is exactly what the section is called in the AdminCP interface. That section is core. Anything to do with the running of the site — settings, logs, applications, backups — belongs on core.

Applications may create their own

Commerce uses nexus and Pages uses cms, and both are correct: they supply menutab__nexus and menutab__cms in their own language files. So the rule is not "use one of the seven core tabs" — it is:

The tab is valid if something, anywhere, defines menutab__<tab>.

If you want your own tab, define the key. If you do not, use an existing one. What you must not do is invent a name and define nothing, which is the case that produces the stray string.

Checking it

This is worth a static check, because it will never announce itself:

foreach ( glob( \IPS\ROOT_PATH . '/applications/*/data/acpmenu.json' ) as $file )
{
    foreach ( json_decode( file_get_contents( $file ), TRUE ) as $module => $items )
    {
        foreach ( $items as $key => $item )
        {
            if ( isset( $item['tab'] )
                 and !\IPS\Member::loggedIn()->language()->checkKeyExists( 'menutab__' . $item['tab'] ) )
            {
                // renders as its own raw key in the AdminCP
            }
        }
    }
}

Do not implement it as a whitelist of the core seven — that reports Commerce and Pages as broken when they are not. Ask whether the name resolves; that is the only thing that actually matters.

Why nothing catches this

The application installs cleanly. The menu entry is created and clicking it works. Every screen renders. The only symptom is a piece of text in the navigation, which is easy to skim past on your own site and immediately obvious to a customer.


User Feedback

Recommended Comments

There are no comments to display.

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.