{"id":20067698,"url":"https://github.com/ae9is/inventory-anything","last_synced_at":"2026-04-10T12:31:15.028Z","repository":{"id":227896135,"uuid":"674531976","full_name":"ae9is/inventory-anything","owner":"ae9is","description":"A flexible document storage / item management system 🚧 Work In Progress 🚧","archived":false,"fork":false,"pushed_at":"2024-07-26T05:49:42.000Z","size":2604,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-02T11:18:12.837Z","etag":null,"topics":["document-storage","dynamodb","inventory-management-system","item-management","nextjs","react","serverless"],"latest_commit_sha":null,"homepage":"https://bit.ly/anything-demo","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ae9is.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":"2023-08-04T07:08:20.000Z","updated_at":"2024-11-08T06:44:16.000Z","dependencies_parsed_at":"2024-11-13T14:03:34.484Z","dependency_job_id":"5f1c56aa-e7bd-4e33-92a3-588c9966b7ea","html_url":"https://github.com/ae9is/inventory-anything","commit_stats":null,"previous_names":["ae9is/anything","ae9is/inventory-anything"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ae9is/inventory-anything","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ae9is%2Finventory-anything","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ae9is%2Finventory-anything/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ae9is%2Finventory-anything/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ae9is%2Finventory-anything/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ae9is","download_url":"https://codeload.github.com/ae9is/inventory-anything/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ae9is%2Finventory-anything/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31642664,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["document-storage","dynamodb","inventory-management-system","item-management","nextjs","react","serverless"],"created_at":"2024-11-13T14:03:04.963Z","updated_at":"2026-04-10T12:31:14.994Z","avatar_url":"https://github.com/ae9is.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# anything\n\nanything is a document storage / item management system designed to be flexible about the underlying data schema.\n\nAnyone with an AWS account can setup a user directory in IAM Identity Center, edit a couple environment variables, and deploy (or remove) the system with one command.\n\nThen users can view data, and import/export spreadsheets via a web app. The system is serverless, with provisioned resources billed per use.\n\n_Please note this is an example app not intended for production. If you want to use the code in a production app under the terms of the AGPL, you'll need to grab a [MUI license](https://mui.com/x/introduction/licensing/) or rework the code to remove x-data-grid-premium._\n\n## Architecture\n\n- Serverless api run by AWS Lambda functions fronted by API gateway.\n- DynamoDB picked for on demand document storage.\n- Almost all infrastructure defined in code, except authorisation provider (IAM Identity Center, currently lacks much CloudFormation support).\n- Client run on Next.js via the experimental app router (but just exported to a static bundle for hosting via an S3 bucket anyways).\n- MUI's x-data-grid powers client data tables. TailwindCSS used for styling with daisyUI on top to simplify basic component styling and add theming support.\n- DynamoDB streams incremental updates to live summary dashboard via Lambda, Kinesis Firehose and Athena.\n\n### C4 Diagrams\n\n1. System context\n\n```mermaid\nC4Context\n  %% title System context\n  Enterprise_Boundary(net, \"Internet\") {\n    System(anything, \"anything\u003cbr\u003eitem management system\", \"Allows users to view, import, and export item data\")\n    Enterprise_Boundary(org, \"Organisation\") {\n      Person(user, \"User\", \"Organisation member with user directory\u003cbr\u003eprivileges to access anything\")\n      SystemDb_Ext(userdir, \"User directory\", \"Stores organisation member info,\u003cbr\u003eincluding which users can access anything\")\n      Person_Ext(admin, \"Admin\", \"Privileges to modify user directory\")\n      System_Ext(inventory, \"Inventories\", \"Physical item inventories\")\n      System_Ext(sheets, \"Spreadsheets\", \"Casual collections of inventory item info,\u003cbr\u003eother document storage\")\n    }\n  }\n  BiRel(user, anything, \"Imports/exports sheets\u003cbr\u003eand queries items\")\n  UpdateRelStyle(user, anything, $offsetY=\"-50\", $offsetX=\"-140\")\n  BiRel(user, inventory, \"Tracks updates\u003cbr\u003eand modifies\")\n  UpdateRelStyle(user, inventory, $offsetY=\"0\", $offsetX=\"-90\")\n  BiRel(user, sheets, \"Creates\u003cbr\u003eand pulls\")\n  UpdateRelStyle(user, sheets, $offsetY=\"0\", $offsetX=\"10\")\n  Rel(admin, userdir, \"Edits\")\n  UpdateRelStyle(admin, userdir, $offsetY=\"10\", $offsetX=\"0\")\n  Rel(anything, userdir, \"Checks user authentication\u003cbr\u003eand authorisation\")\n  UpdateRelStyle(anything, userdir, $offsetY=\"-50\", $offsetX=\"-80\")\n  Rel(userdir, user, \"Sends auth\u003cbr\u003erelated email\")\n  UpdateRelStyle(userdir, user, $offsetY=\"20\", $offsetX=\"-30\")\n  UpdateLayoutConfig($c4ShapeInRow=\"3\", $c4BoundaryInRow=\"1\")\n```\n\n2. Containers\n\n```mermaid\nC4Container\n  %% title Containers\n  Person(user, User, \"Member of user directory\u003cbr\u003ewith privileges to access anything\")\n  System_Ext(userdir, \"User directory\", \"IAM Identity Center, Cognito\")\n  Container_Boundary(anything, \"anything item management system\") {\n    Container(cdn, \"Content delivery network\", \"Cloudfront, S3\", \"Delivers single page app\u003cbr\u003ehosted on S3 bucket to user\u003cbr\u003efrom a nearby edge location\")\n    Container(spa, \"Single page app\", \"Next.js, Typescript, React\", \"Provides item management\u003cbr\u003efunctionality to users\u003cbr\u003evia web browser\")\n    Container(dash, \"Live dashboard\", \"\", \"Real time summary stats\")\n    Container(api, \"API\", \"SAM,\u003cbr\u003eAPI Gateway,\u003cbr\u003eLambda functions\", \"Interface for app to database\u003cbr\u003e\")\n    ContainerDb(database, \"Database\", \"DynamoDB\", \"Stores items,\u003cbr\u003ecollections of items of different types\")\n    Container(athena, \"Queries\", \"Athena\", \"\")\n    Container(stream, \"Transform \u0026 Stream\", \"Lambda to Kinesis Firehose\", \"Pipeline to store DynamoDB streams data\u003cbr\u003einto S3 in analytics-friendly format\")\n    ContainerDb(s3, \"Storage bucket\", \"S3\", \"Stores items\u003cbr\u003efor analytics queries\")\n  }\n  Rel(user, cdn, \"Visits hosting domain\", \"HTTPS\")\n  UpdateRelStyle(user, cdn, $offsetY=\"-50\", $offsetX=\"-130\")\n  Rel(cdn, spa, \"Delivers to\u003cbr\u003euser's browser\")\n  UpdateRelStyle(cdn, spa, $offsetY=\"20\", $offsetX=\"-40\")\n  Rel(user, spa, \"Imports, exports,\u003cbr\u003eand views items\")\n  UpdateRelStyle(user, spa, $offsetY=\"-40\", $offsetX=\"-45\")\n  Rel(spa, dash, \"Displays live\u003cbr\u003edashboard\")\n  Rel(spa, api, \"Calls\", \"async HTTPS\u003cbr\u003e/ JSON\")\n  UpdateRelStyle(spa, api, $offsetY=\"-15\" $offsetX=\"-80\")\n  UpdateRelStyle(spa, dash, $offsetY=\"-25\" $offsetX=\"-30\")\n  Rel(spa, userdir, \"Authenticates\u003cbr\u003eand gets API credentials\")\n  UpdateRelStyle(spa, userdir, $offsetY=\"-50\" $offsetX=\"10\")\n  Rel(api, database, \"Performs CRUD operations\", \"AWS SDK for JS v3,\u003cbr\u003elib-dynamodb\")\n  UpdateRelStyle(api, database, $offsetY=\"45\", $offsetX=\"-40\")\n  UpdateLayoutConfig($c4ShapeInRow=\"3\", $c4BoundaryInRow=\"1\")\n  Rel(database, stream, \"Passes updates\", \"DynamoDB Stream\")\n  UpdateRelStyle(database, stream, $offsetY=\"15\" $offsetX=\"10\")\n  Rel(stream, s3, \"Stores\", \"Lambda,\u003cbr\u003eKinesis Firehose\")\n  UpdateRelStyle(stream, s3, $offsetY=\"15\" $offsetX=\"-40\")\n  Rel(athena, s3, \"Queries\", \"\")\n  UpdateRelStyle(athena, s3, $offsetY=\"10\" $offsetX=\"30\")\n  Rel(dash, athena, \"Queries\", \"\")\n  UpdateRelStyle(dash, athena, $offsetY=\"0\" $offsetX=\"10\")\n```\n\n## Deployment\n\nEdit the environment variables in .env as appropriate and load using [direnv](https://direnv.net/).\n\nRefer to `packages/api/README.md` and `packages/app/README.md` for setting up the serverless api and web app.\n\nNote that the data analytics pipeline and dashboard can't be emulated locally and require cloud deployment of resources.\n\n## Monorepo structure\n\nThis Turborepo includes the following packages and apps:\n\n- `api`: a [Serverless Application Model (SAM)](https://aws.amazon.com/serverless/sam/) api on AWS\n- `app`: a [Next.js](https://nextjs.org/) app using app router\n- `infra`: [Serverless](https://aws.amazon.com/serverless/sam/) infrastructure on AWS, broken into sub-packages\n- `logger`: a small wrapper around console.log\n- `utils`: some shared code between api and app\n- `eslint-config-*`: ESLint configurations\n- `tsconfig`: tsconfig.json's used throughout the monorepo\n- `jest-presets`: Jest config\n\nA submodule `lambda-streams-to-firehose` is also included under `infra/data`. If git didn't fetch it automatically for you, get it using:\n\n```bash\ngit submodule update --init --recursive\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fae9is%2Finventory-anything","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fae9is%2Finventory-anything","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fae9is%2Finventory-anything/lists"}