BFBambooForge Labs

Document Management System (DMS) & Cloud Sync

Document management with folders, per-group access, tags, versions with one-click revert and locking - synced to Nextcloud, ownCloud or S3.

Buy on the Odoo Apps StoreOpen the live demoDocument Management€290Community & Enterprise

Available for Odoo 16.0, Odoo 17.0, Odoo 18.0, Odoo 19.0. Technical name bambooforge_dms.

Odoo 16.0Odoo 17.0Odoo 18.0Odoo 19.0
Full walkthrough on a live Odoo 19.0 database, with subtitles. It ends with what this app deliberately does not do.

Document Management System (DMS) & Cloud Sync

Attachments scattered over chatter are not a filing system. This app gives Odoo folders with per-group access, files with versions and locks — and a sync engine that mirrors every folder to Nextcloud, ownCloud or an S3-compatible bucket and is honest about being two-way.

What syncing actually means here

Most "cloud sync" modules upload and hope. This one keeps a ledger:

  • Local changes are pushed. Uploading, renaming, moving or editing a file flags it To Push; the next sync run (scheduled every 30 minutes, or the Sync Now button) uploads it and remembers the server's ETag.

  • Remote edits are detected and pulled — the reconcile pass compares the stored ETag with the server's. A colleague who edited the file straight in Nextcloud does not overwrite anything: the remote copy comes back as a new version on top of the history.

  • When both sides changed, nothing is guessed. The file is flagged Conflict, an activity is scheduled for its owner, and the form offers two buttons: Keep Odoo Version or Pull Remote Version. Whichever you pick, the losing content is still there as a version.

  • Nothing is overwritten blind. Before every push the engine re-checks the remote ETag; a remote edit it has not seen yet turns the push into a conflict instead of a lost update.

  • Deletions wait their turn. Deleting a file in Odoo queues the remote deletion in the sync log; the next run executes it. No network calls ever run inside your database transaction.

Every byte that moves is a line in DMS → Configuration → Sync Log.

Install

  1. Install BambooForge DMS & Cloud Sync (depends on Discuss only).

  2. Give document librarians DMS: Manager — they configure storages and folders and bypass locks. Everyone else gets DMS: User.

  3. The DMS menu appears with Files, Folders, and (for managers) Configuration.

Folders

DMS → Folders → New

  • Name and parent build the tree; the full path becomes the remote directory when the folder syncs.

  • Access groups — leave empty and every DMS user sees the folder; pick groups and only their members (plus DMS managers) do. Files, versions and searches all obey the folder's groups.

  • Storage decides where the files physically live. Sub-folders suggest their parent's storage; renaming or moving a folder re-locates every file under it on the remote server on the next sync.

Files

DMS → Files → New, or just drop a file in.

  • Every upload is a version; the Versions tab shows who, when, size and checksum, lets you download any of them and revert — which stacks the old content on top as a new version instead of rewriting history.

  • Lock a file while you work on it; other users cannot modify, move or delete it until you unlock (a manager can always break a lock).

  • Tags and the folder panel on the left make the Files view a browser.

  • The Related Record tab links a file to any business document (an invoice, a project task…) and the smart button jumps straight to it.

  • sha256 checksums are computed on every version — the same fingerprint the sync engine uses to detect changes.

Storages

DMS → Configuration → Storages → New

Odoo filestore is the default: files stay local, nothing syncs.

WebDAV (Nextcloud / ownCloud)

  • URL is the DAV files endpoint, e.g. https://cloud.example.com/remote.php/dav/files/odoo, plus the login of a dedicated sync user. Test Connection does a real PROPFIND.

  • Missing remote directories are created automatically (MKCOL) on the first push.

S3-compatible object storage

  • Works with AWS S3, MinIO, Wasabi and anything that speaks the S3 API. Endpoint, region, bucket and a key pair — that is all.

  • The Signature V4 signer is built into the module. No boto3, no extra Python packages on your server.

Common options:

  • Sync root — the remote directory / key prefix everything lives under.

  • Scheduled sync — untick to keep a storage manual-only.

  • On remote delete — when a file vanishes on the server, either upload it again (default) or archive it in Odoo and follow the remote's lead.

Day to day

  • The Files list shows each file's sync badge: To Push, In Sync, Conflict, Error. Filters for each are one click away.

  • Sync Now on a storage pushes everything pending and reconciles the rest; the same button on a single file does just that file.

  • The scheduled job DMS: sync cloud storages runs every 30 minutes and works through every storage with scheduled sync enabled. One broken server never starves the others.

  • Sync log rows older than 90 days are cleaned up automatically — except queued deletions, which are work, not history.

Limits, stated plainly

  • Sync is per-folder-tree by binding folders to a storage; there is no per-file cherry-picking.

  • Remote files that never existed in Odoo are not imported automatically — the mirror is Odoo-outward, with remote edits (not remote creations) flowing back.

  • WebDAV servers that return no ETag get a synthetic one; change detection then relies on push bookkeeping only.

What changed in 1.1

  • Controlled documents (ISO 9001). Folders can require approval: draft -> in review -> approved -> obsolete, with named approvers, an activity trail, and one honest rule - editing an approved file sends it back to draft, even when the new content arrived from the cloud sync. Review due dates remind the approver a week ahead.

  • Retention schedules (ISO 15489). A folder keeps its files n years (from upload or from the effective date); expiry flags the file and asks a person to archive or waive. Nothing is ever deleted automatically.

What changed in 1.2

  • Document codes. Give a folder a prefix (QP, SOP, WI) and every file created there receives a sequential code - QP-001, QP-002 - independent of the filename, searchable, quotable in an audit.

  • Content search. Plain-text formats are indexed on upload and the Files search gains a Content filter; PDFs are indexed too when pdfminer.six is installed on the server (stated plainly: without it, PDFs are not).

What changed in 1.3

  • Controlled copies (ISO 9001 7.5.3). One button stamps an approved PDF on every page - document code, revision, who took it, when, and "uncontrolled once printed" - and writes the issue into a register on the document, so an auditor can see which revision is out there on paper. The register prunes itself after two years.

Support

support@bambooforge.dev — answered within two business days. This module is licensed OPL-1; one purchase covers one production database plus its staging copies.

Screens

Copies - bambooforge_dms
Copies
File - bambooforge_dms
File
Files - bambooforge_dms
Files
Storage - bambooforge_dms
Storage
Synclog - bambooforge_dms
Synclog