From 60931a027b505b3937ab7161f8c7c43d8b3798a4 Mon Sep 17 00:00:00 2001
From: Manoj Bajaj
Date: Tue, 2 Jun 2026 16:42:12 +0530
Subject: [PATCH 1/4] feat(ui): redirect to connections view after successful
provider login
After OAuth completes, the return_url now points to
/?view=connections&provider= instead of /. On load, the dashboard
reads those query params to activate the connections view and pre-populate
the search filter with the provider name, landing the user on a page that
confirms their new connection.
Fixes #355
Co-Authored-By: Claude Sonnet 4.6
---
ui/src/components/authsome-dashboard.tsx | 34 +++++++++++++++++++-----
1 file changed, 27 insertions(+), 7 deletions(-)
diff --git a/ui/src/components/authsome-dashboard.tsx b/ui/src/components/authsome-dashboard.tsx
index 355f1b3..3e7d087 100644
--- a/ui/src/components/authsome-dashboard.tsx
+++ b/ui/src/components/authsome-dashboard.tsx
@@ -20,7 +20,7 @@ import {
ShieldCheck,
UserRound,
} from "lucide-react";
-import { FormEvent, ReactNode, useMemo, useState } from "react";
+import { FormEvent, ReactNode, useEffect, useMemo, useState } from "react";
import useSWR from "swr";
import { ApiError, DashboardData, ProviderView, fetchDashboard } from "@/lib/authsome-api";
@@ -450,7 +450,7 @@ function ProviderCard({ onNamedLogin, provider }: { onNamedLogin: () => void; pr
) : (
- Local-first credential broker and vault for AI Agents
+ Credential broker and vault for AI Agents
@@ -31,7 +31,7 @@
An open-source credential broker that sits between your agents and the services they call. Instead of sharing credentials with every agent, log in once via OAuth2 or API keys. Authsome stores credentials securely and injects them via an HTTP proxy. You get one place to manage access, rotate keys, and see what every agent is doing.
-**45 bundled providers** out of the box: 14 OAuth2 and 31 API key. [See the full list](https://authsome.ai/docs/reference/bundled-providers).
+Bundled providers out of the box — OAuth2 and API key. [See the full list](https://authsome.ai/docs/reference/bundled-providers).
---
@@ -50,7 +50,7 @@ Hardcoded environment tokens leak or go stale, and building auth flow logic, tok
Authsome is the local credential layer agents call at runtime.
- **No credential sprawl.** One encrypted store. Every provider, every agent, one place.
-- **No SaaS, no privacy trade-off.** Credentials never leave your machine. Eliminates credential exfiltration risks as agents never see them.
+- **Agents never see credentials.** Auth is handled outside the agent process — no exfiltration risk, no secrets in environment variables.
- **No browser required at runtime.** Setup can use browser PKCE, device code, or a browser bridge for secure API key entry. After that, agents run headlessly.
---
@@ -83,7 +83,7 @@ authsome run -- curl -s "https://api.github.com/user/repos?per_page=10"
# matched automatically via provider api_url (e.g. api.openai.com)
```
-Credentials are stored locally, encrypted at rest, and refreshed before expiry. No server. No account. No cloud.
+Credentials are encrypted at rest and refreshed before expiry.
---
@@ -94,9 +94,9 @@ Credentials are stored locally, encrypted at rest, and refreshed before expiry.
| Automatic token refresh | ✅ | ❌ | build it |
| OAuth2 + API keys | ✅ | ❌ | build it |
| Runtime headless use | ✅ | ✅ | varies |
-| Local, no SaaS dependency | ✅ | ✅ | ✅ |
| Built-in providers, zero config | ✅ | ❌ | ❌ |
| Multi-account per provider | ✅ | ❌ | build it |
+| Agents never see credentials | ✅ | ❌ | build it |
Authsome gives agents one command for a valid token, without scattering long-lived secrets across every project.
@@ -158,43 +158,11 @@ Authsome ships with adapters for the most common agent frameworks and CLIs:
Full list at [authsome.ai/docs/integrations](https://authsome.ai/docs/integrations/agents/index).
-## Docs
-
-Full documentation lives at **[authsome.ai/docs](https://authsome.ai/docs)**.
-
-- [Quickstart](https://authsome.ai/docs/quickstart)
-- [CLI reference](https://authsome.ai/docs/reference/cli)
-- [Architecture](https://authsome.ai/docs/concepts/architecture)
-- [Custom providers](https://authsome.ai/docs/guides/custom-providers)
-- [Troubleshooting](https://authsome.ai/docs/troubleshooting/doctor)
-
-To preview the docs site locally:
-
-```bash
-cd docs/site
-npm i -g mint # requires Node.js >= 20.17.0
-mint dev
-```
-
-## Telemetry
-
-Authsome's daemon can emit product analytics through PostHog. You can disable telemetry with any of these environment variables:
-
-- `DO_NOT_TRACK=1` disables analytics using the standard opt-out convention.
-- `POSTHOG_DISABLED=1` disables analytics using PostHog's recommended kill switch.
-- `AUTHSOME_ANALYTICS=0` disables analytics with an Authsome-specific override.
-
## Community
- **[Discord](https://discord.gg/9YP2C9tvMp)** for questions, help, and showing what you're building.
- **[GitHub Issues](https://github.com/agentrhq/authsome/issues)** for bugs and feature requests.
-## Security
-
-Authsome is a credential tool. If you find a vulnerability, please do **not** open a public GitHub issue.
-
-See the [responsible disclosure policy](https://authsome.ai/docs/security/disclosure) for how to report it privately.
-
## Roadmap
See [authsome.ai/docs/roadmap](https://authsome.ai/docs/roadmap) for what's shipped, what's next, and what's out of scope.
From ff592fde5924329f1f8c1060509e22746c1c296b Mon Sep 17 00:00:00 2001
From: Manoj Bajaj
Date: Tue, 2 Jun 2026 17:05:12 +0530
Subject: [PATCH 3/4] fix(ui): replace setState-in-effect with lazy useState
initializers
Calling setActiveView/setConnectionFilter inside useEffect body triggered
the react-hooks/set-state-in-effect lint error. Initialise both states
directly from URL params via lazy useState initialisers so no effect is
needed, and remove the now-unused useEffect import.
Also scope Docker build to version tags only (release-please triggers),
and restrict Python Tests to push/PR against main.
Co-Authored-By: Claude Sonnet 4.6
---
.github/workflows/docker.yml | 9 +++-----
.github/workflows/python-test.yml | 4 ++++
ui/src/components/authsome-dashboard.tsx | 27 ++++++++++++------------
3 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index eb0e8b5..69407e9 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -2,17 +2,14 @@ name: Docker build
on:
push:
- branches:
- - '**'
- pull_request:
- branches:
- - main
+ tags:
+ - 'v*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml
index 5b0787c..3a5c622 100644
--- a/.github/workflows/python-test.yml
+++ b/.github/workflows/python-test.yml
@@ -2,6 +2,8 @@ name: Python Tests
on:
push:
+ branches:
+ - main
paths:
- 'src/**'
- 'tests/**'
@@ -9,6 +11,8 @@ on:
- 'uv.lock'
- '.github/workflows/python-test.yml'
pull_request:
+ branches:
+ - main
paths:
- 'src/**'
- 'tests/**'
diff --git a/ui/src/components/authsome-dashboard.tsx b/ui/src/components/authsome-dashboard.tsx
index 3e7d087..d7a27c1 100644
--- a/ui/src/components/authsome-dashboard.tsx
+++ b/ui/src/components/authsome-dashboard.tsx
@@ -20,7 +20,7 @@ import {
ShieldCheck,
UserRound,
} from "lucide-react";
-import { FormEvent, ReactNode, useEffect, useMemo, useState } from "react";
+import { FormEvent, ReactNode, useMemo, useState } from "react";
import useSWR from "swr";
import { ApiError, DashboardData, ProviderView, fetchDashboard } from "@/lib/authsome-api";
@@ -764,24 +764,23 @@ function ActiveView({
}
export function AuthsomeDashboard() {
- const [activeView, setActiveView] = useState("dashboard");
- const [connectionFilter, setConnectionFilter] = useState(undefined);
+ const [activeView, setActiveView] = useState(() => {
+ const params = new URLSearchParams(window.location.search);
+ const view = params.get("view") as View | null;
+ return view && NAV_ITEMS.some((item) => item.id === view) ? view : "dashboard";
+ });
+ const [connectionFilter, setConnectionFilter] = useState(() => {
+ const params = new URLSearchParams(window.location.search);
+ if (params.get("view") === "connections") {
+ return params.get("provider") ?? undefined;
+ }
+ return undefined;
+ });
const { data, error, mutate } = useSWR("authsome-dashboard", fetchDashboard, {
dedupingInterval: 10_000,
revalidateOnFocus: true,
});
- useEffect(() => {
- const params = new URLSearchParams(window.location.search);
- const view = params.get("view") as View | null;
- if (view && NAV_ITEMS.some((item) => item.id === view)) {
- setActiveView(view);
- if (view === "connections") {
- setConnectionFilter(params.get("provider") ?? undefined);
- }
- }
- }, []);
-
if (isUnauthorized(error)) {
return ;
}
From 51cd24a4e1e7ca73664470fafcc9a2de046a1ea8 Mon Sep 17 00:00:00 2001
From: Manoj Bajaj
Date: Tue, 2 Jun 2026 17:05:50 +0530
Subject: [PATCH 4/4] ci: restrict ui-lint to pull_request against main only
Co-Authored-By: Claude Sonnet 4.6
---
.github/workflows/ui-lint.yml | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/ui-lint.yml b/.github/workflows/ui-lint.yml
index dce9d2b..51f13ca 100644
--- a/.github/workflows/ui-lint.yml
+++ b/.github/workflows/ui-lint.yml
@@ -1,11 +1,9 @@
name: UI Lint
on:
- push:
- paths:
- - 'ui/**'
- - '.github/workflows/ui-lint.yml'
pull_request:
+ branches:
+ - main
paths:
- 'ui/**'
- '.github/workflows/ui-lint.yml'