{"id":31626526,"url":"https://github.com/c8121/asset-storage","last_synced_at":"2026-05-03T20:33:16.376Z","repository":{"id":316711049,"uuid":"1061139241","full_name":"c8121/asset-storage","owner":"c8121","description":"Basically a DAM-System (Digital Asset Management). Includes a Webserver providing a SPA (Single Page Application) to browse the storage content.","archived":false,"fork":false,"pushed_at":"2025-10-04T10:31:05.000Z","size":1032,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-04T12:09:26.407Z","etag":null,"topics":["dam","golang","spa","vuejs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/c8121.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-21T10:21:59.000Z","updated_at":"2025-10-04T10:31:09.000Z","dependencies_parsed_at":"2025-09-26T09:23:55.485Z","dependency_job_id":null,"html_url":"https://github.com/c8121/asset-storage","commit_stats":null,"previous_names":["c8121/asset-storage"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/c8121/asset-storage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c8121%2Fasset-storage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c8121%2Fasset-storage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c8121%2Fasset-storage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c8121%2Fasset-storage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/c8121","download_url":"https://codeload.github.com/c8121/asset-storage/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c8121%2Fasset-storage/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278671740,"owners_count":26025743,"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","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["dam","golang","spa","vuejs"],"created_at":"2025-10-06T19:53:16.346Z","updated_at":"2026-05-03T20:33:16.129Z","avatar_url":"https://github.com/c8121.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# asset-storage\n\nBasically a DAM-System (Digital Asset Management). Includes a Webserver providing a SPA (Single Page Application) \nto browse the storage content.\n\n\u003e [!NOTE]\n\u003e Work in progress, things might change and be not downward compatible \n\n## Goals\n\n**DAM**: Manage Pictures, Documents...\n\n**Portable**: Runs on Linux, Windows, Mac. No installation required, just copy. Can be copied to a external HD or Stick\nwhich then can be used to store assets from different devices.\n\n**Server included**: Can be used on a NAS for example.\n\n**Deduplication**: Same file is stored automatically only once, no matter how often it was added.\n\n**Resilience**: Files are stored in directories, one per time period, to enable quick backups even on large storages. Meta-Data stored separately in JSON-Format. Database can be recreated from Meta-Data and vice versa.\n\n## Features\n\nStore files into an archive directory\n\n- Deduplicated (same file only once, determined by content-hash).\n- Organized in subdirectories, one per time period. Old directories will no be touched again to enable incremental backups.\n- Meta-data is stored separately and updated when new files are added or existing files with different origin/owner.\n- A database is created to be able to find/browse data.\n- HTTP-Server included for Web\u0026REST-Service.\n- SFTP/SCP/RSYNC-Server included to receive files from remote devices.\n\n## Apps\n\n### add\n\nTo add new files to the archive\n\n    add [-skip-meta] [-check-hash] [-gzip] [-maxmem \u003cbytes\u003e] [-base \u003cdirectory\u003e] [-name \u003cfile-name-pattern\u003e] [-r] \u003cfile or directory\u003e\n\n### spa-server\n\nA HTTP Server which provides a Single-Page-Application to browse the storage\n\n\u003e [!NOTE]\n\u003e This is work in progress, important features like TLS is missing at the moment\n\n    spa-server [-gzip] [-xor \u003ckey\u003e] [-base \u003cdirectory\u003e] [-spa \u003chttp-root-directory of spa-app\u003e] [-listen \u003cip:port\u003e]\n\n### rest-server\n\nA HTTP Server which provides a REST-API to access the storage. This server is included in `spa-server`.\n\n\u003e [!NOTE]\n\u003e This is work in progress, important features like TLS is missing at the moment\n\n    rest-server [-gzip] [-xor \u003ckey\u003e] [-base \u003cdirectory\u003e] [-listen \u003cip:port\u003e]\n\n### metadata-db-create\n\nUpdate meta-data-database by reading all meta-data files and writing contents to database.\n\nNot required if database is intact, because `add` also updates the database.\n\n    metadata-db-create [-base \u003cdirectory\u003e]\n\n### ssh-server\n\nAccept files from remote computers via SFTP, SCP or RSYNC\n\n*Note: This is work in progress, important features at the moment*\n\n    ssh-server [-host-key \u003cfiles\u003e] [-listen \u003cip:port\u003e]\n\n### user-edit\n\nAdd users, set/update passwords. These users will have access to Servers (Web, SFTP, SCP, RSYNC)\n\n    user-edit [-a] -u username\n\nUse `-a` flag to add a new user.\n\n## App Commandline args\n\nCommonly used commandline arguments for asset-storage apps:\n\n| Parameter         | Description                                                                                                                                                                                                                                                                                                                                     |\n|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| base \u003cdir\u0026gt;      | Asset-storage base dir containing all data (file, meta-data, database). Default is `$HOME/asset-storage`                                                                                                                                                                                                                                        |\n| gzip               | Use gzip to compress data.\u003cbr/\u003e **Important:** Cannot be mixed, use always or never for one storage.                                                                                                                                                                                                                                            |\n| maxmem \u003cbytes\u0026gt;  | Max size in bytes when reading files while adding to storage. If a file is larger, it will not be read into memory and a temp-file will be used                                                                                                                                                                                                 |\n| name \u003cpatten\u0026gt;   | Filter files matching file-name-pattern (*.jpeg for example)                                                                                                                                                                                                                                                                                    |\n| skip-meta          | When adding files: Skip updating meta-data if file exists.\n| check-hash         | When adding files: Check content hash before adding. Faster only if most of the files already exists as it only calculates the hash in memory. Slower if most of the files are new because file will be read twice.\n| spa \u003cdir\u0026gt;       | HttpRoot-Directory which contains the SPA-files (HTML, JS, etc) |\n| xor \u003ckey\u0026gt;       | Content will be XOR'ed to obfusicate. This is to avoid manual changes to files (when content is XOR'ed, files cannot be openend and modified directly from storage directory) \u003cbr/\u003e**Important:** Cannot be mixed, use always with same key or never for one storage. \u003cbr/\u003e**Important:** Use same key for all apps with same storage directory |\n| listen \u003cip:port\u0026gt;| IP and Port to listen to (Web-Server, Ssh-Server). |\n\n\n## Libraries used\n\nI have used these libraries (many thanks to the authors)\n\n- SQLite: https://pkg.go.dev/modernc.org/sqlite\n- Web Services: https://pkg.go.dev/github.com/gin-gonic/gin\n- Webp decoding: https://github.com/HugoSmits86/nativewebp\n- Image scaling: https://pkg.go.dev/golang.org/x/image/draw\n- MIME type detection: https://pkg.go.dev/github.com/gabriel-vasile/mimetype\n- Web UI: https://vuejs.org/\n- CSS: https://getbootstrap.com/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fc8121%2Fasset-storage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fc8121%2Fasset-storage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fc8121%2Fasset-storage/lists"}