A fully offline desktop application for managing records with PDF/Image conversion, TOC generation, Diary/Dispatch management, and duplicate handling.
- ✅ File Upload & Conversion: Support PDF and image formats (JPG, PNG)
- ✅ Auto PDF Conversion: Images automatically converted to PDF pages (A4 size)
- ✅ PDF Merge with TOC: Auto-generate Table of Contents with hyperlinks
- ✅ Duplicate Detection: Check Number + Date combination to prevent duplicates
- ✅ Diary Management: Create, search, and manage diary entries
- ✅ Dispatch Management: Track dispatch records with Excel export
- ✅ Dark/Light Mode: Toggle between themes
- ✅ Search & Filter: Find records by title, subject, or tags
- ✅ Dashboard: View statistics and quick overview
- Node.js (v14 or higher)
- npm
-
Clone the repository
git clone https://github.com/itsiteon/offline-record-manager.git cd offline-record-manager -
Install dependencies
npm install
-
Start the server
npm start
The app will be available at
http://localhost:3000 -
For development with auto-reload
npm run dev
- Navigate to Upload tab
- Select image or PDF files
- System auto-converts images to PDF (A4 size)
- Click Convert & Save
- Go to Merge tab
- Select multiple PDFs
- Choose sort order (Newest first/Oldest first)
- System auto-generates TOC on first page
- Download merged PDF
- Click Diary tab
- Enter Diary Number, Date, and Subject
- Add entry - stored in local data folder
- Search and filter by date range
- Click Dispatch tab
- Enter Dispatch Number, Date, and Subject
- Add entry
- Export to Excel (All dispatch records)
- System automatically checks Number + Date combination
- Shows warning with existing entry preview
- Options to Cancel, Allow Duplicate, or Overwrite
offline-record-manager/
├── backend/
│ ├── server.js # Express server
│ ├── routes/
│ │ ├── upload.js # File upload & conversion
│ │ ├── merge.js # PDF merge with TOC
│ │ ├── diary.js # Diary management
│ │ ├── dispatch.js # Dispatch management
│ │ └── stats.js # Dashboard stats
│ └── utils/
│ ├── fileHandler.js # File I/O operations
│ ├── pdfHandler.js # PDF processing
│ └── imageHandler.js # Image conversion
├── frontend/
│ ├── index.html # Main HTML
│ ├── css/
│ │ └── style.css # Responsive styles
│ └── js/
│ ├── app.js # Main app logic
│ ├── ui.js # UI interactions
│ └── api.js # API calls
├── data/
│ ├── records/ # Stored PDFs
│ ├── diary/ # Diary entries
│ ├── dispatch/ # Dispatch entries
│ └── uploads/ # Temporary uploads
├── package.json
├── README.md
├── INSTALLATION.md
└── FEATURES.md
All data is stored locally in the ./data folder:
- Records:
data/records/*.pdf - Diary:
data/diary/diary.json - Dispatch:
data/dispatch/dispatch.json
This is a fully offline application. No data is sent to external servers. All records remain in your local ./data folder.
- Backend: Add route in
backend/routes/ - Frontend: Add UI in
frontend/js/ - Utils: Add helpers in
backend/utils/
Diary Entry (data/diary/diary.json):
{
"entries": [
{
"id": "uuid",
"number": "D001",
"date": "2026-07-11",
"subject": "Meeting notes",
"content": "...",
"createdAt": "2026-07-11T10:00:00Z"
}
]
}Dispatch Entry (data/dispatch/dispatch.json):
{
"entries": [
{
"id": "uuid",
"number": "DS001",
"date": "2026-07-11",
"subject": "Urgent report",
"createdAt": "2026-07-11T10:00:00Z"
}
]
}MIT License - Feel free to use and modify
For issues or feature requests, create an issue on GitHub.