{"id":49453751,"url":"https://github.com/Strikersoft/poa","last_synced_at":"2026-06-18T22:01:05.089Z","repository":{"id":57137409,"uuid":"104927318","full_name":"Strikersoft/poa","owner":"Strikersoft","description":"Opinionated React framework","archived":false,"fork":false,"pushed_at":"2018-09-21T14:45:04.000Z","size":1475,"stargazers_count":8,"open_issues_count":15,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-28T05:27:41.747Z","etag":null,"topics":["framework","lerna","mobx","opinionated-react-framework","poa","react","react-framework","router"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/Strikersoft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"code-of-conduct.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-09-26T19:13:22.000Z","updated_at":"2020-12-16T20:27:45.000Z","dependencies_parsed_at":"2022-08-22T20:50:16.132Z","dependency_job_id":null,"html_url":"https://github.com/Strikersoft/poa","commit_stats":null,"previous_names":["katsick/poa"],"tags_count":44,"template":false,"template_full_name":null,"purl":"pkg:github/Strikersoft/poa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Strikersoft%2Fpoa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Strikersoft%2Fpoa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Strikersoft%2Fpoa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Strikersoft%2Fpoa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Strikersoft","download_url":"https://codeload.github.com/Strikersoft/poa/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Strikersoft%2Fpoa/sbom","scorecard":{"id":113738,"data":{"date":"2025-08-11","repo":{"name":"github.com/Strikersoft/poa","commit":"c635ef77c5c0a0fbc9ca5476f9d891f2296f6b5f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/10 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 22 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"55 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-hr2v-3952-633q","Warn: Project is vulnerable to: GHSA-ff7x-qrg7-qggm","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-q42p-pg8m-cqh6","Warn: Project is vulnerable to: GHSA-w457-6q6x-cgp9","Warn: Project is vulnerable to: GHSA-62gr-4qp9-h98f","Warn: Project is vulnerable to: GHSA-f52g-6jhx-586p","Warn: Project is vulnerable to: GHSA-2cf5-4w76-r9qv","Warn: Project is vulnerable to: GHSA-3cqr-58rm-57f8","Warn: Project is vulnerable to: GHSA-g9r4-xpmj-mj65","Warn: Project is vulnerable to: GHSA-q2c6-c6pm-g3gh","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-4xc9-xhrj-v574","Warn: Project is vulnerable to: GHSA-x5rq-j2xg-h7qm","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-8hfj-j24r-96c4","Warn: Project is vulnerable to: GHSA-wc69-rhjr-hc9g","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-g4rg-993r-mgx7","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-38fc-wpqx-33j7","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp","Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx","Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-257v-vj4p-3w2h","Warn: Project is vulnerable to: GHSA-2xv3-h762-ccxv","Warn: Project is vulnerable to: GHSA-7r28-3m3f-r2pr","Warn: Project is vulnerable to: GHSA-r8j5-h5cx-65gg","Warn: Project is vulnerable to: GHSA-2pr6-76vf-7546","Warn: Project is vulnerable to: GHSA-8j8c-7jfh-h6hx","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-pp57-mqmh-44h7","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-6g33-f262-xjp4","Warn: Project is vulnerable to: GHSA-gcx4-mw62-g8wm"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-15T20:32:25.309Z","repository_id":57137409,"created_at":"2025-08-15T20:32:25.309Z","updated_at":"2025-08-15T20:32:25.309Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34508867,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"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":["framework","lerna","mobx","opinionated-react-framework","poa","react","react-framework","router"],"created_at":"2026-04-30T04:01:03.704Z","updated_at":"2026-06-18T22:01:05.082Z","avatar_url":"https://github.com/Strikersoft.png","language":"TypeScript","funding_links":[],"categories":["📦 Legacy \u0026 Inactive Projects"],"sub_categories":[],"readme":"# Poa framework\n\n[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)\n[![lerna](https://img.shields.io/badge/maintained%20with-lerna-cc00ff.svg)](https://lernajs.io/)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Strikersoft/poa/master/images/ic-logo-big.png\"\u003e\n\u003c/p\u003e\n\n## Gettings started\n\n### Install\n\n```bash\n  yarn add react @poa/core\n```\n\n### Opinionated\n\nPoa — opinionated React framework.\n\nWhat does opinionated mean?\n\n* Framework will not suit for every case\n* It has unique vision on how things should work\n* #0CJS\n* We hame some opinions on how things should work ;)\n\nSince it is a framework, not a library, it bundled with all needed stuff to create small, medium and large projects.\n\n### Getting started\n\nWe are assuming that you're using some official [starter kit](https://reactjs.org/community/starter-kits.html) (though it should work with custom setup as well).\n\nTLDR; [https://codesandbox.io/s/yzzqk57lx](https://codesandbox.io/s/yzzqk57lx)\n\n#### Basics\n\nInitialize the Poa:\n\n```js\n// index.js\n\nimport { boot } from '@poa/core';\n\nboot();\n```\n\nIt should open a dummy Poa screen.\n\n#### Adding some routes\n\nLet's add React component first;\n\n```js\n// src/pages/home.page.js\n\nimport React from 'react';\nimport { Component } from '@poa/core';\n\nclass HomePage extends React.Component {\n  render() {\n    return \u003cp\u003eHeelo!\u003c/p\u003e;\n  }\n}\n\nexport default Component(/* additional config */)(HomePage);\n```\n\nThen let's declare our routing!\n\n```js\n// src/routes.js\n\nimport HomePage from './pages/home.page';\n\nexport const routes = [\n  {\n    path: '',\n    redirectTo: '/home'\n  },\n  {\n    path: '/home',\n    component: HomePage\n  }\n];\n```\n\nNote, that we are using `redirectTo` functionality from mobx-little-route. (TODO: describe the Poa routing API)\n\nThe last thing, add your routes to Poa boot\n\n```js\nimport { boot } from '@poa/core';\nimport { routes } from './routes';\n\nboot({ router: { routes } });\n```\n\nOkay. Now on screen you will see you `HomePage` component and `/home` route;\n\n#### Add localization\n\nLet's define our locales first\n\n```js\n// src/locales/en.js\n\nexport const en = {\n  helloScreen: {\n    helloMessage: 'Jumbo jumbo!'\n  }\n};\n```\n\nThen let's update our component\n\n```js\n// src/pages/home.page.js\n\nimport React from 'react';\nimport { Component } from '@poa/core';\n\nclass HomePage extends React.Component {\n  t; // injected by Poa\n\n  render() {\n    return \u003cp\u003e{this.t('helloMessage')}\u003c/p\u003e;\n  }\n}\n\nexport default Component({ namespaces: ['homeScreen'] })(HomePage);\n```\n\nNotice that we using `this.t(...)`. Poa gently inject translation function to your components if you use enhancer `Component(config)(ReactComponent)`\n\nAlso, we pass `namespaces` in the `Component({ namespaces: ['homeScreen'] })(HomePage)` poa component enhancer.\n\nAfter this, pass localization into i18n config.\n\n```js\n// src/index.js\n\nimport { boot } from '@poa/core';\nimport { routes } from './routes';\n\nimport { en } from './locales/en';\n\nboot({\n  router: { routes },\n  i18n: { lng: 'en', resources: { en } }\n});\n```\n\nNotice, that in i18n you can pass any additional config that is supported by [i18next](https://www.i18next.com). We just wrap it API (TODO: describe the Poa internationalization API)\n\n#### Add state managment\n\nLet's add moar complexity.\nAdd initial state of your application.\n\n```js\n// src/stores/hello.state.js\n\nexport const initialState = {\n  dunnoState: false\n};\n```\n\nAdd some actions!\n\n```js\n// src/stores/hello.actions.js\n\nimport { createAction, addMutator, addSideEffects } from '@poa/state';\n\n// action that can be dispatched with just functino invoking\nexport const dunnoAction = createAction('dunno', newValue =\u003e ({ newValue }));\n\n// the only place where data can be changed\naddMutator(dunnoAction, (payload, { store }) =\u003e {\n  store.dunnoState = payload.newValue;\n});\n\n// any side-effects\naddSideEffects(dunnoAction, async (payload, { store }) =\u003e {\n  console.log('new store', store);\n});\n```\n\nAdd actions to our component\n\n```js\nimport React from 'react';\nimport { Component } from '@poa/core';\n\nclass HomePage extends React.Component {\n  t; // injected by Poa\n  store; // injected by Poa\n  actions; // injected by Poa\n\n  handleClick = () =\u003e {\n    this.actions.dunnoAction(true);\n  };\n\n  render() {\n    return (\n      \u003cp\u003e\n        {this.t('helloMessage')}\n        \u003cbr /\u003e\n        {this.store.dunnoState ? 'Poa!' : null}\n        \u003cbutton onClick={this.handleClick}\u003eDo jumbo!\u003c/button\u003e\n      \u003c/p\u003e\n    );\n  }\n}\n\nexport default Component({ namespaces: ['homeScreen'] })(HomePage);\n```\n\nNotice that `store` and `actions` are injected gently by Poa.\n\nAnd the last step, update our boot configuration!\n\n```js\nimport { boot } from '@poa/core';\n\nimport { routes } from './routes';\nimport { en } from './locales/en';\n\nimport { initialState } from './store/hello.state';\nimport * as actions from './store/hello.actions';\n\nboot({\n    // routing configuration\n    router: { routes },\n\n    // localization configuration\n    i18n: {\n      lng: 'en',\n      resources: { en }\n    },\n\n    // state managment configuration\n    state: {\n      initial: initialState,\n      actions: actions\n    }\n  });\n}\n```\n\nNow, when you click on \"Do jumbo!\" it should dispatch the action, than this action will go throught mutator and after that, side affects are triggered. After that your component will re-render automatically!\n\nIn Poa we use custom version of satcheljs. But for core principles you can check (https://github.com/Microsoft/satcheljs)[https://github.com/Microsoft/satcheljs]\n\n// TODO: describe Poa internal state management\n\n### DI\n\nYou can pass additional `env` can, and it will be injected to your components and side effects\n\n```js\n// src/index.js\nimport { boot } from '@poa/core';\n\nimport { routes } from './routes';\nimport { en } from './locales/en';\n\nimport { initialState } from './store/hello.state';\nimport * as actions from './store/hello.actions';\n\nboot({\n    router: { routes },\n    i18n: {\n      lng: 'en',\n      resources: { en }\n    },\n    state: {\n      initial: initialState,\n      actions: actions\n    },\n\n    // environment confugiration\n    env: {\n      http: fetch.bind(window)\n    }\n  });\n}\n```\n\nSo now, you can do the following\n\n```js\n// src/stores/hello.actions.js\n\nimport { createAction, addMutator, addSideEffects } from '@poa/state';\n\nexport const dunnoAction = createAction('dunno', newValue =\u003e ({ newValue }));\n\naddMutator(dunnoAction, (payload, { store }) =\u003e {\n  store.dunnoState = payload.newValue;\n});\n\naddSideEffects(dunnoAction, async (payload, { store, env }) =\u003e {\n  // here is your injected env!\n  await env.http('/users');\n});\n```\n\n### Notice on actions injection in addSideEffects\n\nIf you need to invoke another actions from sideEffects (you definetly need it), they are injected!\n\n```js\n// src/stores/hello.actions.js\n\nimport { createAction, addMutator, addSideEffects } from '@poa/state';\n\nexport const dunnoAction = createAction('dunno', newValue =\u003e ({ newValue }));\n\nexport const dunnoActionSuccess = createAction('dunnoSuccess', () =\u003e ({}));\n\naddMutator(dunnoAction, (payload, { store }) =\u003e {\n  store.dunnoState = payload.newValue;\n});\n\naddSideEffects(dunnoAction, async (payload, { store, env, actions }) =\u003e {\n  await env.http('/users');\n\n  // here is your actions!\n  actions.dunnoActionSuccess();\n});\n```\n\nThis is needed, when you need to access your actions from another module to avoid circular imports.\n\n### Notice on async actions\n\nTo avoid doing like\n\n```js\naddSideEffects(dunnoAction, async (payload, { store, env, actions }) =\u003e {\n  try {\n    // start action sets isLoading=true\n    actions.dunnoActionStart();\n\n    // fetch data\n    await env.http('/users');\n\n    // success action sets isLoadgin=false\n    actions.dunnoActionSuccess();\n  } catch (e) {\n    // failed action isLoadgin=false isError=true\n    actions.dunnoActionFailed();\n  }\n});\n```\n\nYou can `await` on action! We make sure that all side affects are resolved.\n\n```js\n...\nasync handleClick() {\n  this.setState({ isLoading: true });\n  this.actions.dunnoAction();\n  this.setState({ isLoading: false });\n}\n...\n```\n\n### Documentation website\n\nUnder construction.\n\n### Tech used that to make it possible\n\nRuntime:\n\n* react\n* react-dom\n* mobx\n* mobx-react\n* mobx-little-router\n* mobx-little-router-react\n* satcheljs\n* i18next\n\nBuild:\n\n* lerna\n* microbundle\n* parcel\n\nCode:\n\n* prettier\n\n### TODO\n\n* [ ] i18next .use()\n* [ ] export all mobx stuff\n* [ ] HTTP Client\n\nFuture:\n\n* [ ] CLI for project setup / create boilerplate code\n* [ ] Isomorphic support\n* [ ] React Native support\n\n```\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FStrikersoft%2Fpoa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FStrikersoft%2Fpoa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FStrikersoft%2Fpoa/lists"}