Open-source self-hosted інструмент, який допомагає команді провести ретроспективу ефективно та не загубити важливу інформацію після її завершення.
Postup розгортається як єдиний бінарний файл без зовнішніх залежностей. Не потребує підписки, хмарного акаунта або Docker. Всі дані зберігаються локально.
- Що це і навіщо
- Функціонал для учасника
- Функціонал для адміна
- Інсталяція
- Скидання паролів
- Мережеві налаштування
- Про назву
Postup — інструмент для команд, яким важлива приватність даних і незалежність від зовнішніх сервісів. Ретроспективи проводяться на власній інфраструктурі: жодні дані не передаються третім сторонам і не зберігаються в хмарі.
Типовий сценарій використання:
- Організатор ретро запускає Postup на локальній машині
- Розсилає посилання для приєднання до ретроспективи учасникам у командний чат
- Команда проводить ретро в реальному часі: картки, голосування, таймер, action items
- Після завершення сервер зупиняється. Всі дані зберігаються локально у файлі
retro.db - За потреби результати ретро експортуються у Markdown або CSV для подальшого завантаження в Confluence, Google Sheets тощо
- Дошка в реальному часі — зміни миттєво відображаються у всіх учасників
- Картки — додавання, редагування та видалення власних карток
- Голосування — розподіл голосів між картками в межах встановленого ліміту
- Команди — створення команд, додавання учасників
- Користувачі — створення облікових записів
- Шаблони — налаштування колонок дошки
- Створення ретро — вибір команди, шаблону, дати, ліміту голосів, тривалості
- Посилання для приєднання — генерується автоматично
- Таймер — запуск, пауза, скидання прямо з дошки
- Action items — призначення відповідального і дедлайну для кожного пункту
- Створення action item з картки — будь-яку картку можна перетягнути до колонки Action Items
- Архів — перегляд завершених ретро, експорт у Markdown і CSV
- Порт — зміна порту сервера (вступає в дію після рестарту)
- Base URL — зовнішня адреса для посилань на приєднання; визначається автоматично або задається вручну, наприклад при використанні ngrok або у випадку подвійного NAT
На сторінці Releases доступні архіви для всіх платформ:
| Платформа | Файл |
|---|---|
| macOS Apple Silicon | postup-macos-arm64.zip |
| macOS Intel | postup-macos-amd64.zip |
| Windows | postup-windows-amd64.zip |
| Linux | postup-linux-amd64.zip |
Після розпакування архіву в папці postup/ знаходиться єдиний бінарний файл.
Запускати рекомендується з терміналу.
macOS / Linux:
./postup
Windows:
postup.exe
При першому запуску відкриється майстер ініціалізації:
Postup is not initialized.
Initialize now? [y/n]: y
Admin email: pm@company.com
First name (optional): Олексій
Last name (optional): Коваль
Password (min. 4 characters): ****
Confirm password: ****
Done! Starting server...
Після завершення ініціалізації сервер доступний за адресою http://localhost:8080.
Файл бази даних retro.db створюється автоматично в підпапці db/ поряд з бінарником. Зберігайте ці файли разом — retro.db містить всі дані.
Після завершення ініціалізації сервер запускається одразу без додаткових кроків.
Для скидання паролю адміна необхідно зупинити сервер і запустити з флагом --reset:
./postup --reset
Resetting admin password (pm@company.com)
Password (min. 4 characters): ****
Confirm password: ****
Password updated.
Після завершення сервер запускається звично.
Скидання паролю користувача виконується адміном через UI. В розділі Користувачі навпроти потрібного облікового запису необхідно натиснути кнопку скидання паролю — буде згенеровано посилання, яке потрібно передати користувачу.
Для підключення учасників з інших пристроїв сервер повинен бути доступний ззовні. Спосіб налаштування залежить від мережевої ситуації організатора ретро.
Підходить якщо провайдер надає білий IP — статичний або динамічний. Процес налаштування в обох випадках однаковий. При динамічному IP адреса може змінюватись, проте Postup в режимі "авто" визначає її автоматично при кожному запуску.
Кроки:
- Поточний зовнішній IP відображається в рядку стану адміна у верхній частині сторінки (Invite URL)
- В адмін-панелі роутера (зазвичай
192.168.1.1) знайдіть розділ Port Forwarding (може називатися Virtual Server, NAT, PAT) і додайте правило:- Зовнішній порт: порт з налаштувань Postup (за замовчуванням
8080). Рекомендований діапазон — від1024до65535; порти нижче1024зарезервовані системою і можуть вимагати прав адміністратора - Внутрішній IP: локальна адреса машини з Postup
- Внутрішній порт: порт з налаштувань Postup (за замовчуванням
8080) - Протокол: TCP
- Зовнішній порт: порт з налаштувань Postup (за замовчуванням
- Запустіть Postup. Посилання для приєднання міститиме правильний зовнішній IP.
Якщо після налаштування port forwarding учасники не можуть підключитися — можливо, провайдер використовує подвійний NAT.
Як перевірити:
- Відкрийте адмін-панель роутера і знайдіть WAN-адресу
- Відкрийте https://api.ipify.org
Якщо ці дві адреси різні — роутер сам знаходиться за NAT провайдера. Це подвійний NAT.
Що це означає: між вами і інтернетом є ще один NAT-пристрій на стороні провайдера, яким ви не керуєте. Port forwarding на вашому роутері в такому випадку не працює.
Що робити:
- Звернутися до провайдера з проханням надати білий статичний IP
- Використати ngrok (див. нижче)
ngrok — тунельний сервіс, який створює публічну URL що веде на локальний сервер. Працює за будь-яких мережевих умов, включно з подвійним NAT.
Встановлення та налаштування — згідно з офіційною документацією ngrok.
Запуск:
ngrok http 8080
Після запуску ngrok відобразить публічну URL. Її необхідно вказати в Postup: Settings → Base URL → вимкніть "авто" → вставте ngrok URL.
Обмеження безкоштовного плану: URL змінюється при кожному перезапуску ngrok. Для фіксованої URL потрібен платний план.
Cloudflare Tunnel — альтернатива ngrok без обмежень на кількість сесій. Встановлення та налаштування — згідно з офіційною документацією Cloudflare.
Важливо для користувачів в Україні: Cloudflare може бути недоступний через блокування на рівні провайдера або через те що провайдер сам використовує інфраструктуру Cloudflare, що створює конфлікт маршрутизації. Перед використанням рекомендується перевірити доступність cloudflare.com для всіх учасників команди. Якщо виникають проблеми — використовуйте ngrok.
«Поступ» — українське слово, що означає рух уперед, прогрес через спільні зусилля. В період війни воно набуло особливого звучання як символ незупинного руху вперед попри все.
Але слово має й інші відлуння:
- У баскетболі post up — зайняти позицію, тримати позицію
- В інтернет-культурі to post — опублікувати думку, зробити її видимою
- У повсякденній мові post up — розмістити, виставити на показ
Саме це і відбувається на ретроспективі — люди займають позиції, висловлюють думки, роблять проблеми видимими і рухаються вперед разом.
Поступ. Прогрес. Разом.
MIT
Open-source self-hosted tool that helps teams run retrospectives effectively and preserve important information after each session.
Postup is distributed as a single binary with no external dependencies. No subscription, cloud account, or Docker required. All data is stored locally.
- What it is and why
- Features for participants
- Features for admins
- Installation
- Password reset
- Network setup
- About the name
Postup is a tool for teams that value data privacy and independence from external services. Retrospectives are hosted on your own infrastructure — no data is sent to third parties or stored in the cloud.
Typical usage:
- The retro organizer starts Postup on their local machine
- Shares the join link with participants in the team chat
- The team runs the retro in real time: cards, voting, timer, action items
- After the session the server is shut down. All data is stored locally in
retro.db - If needed, retro results can be exported as Markdown or CSV for upload to Confluence, Google Sheets, etc.
- Real-time board — changes appear instantly for all participants
- Cards — add, edit, and delete your own cards
- Voting — distribute votes across cards within the set limit
- Teams — create teams, add members
- Users — create accounts
- Templates — configure board columns
- Create retro — choose team, template, date, vote limit, duration
- Join link — generated automatically
- Timer — start, pause, reset directly from the board
- Action items — assign owner and deadline for each item
- Create action item from card — any card can be dragged to the Action Items column
- Archive — view completed retros, export as Markdown or CSV
- Port — change server port (takes effect after restart)
- Base URL — external address for join links; resolved automatically or set manually, e.g. when using ngrok or in case of double NAT
Archives for all platforms are available on the Releases page:
| Platform | File |
|---|---|
| macOS Apple Silicon | postup-macos-arm64.zip |
| macOS Intel | postup-macos-amd64.zip |
| Windows | postup-windows-amd64.zip |
| Linux | postup-linux-amd64.zip |
After extracting the archive, the postup/ folder contains a single binary file.
Running from the terminal is recommended.
macOS / Linux:
./postup
Windows:
postup.exe
On the first run, an initialization wizard will open:
Postup is not initialized.
Initialize now? [y/n]: y
Admin email: pm@company.com
First name (optional): Alex
Last name (optional): Koval
Password (min. 4 characters): ****
Confirm password: ****
Done! Starting server...
After initialization, the server is available at http://localhost:8080.
The database file retro.db is created automatically in the db/ subdirectory next to the binary. Keep these files together — retro.db contains all data.
After initialization is complete, the server starts immediately with no additional steps.
To reset the admin password, stop the server and run with the --reset flag:
./postup --reset
Resetting admin password (pm@company.com)
Password (min. 4 characters): ****
Confirm password: ****
Password updated.
After completion, start the server normally.
User password reset is performed by the admin via the UI. In the Users section, click the reset button next to the relevant account — a link will be generated and should be sent to the user.
For participants on other devices to connect to the board, the server must be accessible from outside. The setup method depends on the organizer's network situation.
Works if the ISP provides a public IP — static or dynamic. The setup process is the same in both cases. With a dynamic IP, the address may change, but Postup in "auto" mode resolves it automatically on each startup.
Steps:
- The current external IP is displayed in the admin status bar at the top of the page (Invite URL)
- In the router admin panel (usually
192.168.1.1), find the Port Forwarding section (may also be called Virtual Server, NAT, or PAT) and add a rule:- External port: port from Postup settings (default
8080). Recommended range:1024to65535; ports below1024are reserved by the system and may require administrator privileges - Internal IP: local address of the machine running Postup
- Internal port: port from Postup settings (default
8080) - Protocol: TCP
- External port: port from Postup settings (default
- Start Postup. The join link will contain the correct external IP.
If participants still can't connect after setting up port forwarding, the ISP may be using double NAT.
How to check:
- Open the router admin panel and find the WAN address
- Open https://api.ipify.org
If these two addresses are different — the router itself is behind the ISP's NAT. This is double NAT.
What this means: there is another NAT device on the ISP's side that you don't control. Port forwarding on your router will not work in this case.
What to do:
- Contact your ISP and request a public static IP
- Use ngrok (see below)
ngrok is a tunneling service that creates a public URL routing to your local server. Works under any network conditions, including double NAT.
Installation and setup — follow the official ngrok documentation.
Run:
ngrok http 8080
After starting, ngrok will display a public URL. Set it in Postup: Settings → Base URL → disable "auto" → paste the ngrok URL.
Free plan limitation: the URL changes on every ngrok restart. A paid plan is required for a fixed URL.
Cloudflare Tunnel is an alternative to ngrok with no session limits. Installation and setup — follow the official Cloudflare documentation.
Note for users in Ukraine: Cloudflare may be inaccessible due to ISP-level blocking or because the ISP itself uses Cloudflare infrastructure, causing a routing conflict. Before using, verify that cloudflare.com is reachable for all team members. If issues arise — use ngrok instead.
"Postup" sounds like progress in Ukrainian — and it is. The word means moving forward, progress through collective effort. During the war it took on special resonance as a symbol of unstoppable movement forward despite everything.
But the word carries extra meaning in English too:
- In basketball: post up — to take a position, stand your ground
- In internet culture: to post — to publish your thoughts, make them visible
- In everyday use: post up — to put things up, to make them visible
All of which is exactly what happens in a retro — people take positions, post their thoughts, make issues visible, and move forward together.
Postup. Progress. Together.
MIT