{"id":19139737,"url":"https://github.com/trolit/itvault","last_synced_at":"2026-04-09T02:02:28.445Z","repository":{"id":230023499,"uuid":"535708105","full_name":"trolit/itvault","owner":"trolit","description":"Web application designed to store source code intelligence and provide option to extract it on demand. ","archived":false,"fork":false,"pushed_at":"2024-05-17T21:49:40.000Z","size":32012,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2025-08-03T10:14:44.756Z","etag":null,"topics":["express","express-js","localstack-s3","node-js","nodejs","typeorm","typeorm-extension","typescript","vue3","web-application"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":false,"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/trolit.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":"2022-09-12T14:32:04.000Z","updated_at":"2024-05-17T19:10:30.000Z","dependencies_parsed_at":"2024-05-16T06:14:29.742Z","dependency_job_id":"dd9179b6-812f-4847-98aa-0b3271ee3a54","html_url":"https://github.com/trolit/itvault","commit_stats":null,"previous_names":["trolit/itvault"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/trolit/itvault","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trolit%2Fitvault","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trolit%2Fitvault/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trolit%2Fitvault/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trolit%2Fitvault/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trolit","download_url":"https://codeload.github.com/trolit/itvault/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trolit%2Fitvault/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31581864,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"online","status_checked_at":"2026-04-09T02:00:06.848Z","response_time":112,"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":["express","express-js","localstack-s3","node-js","nodejs","typeorm","typeorm-extension","typescript","vue3","web-application"],"created_at":"2024-11-09T07:14:52.930Z","updated_at":"2026-04-09T02:02:28.429Z","avatar_url":"https://github.com/trolit.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cem\u003e\nMemory is the mother of all wisdom.\u003cbr/\u003e\n-Aeschylus\n\u003c/em\u003e\n\n\u003cbr/\u003e\n\u003cbr/\u003e\n\nitvault is designed to:\n\n1. Keep what each part of code is used for.\n2. Extract selected parts on demand (with maintained files structure).\n\n\u003cdetails\u003e\n\u003csummary\u003eQuick introduction\u003c/summary\u003e\n\nApp relies on simple mechanism - coloring files content. After uploading project files, permitted user(s) create **blueprints** - abstract elements to group code. Then user(s) with appropriate permission can use them to mark code:\n\n|                                                                                                          |                                                                                                          |\n| :------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------: |\n| \u003cimg src=\"https://github.com/trolit/itvault/blob/media/1.png\" alt=\"file colored with Group1 blueprint\"/\u003e | \u003cimg src=\"https://github.com/trolit/itvault/blob/media/2.png\" alt=\"file colored with Group2 blueprint\"/\u003e |\n|                             `formatDate.ts` colored with `Group1` blueprint                              |                             `formatDate.ts` colored with `Group2` blueprint                              |\n\nUsers with access to these workspaces (= projects) can also obtain permission to generate bundles - extracts of project consisting only of selected parts (with maintained hierarchy). Result of generating bundle with blueprints: `Group1` and `Group2`:\n\n\u003cimg src=\"https://github.com/trolit/itvault/blob/media/4.png\" alt=\"file content in generated bundle\" /\u003e\n\n\u003c/details\u003e\n\n\u003cbr/\u003e\n\n\u003e For short demonstration of coloring \u0026 features extraction, refer to [youtube video](https://www.youtube.com/watch?v=aJ9LEZ9TF4k)\n\n\u003e Please note that although app is in advanced stage (spent 1+ year), it's not complete solution. If you would like to use it (or it's parts), I'd recommend to only take backend as Vue's Composition API was taken to experiment with new approach and it still needs big refactoring. PS: I see potential in Comp API - after working out with form submit - but still prefer Options API as it requires less refactoring to achieve something fancy (at least from my POV).\n\n## Stack\n\n\u003cdetails\u003e\n\u003csummary\u003eBackend\u003c/summary\u003e\n\n- TypeScript: 4.9\n- Node: v18.17\n- Web framework: Express.js\n- ORM framework: TypeORM\n- Logger: winston\n- DI: tsyringe\n- Tests: Mocha (nyc, chai, sinon, supertest, testcontainers)\n- File storage: local or AWS S3 (simulated with LocalStack)\n- Secondary DB (store for sessions/roles): Redis\n- Queues: RabbitMQ\n- Schema validation: yup\n- Client-Server real-time communication: Engine.io\n- Mailing: mustache (renderer), nodemailer (sender), maildev (local testing)\n- Authentication: currently hybrid, half on server (Redis), half on client (JWT)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n\u003csummary\u003eFrontend\u003c/summary\u003e\n\n- TypeScript: 4.7\n- Framework: Vue 3 (experimenting with Composition API)\n- State management: Pinia\n- Components library: Naive UI\n- Forms library: vee-validate (+yup)\n- Charts library: apexcharts\n- CSS: PostCSS\n- E2E tests: Cypress\n\n\u003c/details\u003e\n\n## Running\n\n\u003cdetails\u003e\n\u003csummary\u003eDevelopment\u003c/summary\u003e\n\n1.  Install dependencies (`npm install`).\n2.  Create `.env` files from `.env.example`.\n3.  Initialize docker containers from `backend` dir.\n\n    ```sh\n    npm run dc:dev:start\n    ```\n\n4.  Prepare database (migrations, seeders).\n\n    ```sh\n    npm run db:setup\n    ```\n\n5.  Start backend.\n\n    ```sh\n    npm run dev\n    ```\n\n    \\*To handle bundle generation \u0026 mail sending, run queues:\n\n    ```sh\n    npm run queues:dev\n    ```\n\n6.  Start frontend.\n\n    ```sh\n    npm run dev\n    ```\n\n    ```sh\n    # Super user (all permissions)\n    email: head.admin@itvault.dev\n    password: 1234\n\n    # Member\n    email: member@itvault.dev\n    password: 1234\n    ```\n\nNote that default setup uses local files storage. To check out AWS S3 (through LocalStack):\n\n1. Stop backend.\n2. Set `FILES_STORAGE_MODE` env variable to `aws`.\n3. Start LocalStack.\n\n   ```sh\n   npm run dc:localstack:start\n   ```\n\n4. Get `awslocal` tool and setup bucket (check [README](./backend/README.md)).\n5. Start backend (`npm run dev`).\n6. Upload some files to see effect:\n\n```\nawslocal s3api list-objects --bucket itvault-bucket\n{\n    \"Contents\": [\n        {\n            \"Key\": \"workspace-6/b6a66d7d95ad9b2b585dc0700.txt\",\n            \"LastModified\": \"2024-03-22T10:40:19.000Z\",\n            \"ETag\": \"\\\"02003d02d9dab50aead91ee0ddad97ed\\\"\",\n            \"Size\": 710,\n            \"StorageClass\": \"STANDARD\",\n            \"Owner\": {\n                \"DisplayName\": \"webfile\",\n                \"ID\": \"75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a\"\n            }\n        }\n    ],\n    \"RequestCharged\": null\n}\n```\n\nDisclaimers:\n\n- Files created through seeders won't be reachable.\n- When running free version of LocalStack, data is not persistent.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eProduction\u003c/summary\u003e\n\n1. Initialize docker containers from `backend` dir.\n\n   ```sh\n   npm run dc:prod:start\n   ```\n\n2. Set `NODE_ENV` to `production` in `backend`.\n3. Prepare database (migrations, seeders).\n\n   ```sh\n   npm run db:setup\n   ```\n\n4. Create super user account manually or create [production](./backend/src/db/seeds/production/) seeder.\n\n5. Start backend.\n\n   ```sh\n   npm run prod\n   ```\n\n   \\*To handle bundle generation \u0026 mail sending, run queues:\n\n   ```sh\n   npm run queues:prod\n   ```\n\n\u003c/details\u003e\n\n## Testing\n\n\u003cdetails\u003e\n\u003csummary\u003eUnit tests\u003c/summary\u003e\n\n```sh\nnpm run test:unit\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eIntegration tests\u003c/summary\u003e\n\n```sh\n# NODE_ENV=test\nnpm run testcontainers:up\nnpm run test:integration\nnpm run testcontainers:down\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eE2E tests\u003c/summary\u003e\n\n```sh\n# 1. Setup\n# (backend)\n# NODE_ENV=test\nnpm run testcontainers:up\nnpm run db:setup\n\n# (frontend)\nnpm run build # or build-only\n\n# 2. Run\nnpm run test:e2e\n\n# 3. Clean up\nnpm run testcontainers:down\n```\n\n\u003c/details\u003e\n\n## Features\n\n- store files locally or in cloud\n- [role] - [permission] granular access system\n- global chat with configurable depth\n- mail system with mustache and nodemailer\n- hybrid API versioning (branch ✅, query ✅, leaf ⛔)\n- real-time client-server communication with Engine.io\n- workspace insights\n- strong typing (e.g. schema \u003c-\u003e controller relation)\n\nPlus sessions management, seeders (via typeorm-extension), hybrid authentication - half on client (JWT), half on server (Redis)\n\n## To consider/To do\n\n- rework all \"ids\" to UUID not only to improve security but simplify integration tests\n- create modular variant of project\n- ability to preview users of specific role\n- mobile variant of client\n- create separate app for management (admin)\n- finish real-time communication events\n- listen to release pull requests (develop -\u003e main) and then create new variants according to PR data\n- check if there is option to train AI of workspace code to determine which parts refer to which blueprint\n- ability to edit file content while maintaining colorings structure at the same time\n- ability to preview few lines of version when reviewing files for Bundle generation\n- job that removes files if they do not have entry in database\n- monitor status of each endpoint\n- define \"parent\" permission (can't update children permissions if parent is disabled)\n- Workspace - Files tab - rename/delete directory\n- Workspace - Files tab - icons matching file extension\n\n## Relevant posts\n\n- Granular permissions (TODO)\n- Hybrid API versioning (TODO)\n- TypeORM or something different (TODO)\n- Integration tests \"Probata\" API (TODO)\n- [Composition API - try or not to try](https://trolit.github.io/posts/vue-x-composition-api-try-or-not-to-try)\n- [Client-server communication using Engine.io](https://trolit.github.io/posts/realtime-client-server-communication-using-engineio)\n\n## Links\n\n- https://vuejs.org/api/sfc-script-setup.html\n- [Node.js x TypeScript target mapping](https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping)\n- [Customize Vite config](https://vitejs.dev/config/)\n- alternative to \"module-alias\" (taken from [Kehrlann](https://github.com/Kehrlann/module-alias-74))\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrolit%2Fitvault","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrolit%2Fitvault","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrolit%2Fitvault/lists"}