{"id":28764959,"url":"https://github.com/klen/muffin-admin","last_synced_at":"2026-03-08T01:09:47.749Z","repository":{"id":30734939,"uuid":"34291282","full_name":"klen/muffin-admin","owner":"klen","description":"Admin interface for Muffin Framework","archived":false,"fork":false,"pushed_at":"2026-02-13T04:09:59.000Z","size":6462,"stargazers_count":18,"open_issues_count":7,"forks_count":2,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2026-02-13T05:48:24.615Z","etag":null,"topics":["admin-dashboard","asyncio","muffin","trio"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/klen.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":".github/contributing.md","funding":null,"license":null,"code_of_conduct":".github/code_of_conduct.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/codeowners","security":".github/security.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2015-04-20T23:04:00.000Z","updated_at":"2026-02-12T23:33:49.000Z","dependencies_parsed_at":"2024-06-14T08:30:27.310Z","dependency_job_id":"47c8fdb3-2007-4c21-8fbc-79c194efe5df","html_url":"https://github.com/klen/muffin-admin","commit_stats":{"total_commits":382,"total_committers":3,"mean_commits":"127.33333333333333","dds":0.03664921465968585,"last_synced_commit":"fc69a10a5a4a03465890918502bd9f669d865dbc"},"previous_names":[],"tags_count":396,"template":false,"template_full_name":null,"purl":"pkg:github/klen/muffin-admin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klen%2Fmuffin-admin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klen%2Fmuffin-admin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klen%2Fmuffin-admin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klen%2Fmuffin-admin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/klen","download_url":"https://codeload.github.com/klen/muffin-admin/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klen%2Fmuffin-admin/sbom","scorecard":{"id":563332,"data":{"date":"2025-08-11","repo":{"name":"github.com/klen/muffin-admin","commit":"6491f620572b1f56333fa77e58ad44b63c11f872"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.1,"checks":[{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/tests.yml:1","Info: no jobLevel write permissions found"],"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":"Security-Policy","score":9,"reason":"security policy file detected","details":["Info: security policy file detected: .github/security.md:1","Info: Found linked content: .github/security.md:1","Warn: One or no descriptive hints of disclosure, vulnerability, and/or timelines in security policy","Info: Found text in security policy: .github/security.md:1"],"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":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/klen/muffin-admin/release.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/klen/muffin-admin/release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/klen/muffin-admin/release.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/klen/muffin-admin/tests.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tests.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/klen/muffin-admin/tests.yml/develop?enable=pin","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"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":"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":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'develop'"],"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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yml:10"],"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":"Vulnerabilities","score":0,"reason":"17 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-4www-5p9h-95mh","Warn: Project is vulnerable to: GHSA-9gqv-wp59-fq42","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-4vvj-4cpr-p986","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h"],"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-20T14:16:37.551Z","repository_id":30734939,"created_at":"2025-08-20T14:16:37.551Z","updated_at":"2025-08-20T14:16:37.551Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30240413,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T00:58:18.660Z","status":"ssl_error","status_checked_at":"2026-03-08T00:55:48.608Z","response_time":53,"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":["admin-dashboard","asyncio","muffin","trio"],"created_at":"2025-06-17T10:13:07.503Z","updated_at":"2026-03-08T01:09:47.741Z","avatar_url":"https://github.com/klen.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Muffin-Admin\n#############\n\n.. _description:\n\n**Muffin-Admin** -- an extension to Muffin_ that implements admin-interfaces\n\n.. _badges:\n\n.. image:: https://github.com/klen/muffin-admin/workflows/tests/badge.svg\n    :target: https://github.com/klen/muffin-admin/actions\n    :alt: Tests Status\n\n.. image:: https://img.shields.io/pypi/v/muffin-admin\n    :target: https://pypi.org/project/muffin-admin/\n    :alt: PYPI Version\n\n.. image:: https://img.shields.io/pypi/pyversions/muffin-admin\n    :target: https://pypi.org/project/muffin-admin/\n    :alt: Python Versions\n\n----------\n\n.. image:: https://raw.github.com/klen/muffin-admin/develop/.github/muffin-admin.png\n   :height: 200px\n\n.. _features:\n\nFeatures\n--------\n\n- Support for `Peewee ORM`_, Mongo_, `SQLAlchemy Core`_ through `Muffin-Rest`_;\n- Automatic filtering and sorting for items;\n\n.. _contents:\n\n.. contents::\n\n.. _requirements:\n\nRequirements\n=============\n\n- python \u003e= 3.9\n\n.. _installation:\n\nInstallation\n=============\n\n**Muffin-Admin** should be installed using pip: ::\n\n    pip install muffin-admin\n\nWith `SQLAlchemy Core`_ support: ::\n\n    pip install muffin-admin[sqlalchemy]\n\nWith `Peewee ORM`_ support: ::\n\n    pip install muffin-admin[peewee]\n\n.. _usage:\n\nUsage\n=====\n\nInitialize the admin:\n\n.. code-block:: python\n\n   from muffin_admin import Plugin\n\n   admin = Plugin(**options)\n\nInitialize admin handlers (example for  `Peewee ORM`_):\n\n.. code-block:: python\n\n   from muffin_admin import PWAdminHandler\n\n    @admin.route\n    class UserResource(PWAdminHandler):\n\n        \"\"\"Create Admin Resource for the User model.\"\"\"\n\n        class Meta:\n\n            \"\"\"Tune the resource.\"\"\"\n\n            # Peewee Model for the admin resource\n            model = User\n\n            # Filters\n            filters = 'email', 'created', 'is_active', 'role'\n\n            # Tune serialization/deserialization schemas\n            schema_meta = {\n                'load_only': ('password',),\n                'dump_only': ('created',),\n            }\n\n            # Columns to show\n            columns = 'id', 'email', 'is_active', 'role', 'created'\n\n            # Custom Material-UI icon\n            icon = 'People'\n\nConnect admin to an Muffin_ application:\n\n.. code-block:: python\n\n   admin.setup(app, **options)\n\n\nAuthentication\n--------------\n\nDecorate an authentication function with ``admin.check_auth``:\n\n.. code-block:: python\n\n    @admin.check_auth\n    async def auth(request):\n        \"\"\"Fake authorization method. Just checks for an auth token exists in request.\"\"\"\n        return request.headers.get('authorization')\n\n\nRegister a function to return user's information:\n\n.. code-block:: python\n\n    @admin.get_identity\n    async def ident(request):\n        \"\"\"Get current user information. Just an example.\"\"\"\n        user_id = request.headers.get('authorization')\n        user = User.select().where(User.id == user_id).first()\n        if user:\n            return {\"id\": user.id, \"fullName\": user.email}\n\nImplement a login handler for standart react-admin auth page:\n\n.. code-block:: python\n\n    @admin.login\n    async def login(request):\n        \"\"\"Login a user.\"\"\"\n        data = await request.data()\n        user = User.select().where(\n            User.email == data['username'], User.password == data['password']).first()\n        return ResponseJSON(user and user.id)\n\n\nFor futher reference check `https://github.com/klen/muffin-admin/tree/develop/examples \u003cexamples\u003e` in the repository.\n\nCustom Actions\n---------------\n\n.. code-block:: python\n\n   from muffin_admin import PWAdminHandler\n\n    @admin.route\n    class UserResource(PWAdminHandler):\n\n        # ...\n\n        @PWAdminHandler.action('users/disable', view='list')\n        async def disable_users(self, request, resource=None):\n            ids = request.query.getall('ids')\n            # ...\n\n        @PWAdminHandler.action('users/{id}/admin', view='show')\n        async def mark_admin(self, request, resource=None):\n            # ...\n\n\nConfiguration options\n----------------------\n\n=========================== ==================================================== ===========================\nName                        Default value                                        Description\n--------------------------- ---------------------------------------------------- ---------------------------\n**prefix**                  ``\"/admin\"``                                         Admin's HTTP URL prefix\n**title**                   ``\"Muffin Admin\"``                                   Admin's title\n**main_js_url**             ``\"{prefix}/main.js\"``                               A link to main JS file\n**custom_js_url**           ``\"\"``                                               A link to custom JS file\n**custom_css_url**          ``\"\"``                                               A link to custom CSS file\n**login_url**               ``None``                                             An HTTP URL for your custom login page\n**logout_url**              ``None``                                             An HTTP URL for your custom logout page\n**menu_sort**               ``True``                                             Sort menu items\n**auth_storage**            ``\"localstorage\"``                                   Where to keep authorization information (localstorage|cookies)\n**auth_storage_name**       ``muffin_admin_auth``                                Localstorage/Cookie name for authentication info\n**app_bar_links**           ``[{'url': '/', 'icon': 'Home', 'title': 'Home'}]``  Appbar links\n**mutation_mode**           ``\"optimistic\"``                                     React-Admin edit mutation mode (pessimistic|optimistic|undoable)\n=========================== ==================================================== ===========================\n\n.. _bugtracker:\n\nBug tracker\n===========\n\nIf you have any suggestions, bug reports or\nannoyances please report them to the issue tracker\nat https://github.com/klen/muffin-admin/issues\n\n.. _contributing:\n\nContributing\n============\n\nDevelopment of Muffin-Admin happens at: https://github.com/klen/muffin-admin\n\n\nContributors\n=============\n\n* klen_ (Kirill Klenov)\n\n.. _license:\n\nLicense\n========\n\nLicensed under a `MIT license`_.\n\n.. _links:\n\n.. _klen: https://github.com/klen\n.. _Muffin: https://github.com/klen/muffin\n.. _MIT license: http://opensource.org/licenses/MIT\n.. _Mongo: https://www.mongodb.com/\n.. _Peewee ORM: http://docs.peewee-orm.com/en/latest/\n.. _SqlAlchemy Core: https://docs.sqlalchemy.org/en/14/core/\n.. _Muffin-Rest: https://github.com/klen/muffin-rest\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklen%2Fmuffin-admin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fklen%2Fmuffin-admin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklen%2Fmuffin-admin/lists"}