← Wszystkie prace

OkenHub.
Jedno centrum sterowania dla portfela firm.

Wewnętrzne oprogramowanie, które prowadzi portfel niepowiązanych ze sobą małych firm z jednego miejsca: projekty, ludzi pracujących nad nimi, godziny, które ci ludzie rozliczają, oraz koszt utrzymania każdego przedsięwzięcia.

Rola
Jedyny inżynier
Wdrożenie
Produkcja push do main wdraża
Kod
13 589 linii Pythona · 38 modeli
Weryfikacja
55 automatycznych zestawów testów
Pulpit OkenHub w ciemnym motywie, z liczbą przedsięwzięć i zadań, godzinami w tym tygodniu, miesięcznymi kosztami, aktywnym celem i bieżącą aktywnością zespołu

Pulpit · przełącz motyw, a obraz zmieni się w miejscuFig. 01

Dane na wszystkich zrzutach ekranu są zestawem demonstracyjnym. Firma, pięć przedsięwzięć i pracujące nad nimi osoby zostały wymyślone na potrzeby tych zrzutów i żadne z nich nie jest prawdziwym klientem.

Przegląd01

OkenHub to wewnętrzne centrum sterowania Oken Solutions: jedna aplikacja webowa, która prowadzi kilkanaście niepowiązanych ze sobą przedsięwzięć naraz, od zadań, nad którymi ludzie pracują dzisiaj, po godziny, które rozliczają, i koszt utrzymania każdego z nich.

Wcześniej oznaczało to ClickUp do zarządzania projektami, arkusze kalkulacyjne na godziny i faktury oraz eksporty bankowe na finanse. Nic nie łączyło się z niczym, więc liczbę, która naprawdę miała znaczenie, czyli koszt na przedsięwzięcie, trzeba było za każdym razem składać ręcznie z czterech miejsc.

Aplikacja zastępuje tę część ClickUpa, która była faktycznie w codziennym użyciu i której rachunek rósł z każdym dodanym miejscem, a firma jest właścicielem zamiennika na własność. Wszystko w aplikacji jest przypisane do przedsięwzięcia, więc zestawienie, które kiedyś zajmowało pół dnia eksportów, jest teraz zapytaniem.

Decyzje, które podjąłem02
01

Wszystko opiera się na przedsięwzięciu

Przedsięwzięcie jest kręgosłupem schematu bazy. Każde zadanie, licznik czasu, transakcja i subskrypcja są przypisane do jednego z nich, a przedsięwzięcia grupują się w foldery, z których każdy ma własny kolor, walutę i tryb księgowania. To jedno ograniczenie zamienia koszt na przedsięwzięcie z ręcznej roboty w liczbę, którą baza danych już zna.

02

Kilka liczników naraz, rozliczone raz

Jedna osoba może mieć uruchomiony więcej niż jeden licznik, bo partia wydruków idzie bez nadzoru, kiedy ona zajmuje się czymś innym. Godziny rozliczalne to suma mnogościowa tych przedziałów na zegarze, a nie ich suma arytmetyczna, więc nakładająca się praca nigdy nie zostaje policzona dwa razy. Stawki są zapisywane w chwili rejestrowania czasu, co utrzymuje koszt dawnej pracy w miejscu po zmianie stawki, a licznik zostawiony przez pomyłkę zamyka się sam.

03

Dorównać narzędziu, które zastępuję, a nie zrobić jego uproszczoną wersję

Te części ClickUpa, które były w codziennym użyciu, zostały odtworzone, a nie przybliżone: widoki listy, tablicy i kalendarza, statusy definiowane przez użytkownika, które są zarazem kolumnami Kanbana, wiele osób przypisanych do zadania, podzadania, listy kontrolne, zależności między zadaniami, pola niestandardowe z szablonami wielokrotnego użytku, komentarze, zadania cykliczne, edycja zbiorcza i zapisane widoki, które podążają za osobą na kolejne urządzenie. Częściowa imitacja oznaczałaby utrzymywanie tej subskrypcji mimo wszystko.

04

Z każdą funkcją powstaje zestaw testów

Aplikację pokrywa 55 automatycznych zestawów testów dymnych, po jednym pisanym razem z każdą funkcją. To dlatego push do gałęzi main może wdrażać prosto na produkcję w projekcie tej wielkości, i tą samą drogą przeszło 56 migracji schematu bazy.

Zadania03

Jeden zestaw zadań, trzy sposoby patrzenia na niego.

Statusy definiuje użytkownik i są one zarazem kolumnami tablicy, więc przedsięwzięcie pracujące w etapach, których nie używa nic innego, może je mieć bez przenoszenia do osobnego narzędzia. Te same zadania pojawiają się jako lista, tablica albo kalendarz, filtrowane po przedsięwzięciu z drzewa po lewej.

Grupowanie, filtry i wybór kolumn zapisują się jako nazwane widoki, które podążają za osobą między urządzeniami. Status i priorytet można zmieniać bezpośrednio z listy, każdy wiersz ma własny licznik czasu, a pracę można zaznaczać zbiorczo albo przeciągać w inną kolejność.

Tablica Kanban w OkenHub, z kolumnami zdefiniowanymi przez użytkownika, tagami przedsięwzięć, priorytetami i wieloma osobami przypisanymi

