{"id":13632797,"url":"https://github.com/lybekk/offPIM","last_synced_at":"2025-04-18T05:33:18.385Z","repository":{"id":37194749,"uuid":"224896259","full_name":"lybekk/offPIM","owner":"lybekk","description":"Decentralized, Offline-first, Personal Information Manager (PIM) using PouchDB/CouchDB. Includes task-, note-, and contact-management, as well as journaling.","archived":false,"fork":false,"pushed_at":"2022-11-13T21:10:00.000Z","size":11182,"stargazers_count":77,"open_issues_count":0,"forks_count":8,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-13T03:03:54.789Z","etag":null,"topics":["couchdb","desktop","electron","javascript","personal-information-management","pim","pouchdb","productivity","progressive-web-app","pwa","sync","vue","vuetify","webapp"],"latest_commit_sha":null,"homepage":"https://lybekk.github.io/offPIM/","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lybekk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null},"funding":{"custom":["https://brave.com/off167"]}},"created_at":"2019-11-29T17:23:02.000Z","updated_at":"2025-04-11T15:10:19.000Z","dependencies_parsed_at":"2023-01-21T05:04:52.778Z","dependency_job_id":null,"html_url":"https://github.com/lybekk/offPIM","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lybekk%2FoffPIM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lybekk%2FoffPIM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lybekk%2FoffPIM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lybekk%2FoffPIM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lybekk","download_url":"https://codeload.github.com/lybekk/offPIM/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249437004,"owners_count":21271986,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["couchdb","desktop","electron","javascript","personal-information-management","pim","pouchdb","productivity","progressive-web-app","pwa","sync","vue","vuetify","webapp"],"created_at":"2024-08-01T22:03:15.887Z","updated_at":"2025-04-18T05:33:17.940Z","avatar_url":"https://github.com/lybekk.png","language":"Vue","funding_links":["https://brave.com/off167"],"categories":["Vue"],"sub_categories":[],"readme":"# offPIM\n\n\u003cp\u003e\n\u003cstrong style=\"background-color: var(--mdc-theme-secondary); color: whitesmoke; padding: .6rem; border-radius: 4px;\"\u003e\nNote:\n\u003c/strong\u003e\noffPIM is not under active development. \n\u003cbr/\u003e However, the repo will stay up, and pull requests or forks are welcome :)\n\u003c/p\u003e\n\n\n---\n\n\u003e offPIM - A PIM - A Personal information management system\n\u003e\n\u003e Use as a Progressive Web App (PWA).\n\u003e\n\u003e Or on the desktop. Supports Windows \u003cimg src=\"assets/img/logo_windows.png\" alt=\"Windows\" width=\"16\"\u003e, \n\u003e Mac \u003cimg src=\"assets/img/logo_mac.png\" alt=\"Mac OS\" width=\"16\"\u003e, \n\u003e Linux \u003cimg src=\"assets/img/logo_linux.png\" alt=\"Linux\" width=\"16\"\u003e, \n\u003e and Android \u003ca href='https://play.google.com/store/apps/details?id=tech.lybekk.offpim\u0026pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'\u003e\u003cimg alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png' style=\"width: 31%;\"/\u003e\u003c/a\u003e\n\n*Quick access*\n[offpim.netlify.app](https://offpim.netlify.app)\n\n![offPIM architecture diagram](assets/img/offPIM_diagram.svg)\n\n## Screenshots\n\n### Material design\n![Dashboard screenshot](assets/img/dashboard.png)\n### Dark mode \u0026 mobile ready\n![Dark apps screenshot](assets/img/apps_dark.png)\n\n## Description\nAn easily deployable PIM made for the CouchDB ecosystem.\nIn an age where everything is about collaboration and sharing... This is a counterweight to that. Not everything needs to be shared. Something is just personal.\n\n### Features\n* Works offline, as in offline-first\n* Local storage in browser. No server needed\n* Sync back and forth to an external database (any DB supporting the CouchDB replication protocol). Full master-master replication\n* Apps\n    * Dashboard\n        * A collection of metrics from the other apps\n    * Task management\n        * Projects\n        * Mainly built with the GTD productivity methodology in mind. The data model also supports other task management strategies, like the the Eisenhower Matrix (Urgent-Important) with priorities 1-4 representing the four importance levels. Kanban should work too, though by using another app.\n    * Notes\n        * A cleaner, single-purpose interface to notes.\n    * Contacts\n    * Journalling/logging\n    * Messaging (For general purpose information between devices and such, or whatever you feel like)\n    * Search\n        * Find items in offPIM by searching\n* Progressive web app (PWA)\n* Export/import to/from JSON\n* Open source. No proprietary technologies. No external requests. No tracking.\n* Self-hosted version available. BYOS(Bring Your Own Server). No backend or complicated installation procedure. Just unzip on a web server.\n* Make your own\n    * offPIM's data model is flat and not relational, which enables other apps to use the same data if replicated to another database, I.E. CouchDB. Create a standalone app or a piece of analytics software to analyze productivity habits, semantics, interesting discoveries about yourself, or `\u003cinsert lofty idea here\u003e`.\n\n**Features under development:**\n\n* Personal Finances (Under development)\n* Inventory (Under development)\n* Maps (Under development)\n* Themes\n\n## \u003ca id=\"gettingstarted\" /\u003eGetting started\nGetting offPIM up and running can be done in several ways.\n\n*Four flavors are currently available*\n\n* **Official app online**\n    1. Visit [offpim.netlify.app](https://offpim.netlify.app).\n* **Desktop-app (Electron)**\n    1. [Download the app for your operating system](#downloads).\n    *Windows*\n    2. Double-click offpim_desktop.exe to install.\n    3. Open the app from the start menu.\n    *Linux*\n    2. Double click the downloaded AppImage file. If that doesn't work, try the steps below.\n        1. Make it executable `$ chmod a+x path-to-file/offpim_desktop.AppImage`.\n        2. and run! `$ ./path-to-file/offpim_desktop.AppImage`.\n    *Mac*\n    2. Currently no app for Mac OS.\n    **Note:** \"offPIM-Electron\" is currently only tested on Windows(10) and Linux(Ubuntu).\n* **Android**\n    1. [Download the app from Google Play Store](https://play.google.com/store/apps/details?id=tech.lybekk.offpim).\n* **Self-hosted static bundle (SPA)**\n    1. [Download](#downloads) and unzip contents in any directory (even root) on any HTTP-server.\n    **Note:** Suitable for placing on a private VPS served by Apache, or any other http-server (I.E. python http.server or Node.js http.createServer).\n* **(Alternative) Self-hosted static bundle (SPA)**\n    1. [Download](#downloads) and unzip contents in any directory on your computer. As long as a browser is available, offPIM will run.\n\n### The very easy way - Use now - Official [offpim.netlify.app](https://offpim.netlify.app)\n\n[Use a live version of offPIM](https://offpim.netlify.app) (or use it permanently, as it works just as it will anywhere else). You may close the browser and tabs. Your data will still be stored in your browser.\n\n| Host        | Build status    |\n| ----------- |:-------------:|\n| Netlify     | [![Netlify Status](https://api.netlify.com/api/v1/badges/ac368203-f0ac-4934-9fc2-dc4e68bb3d1d/deploy-status)](https://app.netlify.com/sites/offpim/deploys) |\n\n* **PS:** Your data never leaves your browser, as it uses [PouchDB](https://pouchdb.com/), an in-browser database. The data entered into offPIM will never touch the server it's hosted on, as all code is downloaded to the browser and executed locally, including form submission.\n* **PS2:** The downside to this however, is that the data will disappear if the browser cache/data gets deleted during an upgrade or the like. Remember to back up and/or synchronize regularly, as is crucial for all valuable data.\n* **PS3:** *(For network nerds)* To verify there's no monkey business going on here, investigate the data flow yourself. Open the developer tab (F12), and check the network tab to see where the traffic goes (or rather, where it doesn't go).\n\n### The easy way - Desktop app\n\n1. [Download the app for your operating system](#downloads)\n*Windows*\n2. Double-click offpim_desktop.exe to install\n3. Open the app from the start menu.\n*Linux*\n2. Make it executable `$ chmod a+x path-to-file/offpim_desktop.AppImage`\n3. and run! `$ ./path-to-file/offpim_desktop.AppImage`\n*Mac*\n2. Currently no app for Mac OS\n\n**Note:** \"offPIM-Electron\" is currently only built and tested on Windows(10) and Linux(Ubuntu), though it is possible to build for another OS yourself.\n\n### The still-easy-but-requires-a-few-more-steps way (for techies)\n\n1. [Download self-hosted offPIM](#downloads)\n2. Copy contents of the zip-file into a directory (or root) to an HTTP-server of your choosing. *offPIM uses relative paths, so any directory should work*\n\n**Note: A HTTP-server is not necessary, as offPIM has a \"simple\" tech stack, making it runnable can be run from a directory on the desktop**\n\n### The hard way - Build it yourself\n1. Clone the repository\n2. install dependencies `npm install`\n4. run `npm run build` for self-hosted, or `npm run electron:build` for desktop app\n\nExample\n```Shell\n$ cd /home/user/folder\n$ git clone https://github.com/lybekk/offPIM.git\n$ npm install\n$ npm run electron:build\n```\n\n## Self-hosted - tested setups / Deployment options\n\noffPIM is run successfully on the following deployment setups\n\n### CouchDB+Apache (Ubuntu)\n* Apache/2.4.29 (Ubuntu)\n* Couchdb 2.3 (or 3.0)\n\n### CouchDB HTTP server\n* Couchdb 2.3\nDist contents placed directly in Fauxton's directory\nServing offPIM with CouchDB's HTTP server.\nuse offpim/ or another sub-directory if you wish. Using offpim for simplicity here.\n\n- Change vue.config.js publicPath to /_utils/offpim/\n- put files in opt/couchdb/share/www/offpim/\n- visit http://localhost:5984/_utils/offpim/\n\nAdded bonus: Turning on CORS is not necessary if put directly in CouchDB's www folder.\n\n### Python HTTPServer\n```python\nimport http.server\nimport socketserver\nimport webbrowser\n\nPORT = 8000\n# Binds to localhost only. Use \"\" for exposing this to network interfaces\nHOST = \"localhost\" \n\n# Launches the server in current working directory in the default web browser\nurl = 'http://' + HOST + \":\" + str(PORT)\nwebbrowser.open_new_tab(url)\n\n# Magic\nHandler = http.server.SimpleHTTPRequestHandler\n\nwith socketserver.TCPServer((HOST, PORT), Handler) as httpd:\n    print(\"serving at port\", PORT)\n    httpd.serve_forever()\n```\n\n## \u003ca id=\"downloads\"\u003e\u003c/a\u003eDownload\n\n\u003cdiv class=\"card\"\u003e\n    \u003ca href=\"https://github.com/lybekk/offpim/releases/latest/download/offpim_desktop.AppImage\" class=\"mdc-button mdc-button--raised\"\u003e\n        \u003cimg src=\"assets/img/logo_linux.png\" alt=\"Linux\" width=\"32\"\u003e\n        Linux\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/lybekk/offpim/releases/latest/download/offpim_desktop.exe\" class=\"mdc-button mdc-button--raised\"\u003e\n        \u003cimg src=\"assets/img/logo_windows.png\" alt=\"Windows\" width=\"32\"\u003e\n        Windows\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/lybekk/offpim/releases/latest/download/offpim_desktop.dmg\" class=\"mdc-button mdc-button--raised\"\u003e\n        \u003cimg src=\"assets/img/logo_mac.png\" alt=\"Mac OS\" width=\"32\"\u003e\n        Mac OS\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/lybekk/offpim/releases/latest/download/offpim_self_hosted.zip\" class=\"mdc-button mdc-button--raised\"\u003e\n        \u003cimg src=\"assets/img/logo_self_hosted.png\" alt=\"Self-hosted\" width=\"32\"\u003e\n        Self-hosted\n    \u003c/a\u003e\n    \u003ca href='https://play.google.com/store/apps/details?id=tech.lybekk.offpim\u0026pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'\u003e\u003cimg alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png' style=\"width: 31%;\"/\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n**Note:** *The downloadable versions may be a bit behind the [offpim.netlify.app](https://offpim.netlify.app) version. A better way to build and distribute is on the drawing board*\n\n### Requirements\n\n#### Desktop app\n* No requirements. Any computer running Windows, Linux or Mac OS will do.\n\n#### Self-hosted\n* Any HTTP Server\n\n#### Synchronization\n* A Database supporting the CouchDB replication protocol like:\n    * CouchDB\n    * PouchDB Server\n    * Cloudant\n    * Couchbase Sync Gateway\n\n*The following setups have been tested successfully*\n\n* CouchDB 2.x\n* CouchDB 3.x\n* Cloudant\n* PouchDB Server\n    * Tested OK on both Desktop and via [Termux on Android](https://lybekk.tech/guide/pouchdb-server-termux).\n\n\u003eInstallation instructions for [CouchDB](https://docs.couchdb.org/en/latest/install/index.html)\n\n\n#### If need for customization, or self-building:\n* Node.js\n* NPM\n\n## Usage\n\nFor local customization and development, run \u003ccode\u003enpm install\u003c/code\u003e first.\n\nTests on mid-end devices with 30 000+ documents (5K in offPIM, while the rest is archived on Remote DB) performs well. \nIndex optmizations are done now and then (tips welcome).\n\n\n\n### Compiles and hot-reloads for development\n```bash\nnpm run serve\nor\nelectron:serve\n```\n\n### Compiles and minifies for production\n```bash\nnpm run build\nor\nnpm run electron:build\n```\n\n### Build for Android\n1. Build web assets with `npm run capacitor:build:android`\n2. Build in Android Studio- `Build/Build Bundle` or `Generate Signed Bundle`\n3. Find the finished build in `offPIM/android/app/release/app-release.aab`\n\n## Customization\n\nSee [documentation](https://lybekk.github.io/offPIM/docs/gettingstarted) for customization options.\n\n### Security\noffPIM doesn't include any built-in security features (i.e. local encryption), and relies entirely on the surrounding environment. With this in mind, it's a good idea to keep an eye open on where your data travels.\nUsing HTTPS, enforcing database permissions and other security best practices are recommended. \nAuthentication when syncing with an external database is done through PouchDB.\n\n## Contributing\nContributions in any form will be appreciated.\n\n* Ideas, suggestions and feedback.\n* Pull requests\n* Styling tips (Code,Layout,CSS)\n* Tips regarding security considerations\n* Donations, of course\n\nCommits to github will be instantly reflected on [offpim.netlify.app](https://offpim.netlify.app).\nPWA Service workers may need 24 hours to update to the newest version automatically. A manual cache refresh will force download the newest version.\n\n### Sponsoring\nUsing, and downloading [Brave Browser](https://brave.com/off167) from [this link](https://brave.com/off167) gets me a cup of coffee.\n\n### Android app (Capacitor)\n\nWhen building the app, add a file named `capacitor.config.json` in the root of offPIM's project folder.\n\nExample config:\n```json\n{\"appId\":\"tech.lybekk.offpim\",\"appName\":\"offPIM\",\"bundledWebRuntime\":false,\"webDir\":\"/home/username/development/offPIM/dist/bundled\"}\n```\n\n## Design choices\n\n### Name\n**Formerly known as pimpim**\n*(rebranded as not to be confused with a \"male performance product\" solving a different problem)*\n\n### Frontend only\nNo backend is provided or required. For synchronization, a CouchDB/PouchDB/Cloudant database is needed.\n\n### UI (CSS)\n\nThe choice of UI/CSS frameworks landed on Vuetify. Feature-rich and integrates exceptionally well with Vue.\n\n### Vue Single File Components\n\nVue's sexy [Single File Components](https://vuejs.org/v2/guide/single-file-components.html) (SFC) provides an excellent separation of concerns and does a good job in helping reduce inevitable spaghetti code.\n\nThe drawback to SFC, some would say, is the reliance on Webpack.\nThe advantages one gets by utilizing Vue's entire ecosystem (Vue CLI, SFC, Router, Vuex) makes it worth it, however.\n\n## Roadmap\n\n### On the horizon\n* Tasks app\n    * View notes attached to project\n* Personal finance\n    * Budget\n    * Expenses\n    * Subscriptions\n* Inventory\n    * Emergency Preparedness\n    * Collectibles\n* Finances\n* Maps\n    * Logbook entries visible in map\n    * Retrieval of contacts addresses\n* Dashboard\n    * Text-to-speech(TTS) reading of status report\n\n### Time permitting\n\n* Export to a format following the structure of [The big book of everything](http://www.erikdewey.com/bigbookmkIIIa.pdf)\n* Android/iOS app (using couchbase lite)\n* CGI/WSGI variant\n    * In the future, an optional, auxilliary Python script, or CGI/WSGI backend is planned to enable server-side heavy lifting like report generation, insights (machine learning), inter-system communication and such.\n\n## Credits\nCreators and maintainers of:\n* [PouchDB](https://pouchdb.com/)\n* [CouchDB](https://couchdb.apache.org/)\n* [Vue](https://vuejs.org/)\n* [Vuetify - Vue JS component framework](https://vuetifyjs.com/en/)\n* [Electron](https://www.electronjs.org/)\n* [Lunr.js](https://lunrjs.com/)\n* And a ton others\n\n## License\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flybekk%2FoffPIM","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flybekk%2FoffPIM","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flybekk%2FoffPIM/lists"}