Centre
Centre is your window position manager.
Take control of your windows by choosing where they appear, how they’re arranged, and what size they should be.
Consistency is centre's goal.
Preview
https://github.com/user-attachments/assets/d088a951-8c6b-4731-8228-80b063f1a6e5
What Centre Tries to Achieve
Centre was built for users who want consistent window placement across desktop sessions.
Requirements
- Windows
- Python 3.10 or newer
Install
pip install centre
Update
pip install -U centre
Start Centre Automatically
To do that, create a Windows Task Scheduler task.
Run the following command as Administrator in PowerShell/cmd to create a Task in Windows Task Scheduler.
schtasks /Create /TN "centre" /SC ONLOGON /TR "centre -s" /RL LIMITED /F
Usage
After your window configuration is ready, start the listener:
centre -s
Single-Instance Listener
Centre allows one centre --start listener per Windows login session. If a
listener is already running, another start attempt prints
Centre already running and exits.
The other CLI commands remain available while the listener is running.
Stopping Centre
When Centre is running interactively in a terminal, press Ctrl+C to stop it.
Centre will remove its keyboard hooks and stop its configuration observer
before exiting.
The CLI
The action flags are mutually exclusive, so use one action per invocation.
| Command | Description |
|---|---|
centre -s, --start |
Start the listener. |
centre -l, --list |
Print window titles, sizes, and positions as formatted JSON. |
centre -c, --read-config |
Print the loaded and validated configuration. |
centre -v, --version |
Print the installed Centre version. |
centre -h, --help |
Show the available CLI options. |
Automatic Configuration Reload
While Centre is running, it watches config.json for changes. Saving a valid
change reloads presets, ignored applications, logging settings, and action-sound
preferences without restarting the process.
Keyboard shortcuts are registered when the listener starts. Changing a shortcut
in bindings requires you to stop and restart Centre before the new shortcut is
used.
If config.json is invalid at startup, Centre reports the problem and exits
without starting the listener. If a saved configuration becomes invalid while
Centre is running, Centre performs an orderly shutdown. Correct config.json,
then run centre --start again.
Window Configuration (config.json)
Your config will be created at the first startup in:
CMD
%USERPROFILE%\.centre\config.json
PowerShell
$env:USERPROFILE\.centre\config.json
The default config includes these values:
- The resolution key is based on your display resolution.
{
"presets": {
"1920x1080": {}
},
"predefined_keybindings": {
"enabled": true,
"bindings": {
"center": "ctrl+alt+d",
"minimize": "ctrl+alt+m",
"capture": "ctrl+alt+p",
"ignore_preset": "ctrl+alt+i",
"center_all": "ctrl+alt+a"
}
},
"logging": false,
"ignored_presets": [],
"play_sound": {
"center": false,
"capture": false,
"ignore": false
}
}
Configuration Validation and Migration
Centre validates the complete configuration, including window presets, predefined keyboard shortcuts, and action-sound preferences. Unknown configuration fields, shortcut names, and preset properties are rejected.
When a valid configuration is missing fields that have defaults, Centre adds
those defaults and writes the migrated configuration back to config.json.
The listener requires predefined_keybindings.enabled to be true. If it is
false, centre --start exits instead of continuing without keyboard
shortcuts.
Logging
File logging is disabled by default. To enable it, set logging to true in
config.json:
{
"logging": true
}
When logging is enabled, Centre creates or appends to:
%USERPROFILE%\.centre\centre.log
While Centre is running, saving a valid configuration change applies the new
logging setting without requiring a restart. Changing logging to false
closes the file handler and stops new log entries from being written.
Log entries include a timestamp, severity level, and message:
[2026-07-27 12:34:56,789] INFO - Centering NOTEPAD
Centre logs window-management activity and errors. Entries may contain normalized executable names and captured preset details. The log file is append-only and is not automatically rotated or deleted.
Action Sounds
Action sounds are disabled by default. Enable only the confirmations you want
under play_sound in config.json:
{
"play_sound": {
"center": true,
"capture": true,
"ignore": true
}
}
The center setting applies to both the active-window Center action and Center
All. The capture and ignore settings control their corresponding actions.
Centre plays a sound only after an action succeeds; pressing Ignore for an
application that is already ignored does not play another confirmation.
Saving valid action-sound changes applies them immediately while the listener is running. No restart is required.
Window presets should be placed inside the "presets" object in config.json.
Capture a Window
Focus the window you want to capture and press ctrl+alt+p. Centre stores its
current position and size under the current display resolution.
Captured windows are identified by their executable name without the .exe
extension. The name is normalized to uppercase, for example:
notepad++.exebecomesNOTEPAD++WindowsTerminal.exebecomesWINDOWSTERMINAL
Executable names remain stable when an application changes its window title, such as when switching tabs in Notepad++.
Capturing the same application again updates its existing preset.
Ignore a Window Preset
Focus the window you want Centre to ignore and press ctrl+alt+i. Centre adds
the active application's executable name to ignored_presets.
Ignored applications are skipped when you press the center shortcut. Centre will
not apply the application's custom preset or Default_Position.
To allow Centre to manage the application again, remove its executable name from
ignored_presets in config.json.
Center All Configured Windows
Press ctrl+alt+a to apply presets to all currently open windows that have a
matching entry under the current display resolution.
Centre skips open windows that do not have a named preset or whose executable
appears in ignored_presets. Default_Position is only used by the regular
center shortcut for the active window.
A window preset should look like this:
{
"NOTEPAD++": {
"LEFT": 224,
"TOP": 168,
"SIZE_X": 1473,
"SIZE_Y": 697
},
"Default_Position": {
"LEFT": 25,
"TOP": 34,
"SIZE_X": 1860,
"SIZE_Y": 980
}
}
-
Be sure to add
Default_Positionin your presets under the generated default resolution. When Centre does not find the active window in your presets, it usesDefault_Positionas the fallback size and position. -
Default_Positionis useful when you have a list of apps that you have set a custom position for, but intend to keep all other apps in one specific location.
Default Shortcuts
| Action | Shortcut | Description |
|---|---|---|
| Center | ctrl+alt+d |
Apply the active application's preset or Default_Position. |
| Minimize | ctrl+alt+m |
Minimize the active window. |
| Capture | ctrl+alt+p |
Save or update the active application's position and size. |
| Ignore | ctrl+alt+i |
Add the active application to ignored_presets. |
| Center All | ctrl+alt+a |
Apply presets to all matching open windows. |
Your final config should look something like this:
{
"presets": {
"1920x1080": {
"WINDOWSTERMINAL": {
"LEFT": 224,
"TOP": 168,
"SIZE_X": 1473,
"SIZE_Y": 697
},
"Default_Position": {
"LEFT": 25,
"TOP": 34,
"SIZE_X": 1860,
"SIZE_Y": 980
}
}
},
"predefined_keybindings": {
"enabled": true,
"bindings": {
"center": "ctrl+alt+d",
"minimize": "ctrl+alt+m",
"capture": "ctrl+alt+p",
"ignore_preset": "ctrl+alt+i",
"center_all": "ctrl+alt+a"
}
},
"logging": false,
"ignored_presets": [
"NOTEPAD++"
],
"play_sound": {
"center": false,
"capture": false,
"ignore": false
}
}
Changelog
See CHANGELOG.md for release history.
License
This project is licensed under the MIT License. See LICENSE for details.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file centre-0.9.1.tar.gz.
File metadata
- Download URL: centre-0.9.1.tar.gz
- Upload date:
- Size: 58.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
779801c271da7ce5d81f2bd82e8420dbd38b9a3cf671cb304076d719e8c3387f
|
|
| MD5 |
b0d2b8979d1019c5f8e5b7ac9acf3ed7
|
|
| BLAKE2b-256 |
51881d15cbef664dbe628b90c6dc9b4d275f5477621d1e13ae4b4eba2ecc7c42
|
File details
Details for the file centre-0.9.1-py3-none-any.whl.
File metadata
- Download URL: centre-0.9.1-py3-none-any.whl
- Upload date:
- Size: 60.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f29bbc3a246d9a539f77f764b9ffea3228440e7bfd3925fa74f40d24ba783e8d
|
|
| MD5 |
ab21bcd95360507a5f7a601950ec722e
|
|
| BLAKE2b-256 |
ab6f2fc2c6ade6945333582f07dda95632523c128a784ea65e721d149dd38dae
|