Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Implement security best practices for Gamma integration. Use when securing API keys, implementing access controls, or auditing Gamma security configuration. Trigger with phrases like "gamma security", "gamma API key security", "gamma secure", "gamma credentials", "gamma access control".
.claude/skills/jeremylongshore-gamma-security-basics/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -22% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -40% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -13% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -31% | 0% |
| case-15 | ✗→✓ | ▲ Improved | -30% | 0% |
Security best practices for Gamma API integration to protect credentials and data.
typescript// NEVER do this const gamma = new GammaClient({ apiKey: 'gamma_live_abc123...', // Hardcoded - BAD! }); // DO this instead const gamma = new GammaClient({ apiKey: process.env.GAMMA_API_KEY, });
Environment Setup:
bash# .env (add to .gitignore!) GAMMA_API_KEY=gamma_live_abc123... # Load in application import 'dotenv/config';
typescript// Support multiple keys for rotation const gamma = new GammaClient({ apiKey: process.env.GAMMA_API_KEY_PRIMARY || process.env.GAMMA_API_KEY_SECONDARY, }); // Rotation script async function rotateApiKey() { // 1. Generate new key in Gamma dashboard // 2. Update GAMMA_API_KEY_SECONDARY // 3. Deploy and verify // 4. Swap PRIMARY and SECONDARY // 5. Revoke old key }
typescriptimport crypto from 'crypto'; function signRequest(payload: object, secret: string): string { const timestamp = Date.now().toString(); const message = timestamp + JSON.stringify(payload); return crypto .createHmac('sha256', secret) .update(message) .digest('hex'); } // Usage with webhook verification function verifyWebhook(body: string, signature: string, secret: string): boolean { const expected = crypto .createHmac('sha256', secret) .update(body) .digest('hex'); return crypto.timingSafeEqual( Buffer.from(signature), Buffer.from(expected) ); }
typescript// Scoped API keys (if supported) const readOnlyGamma = new GammaClient({ apiKey: process.env.GAMMA_API_KEY_READONLY, scopes: ['presentations:read', 'exports:read'], }); const fullAccessGamma = new GammaClient({ apiKey: process.env.GAMMA_API_KEY_FULL, }); // Permission check before operations async function createPresentation(user: User, data: object) { if (!user.permissions.includes('gamma:create')) { throw new Error('Insufficient permissions'); } return fullAccessGamma.presentations.create(data); }
typescriptimport { GammaClient } from '@gamma/sdk'; function createAuditedClient(userId: string) { return new GammaClient({ apiKey: process.env.GAMMA_API_KEY, interceptors: { request: (config) => { console.log(JSON.stringify({ timestamp: new Date().toISOString(), userId, action: `${config.method} ${config.path}`, type: 'gamma_api_request', })); return config; }, }, }); }
| Security Issue | Detection | Remediation | |----------------|-----------|-------------| | Exposed key | GitHub scanning | Rotate immediately | | Key in logs | Log audit | Filter sensitive data | | Unauthorized access | Audit logs | Revoke and investigate | | Weak permissions | Access review | Apply least privilege |
Proceed to gamma-prod-checklist for production readiness.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 21,419 | 13,264 | -38% | 1 | 1 | 0% | 3,315 | 2,588 | -22% | 0 | 0 | — |
case-02 | fail→pass | 22,313 | 5,522 | -75% | 1 | 1 | 0% | 3,436 | 2,060 | -40% | 0 | 0 | — |
case-03 | fail→pass | 13,507 | 11,757 | -13% | 1 | 1 | 0% | 2,607 | 2,262 | -13% | 0 | 0 | — |
case-04 | pass→pass | 12,349 | 9,968 | -19% | 1 | 1 | 0% | 2,321 | 2,902 | +25% | 0 | 0 | — |
case-05 | pass→pass | 18,811 | 12,278 | -35% | 1 | 1 | 0% | 2,626 | 2,470 | -6% | 0 | 0 | — |
case-06 | fail→pass | 13,958 | 9,465 | -32% | 1 | 1 | 0% | 2,603 | 1,800 | -31% | 0 | 0 | — |
case-07 | fail→fail | 23,160 | 9,413 | -59% | 1 | 1 | 0% | 3,172 | 2,750 | -13% | 0 | 0 | — |
case-08 | pass→pass | 17,967 | 13,605 | -24% | 1 | 1 | 0% | 2,050 | 2,507 | +22% | 0 | 0 | — |
case-09 | pass→pass | 15,293 | 6,504 | -57% | 1 | 1 | 0% | 2,394 | 2,069 | -14% | 0 | 0 | — |
case-10 | pass→pass | 14,129 | 12,689 | -10% | 1 | 1 | 0% | 2,360 | 2,468 | +5% | 0 | 0 | — |
case-11 | pass→pass | 14,258 | 13,167 | -8% | 1 | 1 | 0% | 2,023 | 2,440 | +21% | 0 | 0 | — |
case-12 | fail→fail | 17,998 | 12,622 | -30% | 1 | 1 | 0% | 3,710 | 3,447 | -7% | 0 | 0 | — |
case-13 | pass→pass | 16,109 | 5,138 | -68% | 1 | 1 | 0% | 2,181 | 1,950 | -11% | 0 | 0 | — |
case-14 | pass→pass | 15,021 | 18,810 | +25% | 1 | 1 | 0% | 2,752 | 3,740 | +36% | 0 | 0 | — |
case-15 | fail→pass | 18,699 | 9,771 | -48% | 1 | 1 | 0% | 2,993 | 2,104 | -30% | 0 | 0 | — |
case-16 | pass→pass | 18,332 | 6,243 | -66% | 1 | 1 | 0% | 2,624 | 2,277 | -13% | 0 | 0 | — |
case-17 | fail→pass | 24,571 | 7,298 | -70% | 1 | 1 | 0% | 2,608 | 1,535 | -41% | 0 | 0 | — |
case-18 | pass→pass | 10,208 | 11,028 | +8% | 1 | 1 | 0% | 2,117 | 2,340 | +11% | 0 | 0 | — |
case-19 | pass→pass | 10,687 | 7,210 | -33% | 1 | 1 | 0% | 1,834 | 1,522 | -17% | 0 | 0 | — |
case-20 | pass→pass | 21,736 | 21,158 | -3% | 1 | 1 | 0% | 3,204 | 4,640 | +45% | 0 | 0 | — |
case-21 | pass→pass | 24,036 | 19,273 | -20% | 1 | 1 | 0% | 3,322 | 3,972 | +20% | 0 | 0 | — |
case-22 | pass→pass | 24,134 | 23,479 | -3% | 1 | 1 | 0% | 4,548 | 4,796 | +5% | 0 | 0 | — |
case-23 | pass→pass | 18,470 | 16,971 | -8% | 1 | 1 | 0% | 2,424 | 3,245 | +34% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +26 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.