{"id":15417287,"url":"https://github.com/ampatspell/index65","last_synced_at":"2026-04-19T14:34:05.594Z","repository":{"id":95246107,"uuid":"132261060","full_name":"ampatspell/index65","owner":"ampatspell","description":"Scanned negatives publishing app","archived":false,"fork":false,"pushed_at":"2018-06-08T21:11:10.000Z","size":4305,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-28T03:41:35.669Z","etag":null,"topics":["archive","emberjs","firebase","firestore","organizer","pictures","publishing"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/ampatspell.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}},"created_at":"2018-05-05T15:36:22.000Z","updated_at":"2018-06-08T21:11:11.000Z","dependencies_parsed_at":"2023-06-04T02:15:30.775Z","dependency_job_id":null,"html_url":"https://github.com/ampatspell/index65","commit_stats":{"total_commits":195,"total_committers":2,"mean_commits":97.5,"dds":0.00512820512820511,"last_synced_commit":"aeeea6ef21b9a39274bb3741841198ae265ee6b3"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/ampatspell/index65","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ampatspell%2Findex65","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ampatspell%2Findex65/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ampatspell%2Findex65/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ampatspell%2Findex65/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ampatspell","download_url":"https://codeload.github.com/ampatspell/index65/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ampatspell%2Findex65/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261374414,"owners_count":23148977,"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":["archive","emberjs","firebase","firestore","organizer","pictures","publishing"],"created_at":"2024-10-01T17:15:10.067Z","updated_at":"2025-09-26T14:39:43.789Z","avatar_url":"https://github.com/ampatspell.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# index65\n\nScanned negatives publishing app.\n\n\u003e [Ember.js](https://emberjs.com/) \u0026 [Firebase](https://firebase.google.com/) using [ember-cli-zuglet](https://github.com/ampatspell/ember-cli-zuglet). A reimplementation of my [CouchDB-based index65](https://bitbucket.org/ampatspell/index65/src/default/).\n\n\u003e [Demo site](https://index65-dev.firebaseapp.com) Use `zeeba@gmail.com` / `hello-world` to sign-in (read-only member)\n\n![](https://raw.githubusercontent.com/ampatspell/index65/master/docs/screenshot-2.png)\n\n![](https://raw.githubusercontent.com/ampatspell/index65/master/docs/screenshot-1.png)\n\n## Installation\n\n### Firebase\n\n* Create a firebase project\n* Enable Storage\n* Enable Firestore in Database section\n* Authentication → Sign-in Method → Enable Email/Password\n\n### Configuration\n\n* Copy `config-example.js` as `config.js`\n* Go to Firebase console and select Project Overview → \"Add Firebase to your webapp\", copy config.\n* Paste it in your `config.js` `production` object, the same way it is done in `config-example.js`\n* Delete `messagingSenderId`\n\n### Firebase \u0026 Ember\n\nInstall [Node.js](https://nodejs.org/en/) (LTS or Latest, doesn't matter, both works just fine).\n\nInstall app dependencies:\n\n```\n$ npm install\n```\n\nInstall firebase functions dependencies:\n\n```\n$ cd firebase/functions\n$ npm install\n```\n\nInstall firebase cli:\n\n```\n$ npm install -g firebase-tools\n```\n\nSelect your firebase project:\n\n```\n$ firebase use --add\n```\n\nBuild ember app and deploy it along with firebase functions, security rules:\n\n```\nnpm run deploy\n```\n\n### Sign-up\n\n* Open `https://\u003capp-id\u003e.firebaseapp.com/session/sign-up`\n* Email, password, sign-up\n\nBy default none of the signed up users are allowed to access anything in the app.\n\n### Make yourself an admin\n\n* Open Firebase Console → Database → users → uid\n* Add \"admin\" in roles array\n* Go back to the index65, you should be an admin now.\n\nAnd you're done.\n\n### Connect domain (optional)\n\n* In Firebase Console select Hosting\n* Connect Domain\n* Follow the steps\n\n### Add billing (optional)\n\n* In Firebase console bottom left there is \"Spark\" and \"Upgrade\"\n* Click\n* Select \"Blaze\", Purchase\n\nTo set daily spending limit:\n\n* Open Google AppEngine Settings: `https://console.cloud.google.com/appengine/settings`\n* Select your Firebase project\n* Under application settings, click \"Edit\"\n* Set daily spending (0 or more)\n\n## Content\n\n* login as admin\n* add source\n* add collection\n* upload pictures\n\nPictures has the following expected file name format:\n\n```\nprefix-\u003cgroup_id\u003e-\u003cimage_id\u003e.jpg\n\nvaldis-001-001.jpg\nvaldis-001-002.jpg\nvaldis-001-003.jpg\n...\nvaldis-130-036.jpg\nvaldis-130-037.jpg\n```\n\n## Notes\n\n### Schema\n\n```\n/users/{uid}\n  email: string\n  displayName: string\n  createdAt: date\n  roles: Array\u003cString\u003e\n\n/sources/{source}\n  name: string\n\n  /collections/{collection}\n    name: string\n\n    /groups/{group}\n      identifier: number\n\n        /images/{image}\n          identifier: number\n          storage: {\n            original: {\n              size : {\n                width: number\n                height: number\n              }\n              url: string\n            },\n            200x200: {\n              size: {\n                width: number,\n                height: number\n              },\n              url: string\n            }\n            1024x1024: {\n              size: {\n                width: number,\n                height: number\n              },\n              url: string\n            }\n          }\n```\n\n```\n/images/{source}/{collection}/{group}/{image}\n  * original\n  * 1024 (jpeg)\n  * 200 (jpeg)\n```\n\n## TODO\n\n* Group description, year, picture\n* Allow selected members to edit selected sources\n* Allow members to edit their `displayName`\n* Delete group with images\n* Delete collection including groups\n* Delete source including all nested docs\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fampatspell%2Findex65","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fampatspell%2Findex65","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fampatspell%2Findex65/lists"}