{"ref":"artifact:miyasuta-cap-redis","page":"/artifacts/miyasuta-cap-redis","json":"/artifacts/miyasuta-cap-redis.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"miyasuta-cap-redis","name":"cap-redis","artifact_type":"sample","ecosystem":"cap","domain":"operations-and-runtime","secondary_domains":["ui-and-frontend-bridge"],"origin_ring":"independent","description":{"one_line":"A sample that holds the approuter's session, CSRF token included, in a bound instance of [Redis on SAP BTP, hyperscaler option](artifact:btp-redis) instead of the approuter's own memory, around a CAP and Fiori elements app.","short":"Approuter session held in a bound Redis cache instance","what_it_solves":"The `approuter.nodejs` module sets `EXT_SESSION_MGT` to an object naming `instanceName: cap-redis-redis` and `storageType: redis`, with a `defaultRetryTimeout` of 10000 and a `backOffMultiplier` of 10, adds `SVC2AR_STORE_CSRF_IN_EXTERNAL_SESSION: true`, and requires the `cap-redis-redis` resource: an instance of [Redis on SAP BTP, hyperscaler option](artifact:btp-redis) on the `trial` plan with `engine_version: \"6.0\"` and `eviction_policy: noeviction`. Around that session sits the ordinary shape it belongs to, a CAP service on a HANA HDI container, a Fiori elements app deployed to the [SAP HTML5 Application Repository service for SAP BTP](artifact:btp-html5-application-repository) and served through the same approuter, xsuaa, and a destination to `https://ui5.sap.com`. `decode_redis_data.sh` in the repository root base64-decodes, gunzips and pretty-prints a value pasted into the script, which is how to read what landed in the cache. The README is the CAP scaffold's own, and the repository description, \"Approuter + Redis\", is what names the subject.","when_not_to_use":"Not a descriptor to deploy as it stands: the approuter's `sessionSecret` is written out in `mta.yaml`."},"links":{"repo":"https://github.com/miyasuta/cap-redis"},"compat":{"runtimes":["node"],"deployment":["cf"]},"demonstrates":["capability:deployment","capability:app-hosting"],"requires":[{"ref":"artifact:btp-redis","for":"The approuter's external session store: the descriptor binds a redis-cache instance and names it as the store in the router's own configuration.","sources":[{"url":"https://raw.githubusercontent.com/miyasuta/cap-redis/main/mta.yaml","title":"miyasuta/cap-redis — mta.yaml","checked":"2026-10-15","quote":"\"instanceName\": \"cap-redis-redis\",\n        \"storageType\": \"redis\","},{"url":"https://raw.githubusercontent.com/miyasuta/cap-redis/main/mta.yaml","title":"miyasuta/cap-redis — mta.yaml, resources","checked":"2026-10-15","quote":"- name: cap-redis-redis\n  type: org.cloudfoundry.managed-service\n  parameters:\n    config:\n      engine_version: \"6.0\"\n      eviction_policy: noeviction\n    service: redis-cache\n    service-plan: trial"}]},{"ref":"artifact:sap-approuter","for":"The session being stored is the approuter's own, and the deployment includes the router module that holds the configuration.","sources":[{"url":"https://raw.githubusercontent.com/miyasuta/cap-redis/main/mta.yaml","title":"miyasuta/cap-redis — mta.yaml","checked":"2026-10-15","quote":"- name: cap-redis\n  type: approuter.nodejs\n  path: app/router"}]},{"ref":"artifact:btp-html5-application-repository","for":"The Fiori elements app is uploaded to an app-host instance and served from the app-runtime plan through the same approuter.","sources":[{"url":"https://raw.githubusercontent.com/miyasuta/cap-redis/main/mta.yaml","title":"miyasuta/cap-redis — mta.yaml, resources","checked":"2026-10-15","quote":"- name: cap-redis-repo-host\n  type: org.cloudfoundry.managed-service\n  parameters:\n    service: html5-apps-repo\n    service-name: cap-redis-html5-srv\n    service-plan: app-host"}]}],"maintainers":["actor:mio-yasutake"],"contributors":["actor:mio-yasutake"],"use_as":"reference","provenance":{"discovered_via":[{"source":"source:github","channel":"miyasuta"}],"first_seen":"2026-10-15"},"drafted_with_ai":true},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"fair","evidence":"one contributor, personally owned"},{"label":"Repository","tier":"poor","evidence":"pushed 2024-05, not archived"}],"compatibility":[{"label":"Declared for","tier":"fair","evidence":"nothing declared"},{"label":"Survived majors","tier":"unknown","evidence":"no release dates"},{"label":"Maintainer's CI","tier":"fair","evidence":"no CI configured"}],"practice":[{"label":"Tests","tier":"good","evidence":"8 test files"},{"label":"Docs","tier":"poor","evidence":"README 1 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":0,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-25","npm":"not published under this name","stars":0,"forks":0,"open_issues":0,"archived":false,"pushed_at":"2024-05-23","license_spdx":null,"org_owned":false,"default_branch":"main","created_at":"2024-05-20T21:04:40Z","open_prs":0,"tree_truncated":false,"test_files":8,"workflows":0,"other_ci":false,"readme_bytes":674,"docs_files":0,"changelog":false,"license_file":false,"dts_files":0,"first_commit":"2024-05-20","last_commit":"2024-05-23","commits":3,"contributors":1,"readme_path":"README.md","readme_sha":"dbac29eb1594d1dd9e9cd90a11879f1495caa4b6","repo_read":"2026-10-25"},"edges":{"maintainers":[{"ref":"actor:mio-yasutake","name":"Mio Yasutake","json":"/actors/mio-yasutake.json"}],"contributors":[{"ref":"actor:mio-yasutake","name":"Mio Yasutake","json":"/actors/mio-yasutake.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}