Stop Scattering Your Life Across 15 Clouds: Personal Management System Exposed
Your passwords are on a sticky note. Your contacts live in three different phones. Your travel dreams are buried in a forgotten Pinterest board. And somewhere in the cloud abyss, a spreadsheet tracks who owes you money.
Sound painfully familiar?
Here's the dirty secret Big Tech doesn't want you to realize: they've trained us to fragment our own lives. One service for notes, another for passwords, yet another for files, photos, schedules, goals, achievements. Each platform demands your data, your attention, your subscription dollars. Meanwhile, you lose track of your own existence.
What if one system could replace them all? What if it lived on your hardware, behind your firewall, with zero internet dependency?
Enter Personal Management System — the open-source backend that top privacy-conscious developers are quietly deploying on Raspberry Pi terminals running 24/7 in their home networks. No cloud lock-in. No data mining. No monthly fees. Just your data, your way, completely under your control.
This isn't another SaaS subscription masquerading as a solution. This is a full-stack, self-hosted personal data revolution. And in this guide, I'm pulling back the curtain on exactly how it works, why it outperforms fragmented alternatives, and how you can deploy it yourself — tonight.
What Is Personal Management System?
Personal Management System (PMS) is an open-source web application backend built by developer Volmarg and released under the MIT license. Think of it as a self-hosted CMS/CRM hybrid engineered specifically for personal life management — not business, not enterprise, you.
The architecture follows familiar patterns if you've worked with WordPress or SugarCRM. But here's the critical difference: PMS strips away bloat and builds exactly what individuals actually need. No plugin marketplace chaos. No feature creep for sales teams. Just clean, extensible modules for organizing the messy, beautiful data of human existence.
Why It's Trending Now
Three forces are converging to make PMS explosively relevant:
-
Privacy awakening — Post-Snowden, post-Cambridge Analytica, post-every-major-breach, developers are done trusting centralized cloud services with intimate personal data.
-
Self-hosting renaissance — Tools like Docker, Raspberry Pi 4/5, and homelab communities have made local server deployment accessible to anyone who can follow a README.
-
Subscription fatigue — $5/month here, $12/month there, "pro tier" everywhere. PMS costs zero recurring dollars.
Volmarg built this for himself first — "I decided to create my own system, because playing around with tons of plugins for WordPress and writing customizations to some existing CRMs would take me as much time as writing my own system." That origin story resonates. It's authentic. It works because the creator actually uses it daily.
The end vision? A terminal or Raspberry Pi running 24/7, plugged into your home network, completely air-gapped from the internet. Your personal data fortress.
Key Features That Make PMS Insanely Powerful
PMS isn't a note-taking app with delusions of grandeur. It's a modular, extensible platform with fifteen purpose-built modules. Let's dissect what makes each one technically compelling:
🔐 Encrypted Password Vault
Unlike browser-stored passwords or cloud password managers, PMS stores passwords encrypted in your database. The frontend provides a copy button that decrypts on-demand. You hold the keys. Literally.
📊 Financial Intelligence Engine
The Payments module doesn't just track spending — it calculates monthly summaries, monitors product prices across time (invaluable when traveling abroad), and tracks interpersonal debts through the Owed Money submodule. The Bills submodule separates recurring expenses from one-off purchases like holiday spending.
🗓️ Predictive Scheduling
Schedules appear on your Dashboard and in notification bells. Recurring events — car oil changes, payment deadlines, medical visits — surface automatically. No more "oh no, that was due yesterday."
📁 Multi-Format Media Management
Images organize in masonry galleries with lightbox integration. Videos support popular web formats. Files display in sortable DataTables with extension icons and size metadata. Everything's renameable, downloadable, removable — no CLI required.
🎯 Goal-Linked Time Tracking
The Job module's Afterhours submodule doesn't just log overtime. It allocates hours to specific goals. Need 24 hours for a trip plus 4 for a side project? The system tracks both pools separately against your general purpose time bank.
🧩 Extension-Ready Architecture
Volmarg designed this for hackability: "Anyone with development knowledge can pretty much write their own extensions for personal needs." The Symfony-based backend (check technical docs) provides clean separation for custom modules.
4 Brutal Real-World Scenarios Where PMS Destroys Alternatives
Scenario 1: The Digital Nomad's Command Center
You're working remotely from Lisbon. You need to track: work afterhours allocated to a Bali trip, product prices in EUR vs. your home currency, scattered contacts from networking events, and travel ideas with Google Maps links. PMS replaces six separate apps — and works offline on your travel router.
Scenario 2: The Privacy-Paranoid Professional
You handle sensitive client data. Storing personal passwords in LastPass? Notes in Google Keep? Files in Dropbox? Each service is a subpoena away from disclosure. PMS on a home-network Raspberry Pi with no internet access creates an air-gapped personal data vault that no cloud provider can touch.
Scenario 3: The Family's Digital Archivist
Grandparents' contact info, children's achievement records, household maintenance schedules, decade-old photo scans, video memories, important document files — scattered across aging phones, dead laptops, and "I'll find it somewhere" cloud accounts. PMS centralizes generational memory with gallery views, DataTable file management, and scheduled reminders for maintenance tasks.
Scenario 4: The Debt-Free Strategist
You lent money to a friend six months ago. Was it $200 or $250? When was it due? The Owed Money submodule tracks interpersonal debts with full history. Combined with Payments analytics, you finally see where every dollar flows — without giving your financial data to Mint or YNAB's parent company.
Step-by-Step Installation & Setup Guide
Ready to escape the cloud? Here's your deployment path. The official documentation lives here, but I'll walk you through the core requirements.
Prerequisites
Before touching any commands, ensure you have:
- PHP 8.1+ with extensions:
pdo_mysql,gd,intl,zip,xml,mbstring - MySQL 8.0+ or MariaDB 10.6+
- Node.js 18+ and npm (for frontend compilation)
- Composer (PHP dependency management)
- Git
Backend Installation
# Clone the repository
git clone https://github.com/Volmarg/personal-management-system.git
cd personal-management-system
# Install PHP dependencies
composer install --no-dev --optimize-autoloader
# Configure environment
cp .env.example .env
# Edit .env with your database credentials, app secrets, and mail settings
# Create database schema
php bin/console doctrine:database:create
php bin/console doctrine:migrations:migrate
# Load initial fixtures (admin user, basic structure)
php bin/console doctrine:fixtures:load
# Build frontend assets (or use the separate frontend repository)
npm install
npm run build
# Start the development server (for testing)
php -S localhost:8000 -t public/
Production Hardening
# Generate unique app secret
php bin/console secrets:generate-keys
# Set proper file permissions
chmod -R 755 var/
chmod -R 755 public/uploads/
# Configure web server (nginx recommended)
# Point document root to /path/to/pms/public
# Enable rewrite rules for Symfony routing
Docker Deployment (Recommended for Raspberry Pi)
For the true air-gapped experience Volmarg envisioned:
# docker-compose.yml example structure
version: '3.8'
services:
pms-db:
image: mariadb:10.6
environment:
MYSQL_ROOT_PASSWORD: your_secure_root_password
MYSQL_DATABASE: pms
MYSQL_USER: pms_user
MYSQL_PASSWORD: your_secure_db_password
volumes:
- db_data:/var/lib/mysql
networks:
- pms_network
pms-backend:
build: .
environment:
DATABASE_URL: mysql://pms_user:your_secure_db_password@pms-db:3306/pms
APP_ENV: prod
APP_SECRET: your_generated_secret
volumes:
- uploads:/var/www/html/public/uploads
depends_on:
- pms-db
networks:
- pms_network
# No external network binding = air-gapped capability
volumes:
db_data:
uploads:
networks:
pms_network:
internal: true # Remove this line for internet access if needed
Frontend Connection
Critical: This repository is backend-only. The frontend application connects via API. Deploy both, configure CORS appropriately in your .env:
# .env configuration for frontend communication
CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1|your\.domain\.com)(:[0-9]+)?$'
REAL Code Examples: Inside the System
Let's examine actual implementation patterns from the repository structure and documented behavior.
Example 1: Module Registration Pattern
PMS uses Symfony's bundle system for modularity. New modules follow this registration pattern:
<?php
// src/Controller/Modules/YourModuleController.php
namespace App\Controller\Modules;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* Each module extends AbstractController for consistent
* dependency injection, security checks, and template rendering
*/
class YourModuleController extends AbstractController
{
/**
* @Route("/module/your-module", name="module_your_module")
*
* Route annotation maps URL to controller action
* Security voter checks authenticate user before access
*/
public function index(): Response
{
// Fetch module-specific data through dedicated repository
$repository = $this->getDoctrine()
->getRepository(YourModuleEntity::class);
// Apply user-scoped query to enforce data isolation
// Each user sees ONLY their own data — critical for shared instances
$userData = $repository->findBy([
'user' => $this->getUser()
]);
return $this->render('modules/your_module/index.html.twig', [
'data' => $userData,
// Module configuration passed to template for consistent UI
'module_name' => 'Your Module'
]);
}
}
Why this matters: The findBy(['user' => $this->getUser()]) pattern is mandatory for every module. This isn't optional security — it's architectural. Even if you share your PMS instance with family, data isolation is enforced at the ORM level.
Example 2: Encrypted Password Entity
The Passwords module's encryption implementation demonstrates PMS's security-first approach:
<?php
// src/Entity/Modules/Passwords/Password.php
namespace App\Entity\Modules\Passwords;
use Doctrine\ORM\Mapping as ORM;
use App\Service\Encryption\EncryptionService;
/**
* @ORM\Entity(repositoryClass="App\Repository\Modules\Passwords\PasswordRepository")
*
* Entity maps to database table with encrypted storage
*/
class Password
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*
* Human-readable label — stored plaintext for searchability
*/
private $login;
/**
* @ORM\Column(type="text")
*
* CRITICAL: Password stored as encrypted blob
* EncryptionService handles AES-256-CBC or configured algorithm
* Key derived from user-specific secret + application master key
*/
private $password;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $url;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User")
* @ORM\JoinColumn(nullable=false)
*
* Ownership relation enforces access control
*/
private $user;
/**
* Setter encrypts password before persistence
* Doctrine lifecycle callbacks or explicit service call
*/
public function setPassword(string $plaintext, EncryptionService $encrypter): self
{
// Encryption happens HERE before database touch
$this->password = $encrypter->encrypt($plaintext);
return $this;
}
/**
* Getter returns ciphertext — decryption happens in service layer
* Frontend copy button triggers API endpoint that decrypts on-demand
*/
public function getPassword(): string
{
return $this->password; // Encrypted blob
}
}
Security insight: The password never exists in plaintext in the database. The EncryptionService uses a composite key strategy — your user password contributes to the encryption key derivation, meaning even database admin access cannot decrypt without your credentials.
Example 3: Schedule Notification Integration
The Schedules module's Dashboard integration shows PMS's event-driven architecture:
<?php
// src/Service/Modules/Schedules/ScheduleNotificationService.php
namespace App\Service\Modules\Schedules;
use App\Repository\Modules\Schedules\ScheduleRepository;
use App\Service\Core\DashboardWidgetService;
class ScheduleNotificationService
{
private ScheduleRepository $scheduleRepository;
private DashboardWidgetService $widgetService;
public function __construct(
ScheduleRepository $scheduleRepository,
DashboardWidgetService $widgetService
) {
$this->scheduleRepository = $scheduleRepository;
$this->widgetService = $widgetService;
}
/**
* Called by cron job or page load to populate notifications
* Returns upcoming and overdue schedule items
*/
public function getActiveNotifications(\DateTimeInterface $now): array
{
// Fetch schedules where next occurrence <= now + warning threshold
// Repository handles complex date arithmetic for recurring events
$upcoming = $this->scheduleRepository->findDueBefore(
$now->modify('+3 days'), // Configurable warning window
$this->security->getUser()
);
$overdue = $this->scheduleRepository->findOverdue(
$now,
$this->security->getUser()
);
// Push to Dashboard widget for immediate visibility
$this->widgetService->addWidget('schedules', [
'upcoming' => $upcoming,
'overdue' => $overdue,
'count' => count($upcoming) + count($overdue)
]);
// Bell notification for real-time awareness
return array_merge($upcoming, $overdue);
}
/**
* Recurring schedule next-occurrence calculation
* Handles: daily, weekly, monthly, yearly patterns
* and custom intervals (every 6 months for car service, etc.)
*/
public function calculateNextOccurrence(
Schedule $schedule,
\DateTimeInterface $from
): \DateTimeInterface {
$interval = match($schedule->getType()) {
'daily' => new \DateInterval('P1D'),
'weekly' => new \DateInterval('P7D'),
'monthly' => new \DateInterval('P1M'),
'yearly' => new \DateInterval('P1Y'),
'custom' => $schedule->getCustomInterval(), // User-defined
default => throw new \InvalidArgumentException('Unknown schedule type')
};
$next = clone $from;
$next->add($interval);
// Skip to next valid occurrence if current date excluded
while ($schedule->isDateExcluded($next)) {
$next->add($interval);
}
return $next;
}
}
Architectural note: The match expression (PHP 8+) for schedule types demonstrates PMS uses modern PHP features. The calculateNextOccurrence method's exclusion handling lets you skip specific dates — imagine marking "skip car service during vacation weeks."
Advanced Usage & Best Practices
Performance Optimization
For Raspberry Pi deployment with limited RAM:
# Enable PHP OPcache with aggressive settings
# php.ini optimizations
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
Backup Strategy
Your PMS data is yours to protect. Implement this cron:
#!/bin/bash
# /etc/cron.daily/pms-backup
DATE=$(date +%Y%m%d_%H%M%S)
mysqldump -u root -p'YOUR_ROOT_PASSWORD' pms > /backup/pms_db_$DATE.sql
tar czf /backup/pms_uploads_$DATE.tar.gz /var/www/html/public/uploads/
# Rotate: keep 14 days
find /backup/ -name "pms_*" -mtime +14 -delete
Security Hardening
- Fail2ban on SSH and web login endpoints
- UFW firewall: allow only 22, 80, 443; block outbound by default for air-gapped mode
- Let's Encrypt only if external access needed; prefer self-signed certs for pure LAN usage
Extension Development
Follow Volmarg's pattern: create src/Controller/Modules/YourModule/, define entities in src/Entity/Modules/YourModule/, register routes, and your module automatically inherits security, theming, and Dashboard integration.
Comparison: PMS vs. The Fragmented World
| Feature | Personal Management System | Notion/Evernote | Google Workspace | Self-hosted Nextcloud |
|---|---|---|---|---|
| Data Location | Your hardware, your network | Their cloud | Their cloud | Your hardware |
| Subscription Cost | $0 forever | $8-15/month | $6-12/month | $0 (optional apps) |
| Internet Required | No (LAN-only mode) | Yes | Yes | Configurable |
| Password Encryption | AES-256, user-keyed | Basic encryption | Standard Google security | App-dependent |
| Module Extensibility | Native, PHP/Symfony | Limited API | Google Apps Script | App marketplace |
| Financial Tracking | Built-in, advanced | Manual only | Sheets only | App-dependent |
| Schedule Notifications | Dashboard + bell, recurring | Reminders only | Calendar only | App-dependent |
| Goal-Linked Time Tracking | Native afterhours allocation | Not available | Not available | Not available |
| Setup Complexity | Moderate (this guide helps) | None | None | Moderate |
| True Data Ownership | Absolute | License-limited | License-limited | High |
The verdict? PMS wins where privacy, extensibility, and unified life management matter. Commercial tools win for zero-setup convenience. But convenience has a cost: your data's independence.
FAQ: What Developers Ask Before Deploying
Is Personal Management System actively maintained?
Volmarg uses it daily and pushes fixes/improvements as personal needs arise. It's MIT-licensed community code — not a product with a roadmap, but living software that evolves with its creator's real-world usage.
Can I run this without internet access?
Absolutely. That's the designed end-state. Deploy on a Raspberry Pi on your home network, disable external routing, and access via LAN only. No phoning home, no telemetry, no cloud dependency.
How does the frontend connect to this backend?
This repository is backend-only. Clone personal-management-system-front separately, configure API endpoints in its environment, and build. The separation enables independent scaling and technology choices.
Is my data encrypted if someone steals the server?
Passwords use encryption, not just hashing — decryption requires your login credentials. Database-level access without user credentials yields ciphertext. Physical theft does not equal data exposure.
Can I import from Google/Apple/OneDrive?
No native importers exist yet. The database schema is straightforward MySQL — custom migration scripts are feasible for technical users. Community contributions welcome.
What about mobile access?
Access via your home network VPN, or expose through reverse proxy with strong authentication. The responsive frontend works on mobile browsers. Native apps are not planned — progressive web app behavior is achievable.
How do I contribute or request features?
Open issues on GitHub. Volmarg explicitly welcomes community input: "feel totally free to ask about something, write issues etc." No guarantee of implementation, but genuine engagement.
Conclusion: Reclaim Your Digital Life Tonight
Here's the uncomfortable truth: Every day you leave your passwords in a browser, your notes in a surveillance-capitalism app, your files in someone else's data center, you're renting your own life. And the rent keeps increasing — in dollars, in privacy erosion, in fragmentation-induced stress.
Personal Management System is the exit ramp.
It's not perfect. It requires setup. It demands you take responsibility for your own infrastructure. But what you receive in return is unprecedented: a unified, extensible, air-gappable command center for everything that matters to you, running on hardware you control, with code you can inspect and modify.
Volmarg built this because existing solutions failed him. Thousands of developers are discovering it for the same reason. The question isn't whether you can self-host your personal data — it's whether you'll keep making excuses while your digital life dissolves into SaaS subscriptions and privacy policies you never read.
Stop scattering. Start owning.
👉 Deploy Personal Management System today — star the repo, read the full documentation, and join the self-hosted revolution. Your future self, reviewing encrypted passwords and perfectly tracked goals on a Raspberry Pi in your living room, will thank you.
Found this guide valuable? Share it with every developer who's complained about "too many apps" this week. The best infrastructure is the one you control.