{"id":22042633,"url":"https://github.com/renanstn/remote-commands","last_synced_at":"2026-04-13T16:35:47.784Z","repository":{"id":119527929,"uuid":"352454788","full_name":"renanstn/remote-commands","owner":"renanstn","description":"App que executa alguns atalhos ou comandos pré configurados em seu PC a partir de uma requisição vinda de algum dispositivo na rede local.","archived":false,"fork":false,"pushed_at":"2022-06-03T03:58:53.000Z","size":86,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-23T13:42:56.766Z","etag":null,"topics":["flask","flask-admin","keyboard","python"],"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/renanstn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2021-03-28T22:40:26.000Z","updated_at":"2021-11-04T19:34:49.000Z","dependencies_parsed_at":null,"dependency_job_id":"8821d4e1-5684-4831-8f30-1c3bd858b240","html_url":"https://github.com/renanstn/remote-commands","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/renanstn/remote-commands","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanstn%2Fremote-commands","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanstn%2Fremote-commands/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanstn%2Fremote-commands/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanstn%2Fremote-commands/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/renanstn","download_url":"https://codeload.github.com/renanstn/remote-commands/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanstn%2Fremote-commands/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31761986,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T15:25:13.801Z","status":"ssl_error","status_checked_at":"2026-04-13T15:25:09.162Z","response_time":93,"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":["flask","flask-admin","keyboard","python"],"created_at":"2024-11-30T12:13:05.827Z","updated_at":"2026-04-13T16:35:47.766Z","avatar_url":"https://github.com/renanstn.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# remote-commands\n\n[![Python](https://img.shields.io/badge/python-%2314354C.svg?style=flat\u0026logo=python\u0026logoColor=white)](https://www.python.org/)\n[![Flask](https://img.shields.io/badge/flask-%23000.svg?style=flat\u0026logo=flask\u0026logoColor=white)](https://flask.palletsprojects.com/en/2.0.x/)\n![Shell Script](https://img.shields.io/badge/shell_script-%23121011.svg?style=flat\u0026logo=gnu-bash\u0026logoColor=white)\n[![Lint Markdown](https://github.com/renanstn/remote-commands/actions/workflows/markdown-lint.yaml/badge.svg)](https://github.com/renanstn/remote-commands/actions/workflows/markdown-lint.yaml)\n\n## Descrição\n\nEste app sobe um pequeno servidor Flask na sua máquina, e fica ouvindo por\nrequisições vindas da rede local.\n\nEssas requisições podem ativar algum atalho de teclado na sua máquina, executar\nalgum comando shell previamente cadastrado, ou carregar para o seu clipboard\n(famoso `ctrl+v`) algum texto também previamente cadastrado.\n\nEu utilizo este app em conjunto com o app\n[HTTP Request Shortcuts](https://play.google.com/store/apps/details?id=ch.rmy.android.http_shortcuts\u0026hl=en_US\u0026gl=US)\ninstalado em um celular velho. A partir dele envio as requests, e o celular\nfunciona como um \"controle remoto\" que executa comandos no meu PC. Com isso eu\neconomizo alguns `alt+TABs` e agilizo alguns testes onde preciso rodar o mesmo\ncomando repetidas vezes no shell.\n\n## Dependências\n\nPara que a função **pastebullet** funcione em sistemas linux, é necessário ter o\n`xclip` instalado:\n\n```sh\nsudo apt-get install xclip\n```\n\n## Setup\n\n- Clone o repositório\n- Instale as dependência utilizando o `pipenv`\n\n```sh\npipenv install\n```\n\n- Inicie o app com o comando\n\n```sh\npipenv run python server/main.py\n```\n\n- ou\n\n```sh\n./run.sh\n```\n\n## Cadastrando comandos e textos para o clipboard\n\nEm seu navegador, acesse `http://localhost:5000/admin` para ir a área de\ncadastro de **Comandos** e textos para o clipboard (que eu chamei de\n**Clipbullets**).\n\n![Flask-admin](images/admin_print.png)\n\nCadastre quantos itens quiser.\n\n## Executando\n\n### Executando atalhos\n\nPara executar um atalho, envie uma requisição `POST` com o seguinte body JSON,\na partir de qualquer dispositivo de sua rede local para:\n\n- `http://\u003cIP_da_sua_máquina\u003e/shortcut`\n\n```json\n{\n  \"shortcut\": \"\u003cnome_do_atalho\u003e\"\n}\n```\n\n- Os atalhos disponíveis até o momento são:\n  - `minimize_all`: Executa um `winkey + d`, minimizando todas as janelas do\n  windows\n  - `mute_unmute_meet`: Executa um `ctrl + d`, o atalho padrão para\n  mutar/desmutar uma chamada no Google Meet\n\n### Executando comandos\n\nPara executar os comandos, envie uma requisição `GET` de qualquer dispositivo\nde sua rede local para:\n\n- `http://\u003cIP_da_sua_máquina\u003e/command/\u003cid_do_comando\u003e`\n  - O `id_do_comando` aqui é o `id` automaticamente gerado para o comando que\n  você cadastrou na área de **admin**\n\n### Executando clipbullets\n\nPara carregar os textos cadastrados para o seu clipboard, envie uma requisição\n`GET` de qualquer dispositivo de sua rede local para:\n\n- `http://\u003cIP_da_sua_máquina\u003e/clipbullet/\u003cid_do_texto\u003e`\n  - O `id_do_texto` aqui é o `id` automaticamente gerado para o texto que você\n  cadastrou na área de **admin**\n\nApós isso, o texto cadastrado estará no seu `ctrl+v`\n\n## Segurança\n\nCaso você nãos e sinta seguro de deixar um endopoint aberto que execute scripts\nem sua rede local, você pode criar um **token de autenticação**.\n\nPara isso, crie um arquivo `.env` na raíz e defina a variável `TOKEN` para um\nvalor a sua escolha.\n\nA partir do momento que a variável de ambiente `TOKEN` está definida, toda\nrequest para funcionar deverá conter o seguinte header:\n\n```text\nAuthentication: Bearer \u003cseu TOKEN\u003e\n```\n\n## Stack\n\nEste projetinho utiliza os seguintes frameworks e packages para fazer sua\nmagia:\n\n- **flask**: Micro-framework utilizado para fazer o servidor.\n- **keyboard**: Lib utilizada para disparar atalhos de teclado na máquina.\n- **flask-admin**: Lib que fornece pronta uma área de admin para as Models do\napp.\n- **python-decouple**: Para pegar variáveis de ambiente.\n- **peewee**: ORM que manipula o banco (que neste caso é um simples sqlite).\n- **wtf-peewee**: Dependência necessária para o flask-admin fazer seus\nparanauês.\n- **clipboard**: Para carregar coisas no famoso ctrl+v da massa.\n- **chime**: Para emitir sinais sonoros ao completar cada comando\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenanstn%2Fremote-commands","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frenanstn%2Fremote-commands","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenanstn%2Fremote-commands/lists"}