Widok tablicy · kolumnami są statusy zdefiniowane przez użytkownikaFig. 02

Lista zadań w OkenHub, pogrupowana po statusie, z zapisanymi widokami, edycją w wierszu i licznikiem czasu przy każdym zadaniu

Widok listy · grupowanie, zapisane widoki i liczniki przy zadaniachFig. 03

Godziny i koszty04

Nakładający się czas, policzony raz.

Godziny filtruje się po zakresie dat, osobie i przedsięwzięciu, a sumują się zarówno na osobę, jak i na cały zespół. Liczba u dołu tabeli jest scalona, a nie zsumowana z wierszy, i to jest cały sens pozwalania komuś na dwa liczniki naraz.

Stawki należą do osoby i są zapisywane w chwili rejestrowania czasu, więc koszt historyczny nie zmienia się przy renegocjacji stawki. Zapomniany licznik zamyka się sam i zaznacza to w swoim wierszu, zamiast po cichu rozliczyć przespaną noc.

Tabela godzin w OkenHub, z sumami na osobę, adnotacją o automatycznie zatrzymanym liczniku i sumą rozliczalną ze scalonymi nakładkami

Godziny rozliczalne · suma u dołu ma scalone nakładkiFig. 04

Reszta aplikacji05

Przedsięwzięcia

Rejestr z folderami
Kolor, waluta i tryb
księgowania na przedsięwzięcie
Widoczność ustawiana osobno

Zespół

Obecność na żywo: kto jest online,
kto pracuje i nad czym
Role i dostęp do sekcji
Stawki zasilają zestawienie kosztów

Finanse

Zyski i straty, transakcje
Subskrypcje w wielu walutach
Alerty o odnowieniach
Miesięczne koszty na pulpicie

Cele

Cele z postępem
Tempo i wskaźnik realizacji
Zostało 32 dni, trzeba 1 dziennie

Sfera osobista

Planer dnia z blokami czasu
przeciąganymi myszą
Przypomnienia i cele własne
Coach, który sprawdza postępy

Asystent

Tworzy i aktualizuje zadania
Zapisuje postępy, ustawia
przypomnienia
Czatem, głosem lub Telegramem

Systemy zewnętrzne wpychają pracę przez API synchronizacji działające na kluczach. Na produkcji tak właśnie The Forge, oprogramowanie operacyjne firmy print-on-demand, przekazuje partie pracy osobom zdalnym oraz uruchamia i zatrzymuje ich liczniki czasu, więc godziny trafiają tutaj bez przepisywania ich przez kogokolwiek.

Synchronizacja kalendarza działa w drugą stronę i celowo pozostaje jednokierunkowa. Nie niesie żadnych pól finansowych, więc zewnętrzny agent może odczytać tydzień bez zakładania mu konta w Hubie.

Przeczytaj o The Forge ↗
Rejestr przedsięwzięć w OkenHub, z folderem, rodzajem, trybem księgowania, walutą i statusem każdego z nich

Rejestr przedsięwzięć · kręgosłup, do którego odnosi się resztaFig. 05

Interfejs06

Bez frameworka i bez kroku budowania.

Cały interfejs to szablony renderowane po stronie serwera i ręcznie napisany JavaScript, łącznie z tymi częściami, które zwykle usprawiedliwiają sięgnięcie po framework: przeciąganie kart na tablicy Kanban, aktualizująca się na bieżąco aktywność, edytor tekstu sformatowanego i planer dnia. Nie ma drzewa zależności do utrzymywania ani kroku budowania między zmianą a produkcją.

Arkusz stylów ma 1861 linii napisanych ręcznie i obsługuje oba motywy w 58 szablonach, między którymi przełącza się przycisk pod pierwszym zrzutem na tej stronie. Ten sam kod jest responsywny aż do telefonu i instaluje się jako aplikacja PWA, z powłoką dostępną offline i powiadomieniami push.

Na telefonie07

Ta sama aplikacja, zainstalowana na ekranie głównym.

Freelancerzy pracują stamtąd, gdzie akurat są, więc tablica, liczniki czasu i planer dnia musiały być na telefonie używalne, a nie tylko widoczne. To ten sam kod i ten sam serwer, ułożone pod ekran, na którym się znajdą.

Pulpit OkenHub na telefonie

Pulpit na telefonieFig. 06

Zbudowane z08

Framework

Flask
SQLAlchemy · Alembic
Szablony Jinja

Dane

PostgreSQL na produkcji
SQLite w developmencie
38 modeli · 56 migracji

Front end

HTML renderowany po stronie serwera
Czysty JavaScript
1861 linii ręcznie pisanego CSS

Wdrożenie

Docker na Railway
Push do main wdraża
55 zestawów testów dymnych

Zasięg

Instalowalna aplikacja PWA
Powiadomienia push
Asystent na Telegramie

Zbudowane samodzielnie od lipca 2026: 152 commity, 13 589 linii Pythona w 41 modułach i 58 szablonów. W codziennym użyciu produkcyjnym wewnątrz firmy, celowo trzymane bez powiązań z pozostałymi aplikacjami, tak by dało się je kiedyś wydzielić.