Extension:IntegratedProfiles
Release status: beta |
|
|---|---|
| Implementation | API, MyWiki, Hook |
| Description | Implements modern and extensible user profiles. |
| Author(s) | Wolfite (The Obby Wiki) (Wlfttalk) |
| Latest version | 0.7.0 (2026-10-08) |
| MediaWiki | 1.45+ |
| PHP | 8.3+ |
|
integratedprofiles-manage, integratedprofiles-animated-avatar |
|
| Licence | GNU General Public License 3.0 or later |
| Download | GitHub:
Note: https://github.com/obbywiki/mediawiki-extensions-IntegratedProfiles/blob/main/README.md https://github.com/obbywiki/mediawiki-extensions-IntegratedProfiles/blob/main/CHANGELOG.md |
| Example | https://obby.wiki/User:ObbyWiki |
IntegratedProfiles is a MediaWiki (1.45+) extension that implements modern and customizable user profiles featuring custom avatars and banners, social links, taglines, and favorite article links. IntegratedProfiles is currently in beta, with many features being subject to change.
Features
[edit]- Customizable avatars
- Animated avatars (if configured, see below)
- Customizable banners (including custom images and 8 gradient presets or up to 8 image presets selected by admins)
- Built-in image cropping tools in avatar/banner upload modals
- Social links and custom website link (configurable)
- User group chips (e.g., Administrator)
- Edit count and join date (per wiki)
- Featured article (per wiki) and a highlighted location
- Taglines (short about text, with a configurable character limit)
- The ability to hide profile details from signed out users (only hides IP details)
- Social links can be previewed without being opened on mobile (when FloatingUI is installed)
- User cards/previews (opt-in)
- APIs for querying user avatars and profile details (also available in batches, up to 20-50 users at a time)
Installation
[edit]- Download the extension from GitHub and place the file(s) in a directory called
IntegratedProfilesin yourextensions/folder. - Add the following code at the bottom of your LocalSettings.php file:
wfLoadExtension( 'IntegratedProfiles' );
Done – Navigate to Special:Versionon your wiki to verify that the extension is successfully installed.
Requirements
[edit]- MediaWiki 1.45 or later (as of v0.4.0+)
- Only MW 1.45 and MW 1.46 have been tested. Earlier versions may work, but are not officially supported.
- PHP 8.3 or later
IntegratedProfiles works well on an initial setup, but you may want to read below in order to make it work as best as possible.
Setup
[edit]By default, avatars and banners are stored under {UploadDirectory}/ipavatars and {UploadDirectory}/ipbanners (usually $IP/images/...), as avatar_{id}.{ext} and banner_{id}.{ext}. Profile fields (prefixed with ip-) are stored in user_properties (preferences). IntegratedProfiles does not touch wikitext, contributions, or anything else.
The {id} in those filenames comes from CentralIdLookup, which is either the local user id or the central (gu_id) id when CentralAuth is installed.
See below for the ideal configurations for both a farm and a single wiki setup.
Mutual setup
[edit]This setup applies to every setup. If your wiki does not have FloatingUI installed, it is recommended that you install it:
wfLoadExtension( 'FloatingUI' ); # Provides tooltip feedback for certain UI actions (and also enhances mobile support, as users can tap a social link to preview it with a tooltip before opening it).
See Extension:FloatingUI for more information.
Single wiki
[edit]No extra configuration is needed. The default backend is enough:
wfLoadExtension( 'IntegratedProfiles' );
Ensure that $IP/images/avatars and $IP/images/banners are both writable. You can configure a custom FileBackend if you wish, however.
Wiki farm
[edit]You should follow this if your setup uses CentralAuth, regardless whether or not are a farm.
This is the ideal approach.
Requirements:
- CentralAuth (or another
CentralIdLookupprovider). Using shared user tables instead will (likely) not work. - Shared file storage.
- The GlobalPreferences extension.
Separate upload directories
[edit]Register one FileBackend that defines both containers with a constant domainId. Paths must resolve to the same storage from every wiki (NFS, a shared volume, or equivalent). Then set $wgIntegratedProfilesBackend to that name:
wfLoadExtension( 'CentralAuth' );
wfLoadExtension( 'GlobalPreferences' );
$wgGlobalPreferencesDB = '...';
wfLoadExtension( 'IntegratedProfiles' );
$wgFileBackends[] = [
'name' => 'ip-shared',
'class' => \Wikimedia\FileBackend\FSFileBackend::class,
'domainId' => 'ip-farm', // must be identical on every wiki
'lockManager' => 'nullLockManager',
'containerPaths' => [
'ipavatars' => $IP . '/images/ipavatars',
'ipbanners' => $IP . '/images/ipbanners',
],
'fileMode' => 0644,
];
$wgIntegratedProfilesBackend = 'ip-shared';
Shared $wgUploadDirectory
[edit]If every wiki already uses the same upload directory (one images/ volume), leave $wgIntegratedProfilesBackend empty. The default backend uses a stable domain id (integratedprofiles), so media is shared without a designated backend. You still need CentralAuth and GlobalPreferences:
wfLoadExtension( 'CentralAuth' );
wfLoadExtension( 'GlobalPreferences' );
$wgGlobalPreferencesDB = '...';
wfLoadExtension( 'IntegratedProfiles' );
Configurations
[edit]| Parameter | Default value | Description |
|---|---|---|
$wgIntegratedProfilesBackend
|
none | Configured entry in $wgFileBackends. Empty uses {UploadDirectory}/ipavatars and {UploadDirectory}/ipbanners. Must already exist if set. See Setup.
|
$wgIntegratedProfilesAboutMaxLength
|
80
|
Maximum length in characters for the about tagline. |
$wgIntegratedProfilesLinkMaxLength
|
255
|
Maximum length in characters for freeform profile link fields. |
$wgIntegratedProfilesEnabledSocialLinks
|
['website','twitter','github','discord','roblox','youtube']
|
Only accepts one of the presets. Determines which socials a user can add onto their profile. |
$wgIntegratedProfilesAvatarMaxBytes
|
2097152
|
Maximum avatar upload size in bytes (default 2 MiB). |
$wgIntegratedProfilesEnableAnimatedAvatars
|
true
|
When false, reject all animated avatar uploads regardless of user rights. Existing GIFs will still be displayed. |
$wgIntegratedProfilesBannerMaxBytes
|
4194304
|
Maximum banner upload size in bytes (default 4 MiB). |
$wgIntegratedProfilesLanguageInterwikis
|
[]
|
Language interwiki prefixes to automatically inject on user/user talk pages (e.g. ["en","ko","ja"]). Skips the wiki content language and $wgLocalInterwikis. |
$wgIntegratedProfilesEnabledSocialLinks
[edit]Use $wgIntegratedProfilesEnabledSocialLinks to customize the social links available to users. The platforms that are currently supported are listed below. All of them are included as defaults, but that may change, so specify them yourself (if you want them) to be safe.
- Website (a custom http/https URL)
- Twitter/X (username)
- GitHub (username)
- Discord (username)
- Roblox (username)
- YouTube (URL)
$wgIntegratedProfilesEnabledSocialLinks =[ 'website', 'twitter', 'github', 'discord', 'roblox', 'youtube' ];
Alternatively, set none to disable the feature:
$wgIntegratedProfilesEnabledSocialLinks = [];
You can request a platform by making an issue on GitHub.
$wgIntegratedProfilesLanguageInterwikis
[edit]Use $wgIntegratedProfilesLanguageInterwikis to have IntegratedProfiles automatically inject language links into the page. This is useful for language interwikis, as users can quickly hop between a user's profile on different language sites. Please ensure each language code set here is also registered in the interwiki table of each wiki (shown on Special:Interwiki).
$wgIntegratedProfilesLanguageInterwikis = [ 'en', 'ko', 'ja', 'zh' ];
By default, this feature is disabled. Users can still manually add languages.
Added rights
[edit]integratedprofiles-manage(granted tosysopby default): Grants the ability to edit other users' profiles. On a farm, you may want to limit this.integratedprofiles-animated-avatar(granted tosysopby default): Grants the ability for a user to upload an animated avatar.
Hooks
[edit]Developers can use hooks to register custom tabs within extensions, among other things.
- IntegratedProfilesAfterMasthead
- IntegratedProfilesAfterAvatar
- IntegratedProfilesGetTabs
- IntegratedProfilesRenderTab
API
[edit]Getting avatars
[edit]Action API
[edit]You can use the Action API to query user avatars from anywhere else for no more than 50 usernames.
action=query&list=integratedprofileavatar&ipauser=User1|User2|User3
Returns a list of { user, avatar_url, has_custom_avatar }. Unknown names are warned and omitted.
For extensions
[edit]if ( ExtensionRegistry::getInstance()->isLoaded( 'IntegratedProfiles' ) ) {
$avatars = MediaWikiServices::getInstance()
->get( 'IntegratedProfiles.AvatarService' );
$url = $avatars->get_avatar_url_for_user( $user );
// Or alternatively, for many users in a batch: $avatars->get_avatar_urls_for_users( $users );
// (recommended cap: 20)
}
- Beta status extensions
- API extensions
- Personalization extensions
- Hook extensions
- Extensions which add rights
- ArticleFromTitle extensions
- GetPreferences extensions
- BeforePageDisplay extensions
- OutputPageBodyAttributes extensions
- SaveUserOptions extensions
- DeleteAccount extensions
- LanguageLinks extensions
- SpecialContributionsBeforeMainOutput extensions
- GPL licensed extensions
- Extensions in GitHub version control
- All extensions
