diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/.gitignore b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/.gitignore
new file mode 100644
index 0000000..6dde684
--- /dev/null
+++ b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/.gitignore
@@ -0,0 +1,28 @@
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+# Environment variables
+.env
+.env.local
+.env.*.local
diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/AGENTS.md b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/AGENTS.md
new file mode 100644
index 0000000..10637d9
--- /dev/null
+++ b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/AGENTS.md
@@ -0,0 +1,29 @@
+# Sarah's App Wed, Aug 26, 2:14:31 pm
+
+This app is part of a Datadog Apps workspace. Shared guidance — including layout, dependencies, testing policy, and how changes ship — lives at the workspace root; read it before assuming anything not covered below.
+
+## Read relevant guides
+- Embedded app context / routing / storage: ../../docs/agents/runtime-context.md
+- Backend functions (*.backend.ts): ../../docs/agents/backend-functions.md
+- Local dev / auth / build / upload: ../../docs/agents/build-upload-auth.md
+- CI/CD (GitHub Actions deploy workflow): ../../docs/agents/cicd.md
+- Data access (DDSQL vs. Action Catalog, Connections, datastores): ../../docs/agents/data.md
+- Triggering or polling Workflow Automation from a backend function: ../../docs/agents/workflow-automation.md
+- Upgrading `@datadog/vite-plugin` or `@datadog/action-catalog`: ../../docs/agents/upgrading.md
+- Workspace overview (layout, dependencies, testing, shipping/CI): ../../AGENTS.md
+
+## This app
+- This app owns its unique `apps.identifier` in `./vite.config.ts` — never share or copy it.
+- Run locally: `npm run dev -w apps/sarah-s-app-wed-aug-26-2-14-31-pm` (from the workspace root) or `npm run dev` (from this directory).
+- Upload: `npm run upload -w apps/sarah-s-app-wed-aug-26-2-14-31-pm`.
+
+## Testing
+
+Storybook stories are not required for this app right now — skip them unless explicitly asked. Playwright is still encouraged for browser validation when available, especially for visual/design changes. Validate with `npm run dev`, `npm run build`, and `npm run typecheck`/`npm run lint`.
+
+## Rules
+
+- Keep secret-dependent work and privileged API calls in backend functions.
+- Never hardcode API keys, app keys, or OAuth tokens.
+- Prefer the generated npm scripts; this workspace uses npm.
+- For any workspace, dependency, lockfile, or pull-request change, follow `Required lockfile gate before opening or updating a PR` in ../../AGENTS.md. That root section is the source of truth; do not create an app-local lockfile.
diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/CLAUDE.md b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/CLAUDE.md
new file mode 100644
index 0000000..43c994c
--- /dev/null
+++ b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/CLAUDE.md
@@ -0,0 +1 @@
+@AGENTS.md
diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/datadog-app.config.json b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/datadog-app.config.json
new file mode 100644
index 0000000..7a99007
--- /dev/null
+++ b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/datadog-app.config.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://unpkg.com/@datadog/create-apps/dist/datadog-app.config.schema.json",
+ "datadogSite": "datadoghq.com",
+ "id": "733d9160-ecc5-44b5-b9dc-5b76ad34737c",
+ "name": "Sarah's App Wed, Aug 26, 2:14:31 pm"
+}
diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/index.html b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/index.html
new file mode 100644
index 0000000..d3a06ee
--- /dev/null
+++ b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+ Sarah's App Wed, Aug 26, 2:14:31 pm
+
+
+
+
+
+
+
+
diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/package.json b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/package.json
new file mode 100644
index 0000000..18d47a7
--- /dev/null
+++ b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "sarah-s-app-wed-aug-26-2-14-31-pm",
+ "version": "0.0.1",
+ "private": true,
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "upload": "DD_APPS_UPLOAD_ASSETS=1 vite build",
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+ "lint:fix": "eslint . --ext ts,tsx --fix",
+ "preview": "vite preview",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {
+ "@datadog/action-catalog": "^0.0.3",
+ "@datadog/druids": "^0.0.7",
+ "@tanstack/react-query": "^5.101.2",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1"
+ },
+ "optionalDependencies": {
+ "@napi-rs/keyring": "^1.3.0"
+ }
+}
diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/public/favicon.ico b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/public/favicon.ico
new file mode 100644
index 0000000..e04da3e
Binary files /dev/null and b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/public/favicon.ico differ
diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/src/App.css b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/src/App.css
new file mode 100644
index 0000000..3917516
--- /dev/null
+++ b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/src/App.css
@@ -0,0 +1,45 @@
+.alexander-page {
+ align-items: center;
+ background:
+ radial-gradient(circle at 18% 24%, rgba(255, 176, 0, 0.18), transparent 24%),
+ radial-gradient(circle at 82% 70%, rgba(255, 219, 92, 0.22), transparent 22%),
+ #fff8f8;
+ display: flex;
+ justify-content: center;
+ min-height: 100vh;
+}
+
+.alexander-title {
+ color: #d11124;
+ font-size: 80px;
+ letter-spacing: 0;
+ line-height: 1;
+ margin: 0;
+ position: relative;
+ text-align: center;
+ text-transform: lowercase;
+ text-shadow: 0 4px 18px rgba(209, 17, 36, 0.18);
+}
+
+.sparkle {
+ color: #ffb000;
+ display: inline-block;
+ font-size: 0.5em;
+ line-height: 1;
+ text-shadow: 0 0 16px rgba(255, 176, 0, 0.65);
+ transform: translateY(-0.48em);
+}
+
+.sparkle-left {
+ margin-right: 0.24em;
+}
+
+.sparkle-right {
+ margin-left: 0.24em;
+}
+
+@media (max-width: 520px) {
+ .alexander-title {
+ font-size: 48px;
+ }
+}
diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/src/App.tsx b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/src/App.tsx
new file mode 100644
index 0000000..2586118
--- /dev/null
+++ b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/src/App.tsx
@@ -0,0 +1,22 @@
+import { Spacing } from '@datadog/druids/layout/Spacing';
+import { Text } from '@datadog/druids/typography/Text';
+
+import './App.css';
+
+function App() {
+ return (
+
+
+
+ ✦
+
+ alexander
+
+ ✦
+
+
+
+ );
+}
+
+export default App;
diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/src/main.tsx b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/src/main.tsx
new file mode 100644
index 0000000..8f2c295
--- /dev/null
+++ b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/src/main.tsx
@@ -0,0 +1,24 @@
+import '@datadog/druids/styles.css';
+
+import { DruidsEnvironment } from '@datadog/druids/layout/DruidsEnvironment';
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { StrictMode } from 'react';
+import { createRoot } from 'react-dom/client';
+
+import App from './App';
+
+const queryClient = new QueryClient();
+const appRoot = document.getElementById('app');
+if (appRoot) {
+ createRoot(appRoot).render(
+
+
+
+
+
+
+ ,
+ );
+} else {
+ console.error('Missing #app div for createRoot.');
+}
diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/tsconfig.json b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/tsconfig.json
new file mode 100644
index 0000000..7a01668
--- /dev/null
+++ b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/tsconfig.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": [
+ "ES2020",
+ "DOM",
+ "DOM.Iterable"
+ ],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": [
+ "src"
+ ]
+}
\ No newline at end of file
diff --git a/apps/sarah-s-app-wed-aug-26-2-14-31-pm/vite.config.ts b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/vite.config.ts
new file mode 100644
index 0000000..f894014
--- /dev/null
+++ b/apps/sarah-s-app-wed-aug-26-2-14-31-pm/vite.config.ts
@@ -0,0 +1,57 @@
+import { datadogVitePlugin } from '@datadog/vite-plugin';
+import react from '@vitejs/plugin-react';
+import { defineConfig } from 'vite';
+
+import rootManifest from '../../package.json';
+import { version } from './package.json';
+import datadogAppConfig from './datadog-app.config.json';
+
+const hasDatadogApiKeys = Boolean(
+ (process.env.DD_API_KEY || process.env.DATADOG_API_KEY) &&
+ (process.env.DD_APP_KEY || process.env.DATADOG_APP_KEY),
+);
+const datadogSite = process.env.DD_SITE || process.env.DATADOG_SITE || datadogAppConfig.datadogSite;
+
+if (!process.env.DD_SITE && !process.env.DATADOG_SITE) {
+ process.env.DD_SITE = datadogSite;
+}
+
+export default defineConfig({
+ base: './',
+ build: {
+ sourcemap: true,
+ },
+ plugins: [
+ react(),
+ datadogVitePlugin({
+ logLevel: 'debug',
+ auth: {
+ site: datadogSite || rootManifest.datadogApps?.site,
+ apiKey: process.env.DD_API_KEY,
+ appKey: process.env.DD_APP_KEY,
+ },
+ apps: {
+ enable: true,
+ identifier: '733d9160-ecc5-44b5-b9dc-5b76ad34737c',
+ name: datadogAppConfig.name,
+ authOverrides: {
+ method: hasDatadogApiKeys ? 'apiKey' : 'oauth',
+ },
+ },
+ errorTracking: {
+ enable: hasDatadogApiKeys,
+ sourcemaps: {
+ minifiedPathPrefix: '/',
+ service: datadogAppConfig.name,
+ releaseVersion: version,
+ },
+ },
+ metadata: {
+ name: datadogAppConfig.name,
+ },
+ metrics: {
+ enable: hasDatadogApiKeys,
+ },
+ }),
+ ],
+});
diff --git a/package-lock.json b/package-lock.json
index a793e21..23ddb64 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -57,6 +57,19 @@
"@napi-rs/keyring": "^1.3.0"
}
},
+ "apps/sarah-s-app-wed-aug-26-2-14-31-pm": {
+ "version": "0.0.1",
+ "dependencies": {
+ "@datadog/action-catalog": "^0.0.3",
+ "@datadog/druids": "^0.0.7",
+ "@tanstack/react-query": "^5.101.2",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1"
+ },
+ "optionalDependencies": {
+ "@napi-rs/keyring": "^1.3.0"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
@@ -3982,6 +3995,10 @@
"resolved": "apps/sarah-s-app-tue-aug-25-10-32-30-am",
"link": true
},
+ "node_modules/sarah-s-app-wed-aug-26-2-14-31-pm": {
+ "resolved": "apps/sarah-s-app-wed-aug-26-2-14-31-pm",
+ "link": true
+ },
"node_modules/scheduler": {
"version": "0.23.2",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",