{"id":50783529,"url":"https://github.com/juandl/skyveer","last_synced_at":"2026-06-12T05:30:52.313Z","repository":{"id":363988591,"uuid":"1265804226","full_name":"juandl/skyveer","owner":"juandl","description":"A sleek desktop app to manage AWS profiles, MFA logins, and session credentials, all locally on your machine.","archived":false,"fork":false,"pushed_at":"2026-06-11T06:45:54.000Z","size":565,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-11T08:21:23.188Z","etag":null,"topics":["aws","aws-credentials","cloud","credential-manager","credentials","electron","mfa","saml-sso-url","session"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/juandl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-11T05:07:36.000Z","updated_at":"2026-06-11T06:44:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/juandl/skyveer","commit_stats":null,"previous_names":["juandl/skyveer"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/juandl/skyveer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juandl%2Fskyveer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juandl%2Fskyveer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juandl%2Fskyveer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juandl%2Fskyveer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juandl","download_url":"https://codeload.github.com/juandl/skyveer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juandl%2Fskyveer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34231214,"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-12T02:00:06.859Z","response_time":109,"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":["aws","aws-credentials","cloud","credential-manager","credentials","electron","mfa","saml-sso-url","session"],"created_at":"2026-06-12T05:30:51.509Z","updated_at":"2026-06-12T05:30:52.308Z","avatar_url":"https://github.com/juandl.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"build/icon.png\" alt=\"Skyveer\" width=\"120\" /\u003e\n\n\u003cbr clear=\"left\" /\u003e \n\n# Skyveer\n\n\u003e A sleek desktop app to manage AWS profiles, MFA logins, and session credentials — all locally on your machine.\n\nBuilt with **Electron**, **React**, and the **AWS SDK**.\n\n---\n\n## 📸 Screenshots\n\n| Profile list | Add profile | Login with MFA |\n| :---: | :---: | :---: |\n| \u003ca href=\"public/capture-1.png\"\u003e\u003cimg src=\"public/capture-1.png\" alt=\"Profile list\" width=\"260\" /\u003e\u003c/a\u003e | \u003ca href=\"public/capture-2.png\"\u003e\u003cimg src=\"public/capture-2.png\" alt=\"Add profile\" width=\"260\" /\u003e\u003c/a\u003e | \u003ca href=\"public/capture-3.png\"\u003e\u003cimg src=\"public/capture-3.png\" alt=\"Login with MFA\" width=\"260\" /\u003e\u003c/a\u003e |\n\n---\n\n## 📥 Download\n\nGrab the latest installer for your platform from the [**Releases**](https://github.com/juandl/skyveer/releases/latest) page:\n\n- 🍎 **macOS** — `.dmg`\n- 🪟 **Windows** — `.exe` installer\n- 🐧 **Linux** — `.AppImage`\n\n---\n\n## ✨ Features\n\n- **Profile Management** — Add, edit, and delete AWS profiles (access key, secret key, MFA device ARN, region)\n- **MFA / OTP Login** — Authenticate with a 6-digit OTP code to get temporary session credentials via `sts:GetSessionToken`\n- **Default Profile** — Mark any profile as the default to automatically write credentials to the `[default]` section in `~/.aws/credentials`\n- **Session Tracking** — View session status (active, expired, or none) with automatic verification via `sts:GetCallerIdentity`\n- **Credential Sync** — On login, writes session credentials to `~/.aws/credentials` and region config to `~/.aws/config`\n- **Session Cleanup** — Delete sessions and remove credentials from AWS config files\n- **12-Hour Sessions** — Requests STS tokens with a 12-hour duration\n\n---\n\n## 🛣️ Upcoming Features\n\n- **More cloud providers** — bring profile + session management beyond AWS (GCP, Azure, etc.)\n- **Workspaces** — group profiles by project / team / environment\n- **Console per provider** — open a scoped terminal for each profile without ever writing credentials to disk\n\n---\n\n## 🚀 How It Works\n\n1. **Add a Profile** — Enter your IAM access key, secret key, optional MFA device ARN, AWS region, and a profile name\n2. **Login** — Enter your OTP code (if MFA is configured) and click Login. The app calls `sts:GetSessionToken` and writes the temporary credentials to `~/.aws/credentials`\n3. **Use AWS CLI** — After login, use the AWS CLI with `--profile \u003cname\u003e` or without any flag if the profile is set as default\n4. **Logout** — Click \"Delete Session \u0026 Logout\" to remove the session and clear credentials from `~/.aws/credentials`\n\n### Default Profile Behavior\n\nWhen a profile is marked as default:\n- Login writes credentials to both `[profile-name]` and `[default]` sections\n- Logout clears both sections\n- Only one profile can be default at a time\n- You can switch the default at any time from the profile detail view\n\n### Files Modified\n\n| File | Description |\n|------|-------------|\n| `~/.aws/credentials` | Session credentials (`aws_access_key_id`, `aws_secret_access_key`, `aws_session_token`) |\n| `~/.aws/config` | Region and output format per profile |\n\n\u003e Profile data (keys, MFA device, settings) is stored in Electron's app data directory, **not** in `~/.aws/`.\n\n---\n\n## 🧰 Tech Stack\n\n| Technology | Purpose |\n|------------|---------|\n| [Electron](https://www.electronjs.org/) | Desktop app framework |\n| [React](https://react.dev/) | UI components |\n| [Vite](https://vite.dev/) | Build tool and dev server |\n| [@aws-sdk/client-sts](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sts/) | AWS STS API calls (GetSessionToken, GetCallerIdentity) |\n| [electron-builder](https://www.electron.build/) | App packaging and distribution |\n\n---\n\n## 📁 Project Structure\n\n```\nskyveer/\n├── src/\n│   ├── main/                       # Electron main process (TypeScript, CommonJS)\n│   │   ├── index.ts                # Entry: app lifecycle + IPC handlers\n│   │   ├── preload.ts              # Context bridge exposing typed `window.api`\n│   │   ├── config/app.ts           # APP_NAME, window dims, dev URL\n│   │   └── constants/aws.ts        # AWS paths, default region, session duration\n│   ├── renderer/                   # React app (TypeScript, ESM)\n│   │   ├── index.html              # Vite HTML entry\n│   │   ├── index.tsx               # React mount\n│   │   ├── App.tsx                 # Root component, state management\n│   │   ├── styles.css              # Global styles (dark theme)\n│   │   ├── config/app.ts           # APP_NAME for the UI\n│   │   ├── constants/\n│   │   │   ├── regions.ts          # AWS region list + AwsRegion type\n│   │   │   └── ui.ts               # Toast/view/session-status enums + types\n│   │   └── components/\n│   │       ├── Sidebar.tsx\n│   │       ├── ProfileForm.tsx\n│   │       ├── ProfileDetail.tsx\n│   │       ├── EmptyState.tsx\n│   │       └── Toast.tsx\n│   └── shared/types/               # Types shared between main and renderer\n│       ├── profile.ts              # Profile, Session, ProfileInput, LoginResult, …\n│       ├── api.ts                  # ElectronAPI + global Window augmentation\n│       └── ipc.ts                  # IPC channel constants + payload types\n├── build/\n│   ├── icon.png                    # App icon source (1024x1024)\n│   └── icon.icns                   # macOS icon\n├── tsconfig.json                   # Renderer TS config (DOM, ESM)\n├── tsconfig.main.json              # Main-process TS config (Node, CJS) → dist-electron/\n├── tsconfig.node.json              # vite.config.ts\n├── vite.config.ts\n├── dist/                           # Renderer build output (Vite bundle)\n└── dist-electron/                  # Compiled main process (tsc output)\n```\n\n---\n\n## 🧑‍💻 Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Run in development mode (Vite dev server + Electron)\nnpm start\n\n# Build the React app only\nnpm run build\n\n# Preview production build locally\nnpm run preview\n```\n\n---\n\n## 📦 Building the App\n\n```bash\n# Build and package as installable app\nnpm run dist\n```\n\n**Output:**\n- 🍎 **macOS**: `dist/Skyveer-\u003cversion\u003e-arm64.dmg`\n- 🪟 **Windows**: `dist/Skyveer Setup \u003cversion\u003e.exe`\n- 🐧 **Linux**: `dist/Skyveer-\u003cversion\u003e.AppImage`\n\n---\n\n## ✅ Prerequisites\n\n- [Node.js](https://nodejs.org/) \u003e= 18\n- An AWS IAM user with access keys and (optionally) an MFA device configured\n\n---\n\n## 🛡️ Security Notes\n\n- AWS access keys and secret keys are stored locally in Electron's app data directory (`~/Library/Application Support/skyveer/` on macOS)\n- Session tokens are temporary (12-hour expiration)\n- The app **never** sends credentials to any third-party service — all calls go directly to AWS STS\n\n---\n\n## 📜 License\n\nMozilla Public License 2.0 (MPL-2.0) — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuandl%2Fskyveer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjuandl%2Fskyveer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuandl%2Fskyveer/lists"}