{"id":45384914,"url":"https://github.com/istefanis/controllio","last_synced_at":"2026-02-21T17:25:32.319Z","repository":{"id":148242003,"uuid":"614595211","full_name":"istefanis/controllio","owner":"istefanis","description":"Web app for experimenting with control systems","archived":false,"fork":false,"pushed_at":"2025-10-01T22:22:46.000Z","size":2031,"stargazers_count":17,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-02-13T10:24:28.797Z","etag":null,"topics":["bode-plot","control-design","control-engineering","control-systems","controller","dynamical-systems","es2022","frequency-analysis","frequency-domain","frequency-response","laplace-transform","nyquist","pid-controller","transfer-functions"],"latest_commit_sha":null,"homepage":"https://istefanis.github.io/controllio/","language":"JavaScript","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/istefanis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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,"zenodo":null,"notice":"NOTICE.txt","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-03-15T23:07:46.000Z","updated_at":"2025-10-01T22:22:50.000Z","dependencies_parsed_at":"2023-12-01T23:27:09.182Z","dependency_job_id":"6320fb97-2fb4-4ce4-96e5-ed4d13a7355d","html_url":"https://github.com/istefanis/controllio","commit_stats":{"total_commits":76,"total_committers":1,"mean_commits":76.0,"dds":0.0,"last_synced_commit":"c2626f24d137d0ead5a46f7b0ed5d2efa9b66c6e"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/istefanis/controllio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/istefanis%2Fcontrollio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/istefanis%2Fcontrollio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/istefanis%2Fcontrollio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/istefanis%2Fcontrollio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/istefanis","download_url":"https://codeload.github.com/istefanis/controllio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/istefanis%2Fcontrollio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29688232,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T15:51:39.154Z","status":"ssl_error","status_checked_at":"2026-02-21T15:49:03.425Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["bode-plot","control-design","control-engineering","control-systems","controller","dynamical-systems","es2022","frequency-analysis","frequency-domain","frequency-response","laplace-transform","nyquist","pid-controller","transfer-functions"],"created_at":"2026-02-21T17:25:31.863Z","updated_at":"2026-02-21T17:25:32.312Z","avatar_url":"https://github.com/istefanis.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Controllio\n\n![tests-workflow](https://github.com/istefanis/controllio/actions/workflows/tests.yml/badge.svg)\n\n![app-preview](https://github.com/istefanis/controllio/blob/main/assets/img/app.png)\n\nControllio is a web app which lets Control Systems engineers design \u0026 experiment with LTI (linear time-invariant) dynamical systems.\n\nIt provides functionality for both continuous-time (s-domain) \u0026 discrete-time (z-domain) systems.\n\nSo far, the following features have been implemented:\n\n- the analytical computation of the overall transfer function (tf) of a system modeled by interconnected elements in the s- and z-domains\n- the generation of its Bode and Nyquist plots\n- the numerical computation of its time response plot\n- the numerical computation of its zeros/poles \u0026 some characteristic numbers, ex. bandwidth\n- the numerical computation of its stability\n- the transformation of a tf between continuous and discrete-time domains via approximate methods\n\n\u003e _This is a web GUI tool. For a command-line one, check the [lti-freq-domain-toolbox](https://github.com/istefanis/lti-freq-domain-toolbox)_\n\n## Motivation\n\nThe motivation behind Controllio is to create an open-source tool for studying Control Systems, which:\n\n- runs in the browser without any installation, is fast and mobile-friendly\n- is written in a widely-used programming language (vanilla Javascript), and can be easily extended\n\n## Technical details\n\n### Circuit simplification\n\n- A set of 6 simplication algorithms to compute analytically its overall transfer function\n\n![circuit simplification](https://github.com/istefanis/controllio/blob/main/assets/img/circuit-simplification.gif)\n\n### Numerical algorithms\n\n- Polynomial complex roots: Weierstrass / Durand-Kerner algorithm\n- Laplace inversion: Talbot algorithm\n\n### Continuous \u0026#x21C4; discrete-time transform\n\n- Approximate methods: Tustin/Bilinear, Backward difference\n\n### Topology optimization\n\n- A stochastic algorithm to simplify the circuit's topology\n\n![topology optimization](https://github.com/istefanis/controllio/blob/main/assets/img/topology-optimization.gif)\n\n### Ready-made components\n\n- Continuous-time:\n  - Utilities: integrator / step, exponential decay, sine, phase delay\n  - Filters: Butterworth\n  - Controllers: PI, PD, PID\n- Discrete-time:\n  - Utilities: delay, step\n\n## User Guide\n\nA User Guide is included in the web app, and can be launched from the main menu\n\n## Try it out\n\n### Online\n\n- The app is deployed [here](https://istefanis.github.io/controllio)\n\n### Locally with CDN (default)\n\n1. Download the repo\n\n2. Load the app using a development server\n\n### Locally with NPM\n\n1. Install [Node.js®](https://nodejs.org) if you don't have it\n\n2. Download the repo\n\n3. Search the codebase for the string `to run with NPM` (4 occurences excluding this one). Follow the respective guideline in each occurence to slightly modify the code, so that it uses NPM dependencies\n\n4. Open your terminal at the main project directory, and run `npm install` to download the dependencies locally\n\n5. Run `npm start` to load the app via [Parcel](https://parceljs.org/) (stop via `Ctrl+C`)\n\n## Tests\n\n### Run without a framework (default)\n\n1. Open the browser's console, and run `await runAllTests()`\n\n### Run with Jest\n\n1. Install [Node.js®](https://nodejs.org) if you don't have it\n\n2. If you have previously run the app locally with NPM, make sure all NPM-related code changes (4 occurences) are reverted (see above)\n\n3. Open your terminal at the main project directory, and run `npm install` to download the dependencies locally, if you haven't done it already\n\n4. Run `npm test` to execute the tests via [Jest](https://jestjs.io/)\n\n\u003e _Current test coverage according to Jest: 65% (statements)_\n\n## Code Structure\n\nThe project uses a simplified variation of the MVC pattern, organizing code into _model_ and _view_ parts:\n\n- `/model/` contains all code modeling the circuit elements, state \u0026 functionality:\n  - the definitions of the main circuit elements (_tf_, _adder_, _block_), as JS classes\n  - the circuit/block simplification algorithms' logic\n  - the services related to the circuit state \u0026 core functionality (ex. _elementConnectionService_)\n- `/view/` contains all code related to the visual part of the app \u0026 its UI:\n  - the views of the main circuit elements (ex. _tfView_) \u0026 all other UI components (ex. _navbarView_)\n  - the core rendering \u0026 UI services (ex. _elementRenderingService_, _elementSelectingAndDraggingService_)\n  - the app features' services (ex. _optimizeTopologyService_)\n  - the animations' rendering code\n  - the plot computations \u0026 rendering code\n  - the CSS styles\n\nIn addition:\n\n- `/assets/` contains any other resources used (ex. libraries, images)\n- `/math/` contains the math services (ex. _complexAnalysisService_)\n- `/test/` contains the app's tests\n- `/util/` contains any general-purpose utility code \u0026 services (ex. _loggingService_)\n\n## License\n\nControllio is distributed under the MIT License, included in the 'LICENSE.TXT' file.\nCopyright (C) 2023-2024 Ioannis Stefanis\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fistefanis%2Fcontrollio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fistefanis%2Fcontrollio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fistefanis%2Fcontrollio/lists"}