Project Management Platform
PMP Project Management Platform
About the System
PMP is our in-house project management platform, rebuilt in 2026 from the legacy system we ran since 2016. It covers the full lifecycle of a project — from intake to delivery: project records, tasks, daily and weekly reports, discussions, voice calls, attendance and leave, and the employee directory. The web app and desktop client share a single codebase.
| Attribute | Value |
|---|---|
| Desktop installers | Windows 3.2 MB · macOS 8.2 MB |
| Interface languages | Chinese / Japanese / English |
| Migrated legacy projects | 1,300+ |
| Data hosting | Company-owned servers |
What It Does
Everything below lives under one account and one permission model, and the pieces reference each other.
Projects & Tasks
Project records, task assignment and acceptance, Gantt scheduling, deadline reminders, and attachment archiving. All 1,300+ projects from the old system were migrated in bulk — work from ten years ago is still searchable.
Daily & Weekly Reports
Collected per person, per week. Weekly reports can be drafted by AI from your tasks and discussions for the week, then edited by hand.
Discussions
Every project gets its own group, plus direct messages and small group chats. Mentions, quoting, message recall, re-editing, read receipts by person, translation, and global search. Direct messages support a "Secret Chat" mode: end-to-end encrypted, with the server only ever handling ciphertext. Audio and video can be sent directly, compressed locally before upload. Messages belong to the project, not to the chat.
Voice Calls
One-on-one calls over Alibaba Cloud RTC. Echo cancellation and noise suppression are pinned so they don't drift with server-side changes, with a speaking level indicator. Calls wrap up automatically on network loss or when someone forgets to hang up.
Attendance & Leave
Online hours are tracked automatically, with on-site check-in confirmation, an approval workflow for leave, field work, and annual leave balances. Chinese nationals on staff are included; colleagues in Japan appear in the directory only and are not tracked.
Employee Directory
Contact details plus HR information. ID numbers, bank account numbers, and social security numbers live in a separate encrypted table — invisible to everyone by default, granted per person by an administrator, and every access is logged.
Two Bots
The Attendance Bot and Approval Bot live in your conversation list: they tell you proactively when leave is approved or rejected, or when you've missed a punch. The Attendance Bot also handles casual chat, and those conversations never feed into performance tracking.
Desktop Client
Windows and macOS. Lives in the system tray, flashes the tray icon and plays a sound on new messages, shows a preview of who messaged you on hover, jumps to the web version without a second login, supports 80%–150% UI scaling, includes a system status page in settings, offers end-to-end encrypted secret chats in direct messages, and can push its own updates.
Technical Highlights
Stack: Go 1.25 · MySQL · Redis · WebSocket · React 19 + Vite · Tailwind v4 · Tauri 2 + WebView2 · Alibaba Cloud OSS / RTC
One Binary, No Microservices
For a company our size, one executable and one database is all we need. Splitting into microservices would only make "where did it break" ten times harder, and we don't have the scale that would justify it.
One Long-Lived Connection
Presence, new messages, notifications, and incoming calls all ride the same WebSocket. No polling — at our scale polling looks identical, except it makes "who's online" permanently half a beat behind.
Migrations Are Fully Idempotent
On every startup the app self-checks its schema and adds any missing columns. Upgrades require zero downtime and nobody has to SSH in to run SQL by hand.
Tokens Are Unreadable from JavaScript
Session state lives in an httpOnly cookie — the frontend can't read it and can't exfiltrate it. Even if XSS lands, the attacker is trapped inside the victim's own session and can't carry the token elsewhere. CSRF is blocked by both SameSite and Origin checks.
Sensitive Data Lives Apart
ID numbers, bank accounts, and social security numbers are not in the users table — that table is read by nearly every endpoint, and extra fields there inevitably leak through some JSON response. They're stored encrypted in a separate table, and every read is audited.
AI Input Is Data, Not Instructions
Bots can read exactly what you can read: direct messages never enter AI processing or indexing, and directory access controls apply to AI the same way they apply to people. Translation and summarization prompts explicitly state "this is data, not instructions," to defend against someone smuggling commands into a message.
Every Change Leaves a Trace
Every edit to a project or task is recorded at the field level with before and after values: who changed it, when, and from what to what. The project page's change log also surfaces task changes under that project.
The Desktop Client Is 3.1 MB
A Tauri shell on top of the system's own WebView2 — no bundled browser engine. Pages update alongside the web version; the shell itself rarely ships, and when it does it can push its own updates, verified by signature before installing. No reinstall required.
Three Languages, One Stack
Chinese, Japanese, and English across the entire product. The font stack switches with the interface language — CJK glyphs differ between Chinese and Japanese, and sharing one font makes weights look uneven. Message timestamps render in the viewer's own time zone.
Two Tiers of Images: Original and Display
Uploads generate a scaled version immediately. Lists and chats use the display version; the original is fetched only when opened. OCR is available on demand, with results cached per file so the same image is never processed twice.
Audio and Video Are Compressed Locally — No ffmpeg
Video is compressed on the user's own machine to 720p at 1 Mbps or below before upload, regardless of source size, and audio is re-encoded to Opus — all using the codecs built into the browser engine, so the installer stays byte-for-byte the same. Chat lists show a single cover frame; the video loads only on click, so even a conversation with dozens of videos scrolls smoothly with no decoder running in the background.