Jump to content

Extension:IntegratedProfiles

From mediawiki.org
MediaWiki extensions manual
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
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 IntegratedProfiles in your extensions/ folder.
  • Add the following code at the bottom of your LocalSettings.php file:
    wfLoadExtension( 'IntegratedProfiles' );
    
  • Yes Done – Navigate to Special:Version on 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 CentralIdLookup provider). 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.
[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 to sysop by default): Grants the ability to edit other users' profiles. On a farm, you may want to limit this.
  • integratedprofiles-animated-avatar (granted to sysop by 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.

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)
}