Claude Code skill pack for AppFolio (18 skills)
Installation
Open Claude Code and run this command:
/plugin install appfolio-pack@claude-code-plugins-plus
Use --global to install for all projects, or --project for current project only.
Skills (18)
Configure AppFolio CI/CD integration with GitHub Actions and testing.
AppFolio CI Integration
Overview
Set up CI/CD pipelines for AppFolio integrations with automated testing.
Prerequisites
- GitHub repository with Actions enabled
- AppFolio test API key
- npm/pnpm project configured
Instructions
Step 1: Create GitHub Actions Workflow
Create .github/workflows/appfolio-integration.yml:
name: AppFolio Integration Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
APPFOLIO_API_KEY: ${{ secrets.APPFOLIO_API_KEY }}
jobs:
test:
runs-on: ubuntu-latest
env:
APPFOLIO_API_KEY: ${{ secrets.APPFOLIO_API_KEY }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm test -- --coverage
- run: npm run test:integration
Step 2: Configure Secrets
gh secret set APPFOLIO_API_KEY --body "sk_test_***"
Step 3: Add Integration Tests
describe('AppFolio Integration', () => {
it.skipIf(!process.env.APPFOLIO_API_KEY)('should connect', async () => {
const client = getAppFolioClient();
const result = await client.healthCheck();
expect(result.status).toBe('ok');
});
});
Output
- Automated test pipeline
- PR checks configured
- Coverage reports uploaded
- Release workflow ready
Error Handling
| Issue | Cause | Solution |
|---|---|---|
| Secret not found | Missing configuration | Add secret via gh secret set |
| Tests timeout | Network issues | Increase timeout or mock |
| Auth failures | Invalid key | Check secret value |
Examples
Release Workflow
on:
push:
tags: ['v*']
jobs:
release:
runs-on: ubuntu-latest
env:
APPFOLIO_API_KEY: ${{ secrets.APPFOLIO_API_KEY_PROD }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
- name: Verify AppFolio production readiness
run: npm run test:integration
- run: npm run build
- run: npm publish
Branch Protection
required_status_checks:
- "test"
- "appfolio-integration"
Resources
Next Steps
For deployment patterns, s
Diagnose and fix AppFolio common errors and exceptions.
AppFolio Common Errors
Overview
Quick reference for the top 10 most common AppFolio errors and their solutions.
Prerequisites
- AppFolio SDK installed
- API credentials configured
- Access to error logs
Instructions
Step 1: Identify the Error
Check error message and code in your logs or console.
Step 2: Find Matching Error Below
Match your error to one of the documented cases.
Step 3: Apply Solution
Follow the solution steps for your specific error.
Output
- Identified error cause
- Applied fix
- Verified resolution
Error Handling
Authentication Failed
Error Message:
Authentication error: Invalid API key
Cause: API key is missing, expired, or invalid.
Solution:
# Verify API key is set
echo $APPFOLIO_API_KEY
Rate Limit Exceeded
Error Message:
Rate limit exceeded. Please retry after X seconds.
Cause: Too many requests in a short period.
Solution:
Implement exponential backoff. See appfolio-rate-limits skill.
Network Timeout
Error Message:
Request timeout after 30000ms
Cause: Network connectivity or server latency issues.
Solution:
// Increase timeout
const client = new Client({ timeout: 60000 });
Examples
Quick Diagnostic Commands
# Check AppFolio status
curl -s https://status.appfolio.com
# Verify API connectivity
curl -I https://api.appfolio.com
# Check local configuration
env | grep APPFOLIO
Escalation Path
- Collect evidence with
appfolio-debug-bundle - Check AppFolio status page
- Contact support with request ID
Resources
Next Steps
For comprehensive debugging, see appfolio-debug-bundle.
Execute AppFolio primary workflow: Core Workflow A.
AppFolio Core Workflow A
Overview
Primary money-path workflow for AppFolio. This is the most common use case.
Prerequisites
- Completed
appfolio-install-authsetup - Understanding of AppFolio core concepts
- Valid API credentials configured
Instructions
Step 1: Initialize
// Step 1 implementation
Step 2: Execute
// Step 2 implementation
Step 3: Finalize
// Step 3 implementation
Output
- Completed Core Workflow A execution
- Expected results from AppFolio API
- Success confirmation or error details
Error Handling
| Error | Cause | Solution |
|---|---|---|
| Error 1 | Cause | Solution |
| Error 2 | Cause | Solution |
Examples
Complete Workflow
// Complete workflow example
Common Variations
- Variation 1: Description
- Variation 2: Description
Resources
Next Steps
For secondary workflow, see appfolio-core-workflow-b.
Execute AppFolio secondary workflow: Core Workflow B.
AppFolio Core Workflow B
Overview
Secondary workflow for AppFolio. Complements the primary workflow.
Prerequisites
- Completed
appfolio-install-authsetup - Familiarity with
appfolio-core-workflow-a - Valid API credentials configured
Instructions
Step 1: Setup
// Step 1 implementation
Step 2: Process
// Step 2 implementation
Step 3: Complete
// Step 3 implementation
Output
- Completed Core Workflow B execution
- Results from AppFolio API
- Success confirmation or error details
Error Handling
| Aspect | Workflow A | Workflow B |
|---|---|---|
| Use Case | Primary | Secondary |
| Complexity | Medium | Lower |
| Performance | Standard | Optimized |
Examples
Complete Workflow
// Complete workflow example
Error Recovery
// Error handling code
Resources
Next Steps
For common errors, see appfolio-common-errors.
Optimize AppFolio costs through tier selection, sampling, and usage monitoring.
AppFolio Cost Tuning
Overview
Optimize AppFolio costs through smart tier selection, sampling, and usage monitoring.
Prerequisites
- Access to AppFolio billing dashboard
- Understanding of current usage patterns
- Database for usage tracking (optional)
- Alerting system configured (optional)
Pricing Tiers
| Tier | Monthly Cost | Included | Overage |
|---|---|---|---|
| Free | $0 | 1,000 requests | N/A |
| Pro | $99 | 100,000 requests | $0.001/request |
| Enterprise | Custom | Unlimited | Volume discounts |
Cost Estimation
interface UsageEstimate {
requestsPerMonth: number;
tier: string;
estimatedCost: number;
recommendation?: string;
}
function estimateAppFolioCost(requestsPerMonth: number): UsageEstimate {
if (requestsPerMonth <= 1000) {
return { requestsPerMonth, tier: 'Free', estimatedCost: 0 };
}
if (requestsPerMonth <= 100000) {
return { requestsPerMonth, tier: 'Pro', estimatedCost: 99 };
}
const proOverage = (requestsPerMonth - 100000) * 0.001;
const proCost = 99 + proOverage;
return {
requestsPerMonth,
tier: 'Pro (with overage)',
estimatedCost: proCost,
recommendation: proCost > 500
? 'Consider Enterprise tier for volume discounts'
: undefined,
};
}
Usage Monitoring
class AppFolioUsageMonitor {
private requestCount = 0;
private bytesTransferred = 0;
private alertThreshold: number;
constructor(monthlyBudget: number) {
this.alertThreshold = monthlyBudget * 0.8; // 80% warning
}
track(request: { bytes: number }) {
this.requestCount++;
this.bytesTransferred += request.bytes;
if (this.estimatedCost() > this.alertThreshold) {
this.sendAlert('Approaching AppFolio budget limit');
}
}
estimatedCost(): number {
return estimateAppFolioCost(this.requestCount).estimatedCost;
}
private sendAlert(message: string) {
// Send to Slack, email, PagerDuty, etc.
}
}
Cost Reduction Strategies
Step 1: Request Sampling
function shouldSample(samplingRate = 0.1): boolean {
return Math.random() < samplingRate;
}
// Use for non-critical telemetry
if (shouldSample(0.1)) { // 10% sample
await appfolioClient.trackEvent(event);
}
Step 2: Batching Requests
// Instead of N individual calls
await Promise.all(ids.map(id => appfolioClient.get(id)));
// Use batch endpoint (1 call)
await appfolioClient.batchGet(ids);
Step 3: Caching (from P16)
- Cache frequently accessed data
- Use
Collect AppFolio debug evidence for support tickets and troubleshooting.
AppFolio Debug Bundle
Overview
Collect all necessary diagnostic information for AppFolio support tickets.
Prerequisites
- AppFolio SDK installed
- Access to application logs
- Permission to collect environment info
Instructions
Step 1: Create Debug Bundle Script
#!/bin/bash
# appfolio-debug-bundle.sh
BUNDLE_DIR="appfolio-debug-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BUNDLE_DIR"
echo "=== AppFolio Debug Bundle ===" > "$BUNDLE_DIR/summary.txt"
echo "Generated: $(date)" >> "$BUNDLE_DIR/summary.txt"
Step 2: Collect Environment Info
# Environment info
echo "--- Environment ---" >> "$BUNDLE_DIR/summary.txt"
node --version >> "$BUNDLE_DIR/summary.txt" 2>&1
npm --version >> "$BUNDLE_DIR/summary.txt" 2>&1
echo "APPFOLIO_API_KEY: ${APPFOLIO_API_KEY:+[SET]}" >> "$BUNDLE_DIR/summary.txt"
Step 3: Gather SDK and Logs
# SDK version
npm list @appfolio/sdk 2>/dev/null >> "$BUNDLE_DIR/summary.txt"
# Recent logs (redacted)
grep -i "appfolio" ~/.npm/_logs/*.log 2>/dev/null | tail -50 >> "$BUNDLE_DIR/logs.txt"
# Configuration (redacted - secrets masked)
echo "--- Config (redacted) ---" >> "$BUNDLE_DIR/summary.txt"
cat .env 2>/dev/null | sed 's/=.*/=***REDACTED***/' >> "$BUNDLE_DIR/config-redacted.txt"
# Network connectivity test
echo "--- Network Test ---" >> "$BUNDLE_DIR/summary.txt"
echo -n "API Health: " >> "$BUNDLE_DIR/summary.txt"
curl -s -o /dev/null -w "%{http_code}" https://api.appfolio.com/health >> "$BUNDLE_DIR/summary.txt"
echo "" >> "$BUNDLE_DIR/summary.txt"
Step 4: Package Bundle
tar -czf "$BUNDLE_DIR.tar.gz" "$BUNDLE_DIR"
echo "Bundle created: $BUNDLE_DIR.tar.gz"
Output
appfolio-debug-YYYYMMDD-HHMMSS.tar.gzarchive containing:summary.txt- Environment and SDK infologs.txt- Recent redacted logsconfig-redacted.txt- Configuration (secrets removed)
Error Handling
| Item | Purpose | Included | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Environment versions | Compatibility check | ✓ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SDK version | Version-specific bugs | ✓ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Error logs (redacted) | Root cause analysis | ✓ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Config (redacted) | Configuration issues | ✓ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Error | Cause | Solution |
|---|---|---|
| Import Error | SDK not installed | Verify with npm list or pip show |
| Auth Error | Invalid credentials | Check environment variable is set |
| Timeout | Network issues | Increase timeout or check connectivity |
| Rate Limit | Too many requests | Wait and retry with exponential backoff |
Examples
TypeScript Example
import { AppFolioClient } from '@appfolio/sdk';
const client = new AppFolioClient({
apiKey: process.env.APPFOLIO_API_KEY,
});
async function main() {
// Your first API call here
}
main().catch(console.error);
Python Example
from appfolio import AppFolioClient
client = AppFolioClient()
# Your first API call here
Resources
Next Steps
Proceed to appfolio-local-dev-loop for development workflow setup.
Install and configure AppFolio SDK/CLI authentication.
AppFolio Install & Auth
Overview
Set up AppFolio SDK/CLI and configure authentication credentials.
Prerequisites
- Node.js 18+ or Python 3.10+
- Package manager (npm, pnpm, or pip)
- AppFolio account with API access
- API key from AppFolio dashboard
Instructions
Step 1: Install SDK
# Node.js
npm install @appfolio/sdk
# Python
pip install appfolio
Step 2: Configure Authentication
# Set environment variable
export APPFOLIO_API_KEY="your-api-key"
# Or create .env file
echo 'APPFOLIO_API_KEY=your-api-key' >> .env
Step 3: Verify Connection
// Test connection code here
Output
- Installed SDK package in node_modules or site-packages
- Environment variable or .env file with API key
- Successful connection verification output
Error Handling
| Error | Cause | Solution |
|---|---|---|
| Invalid API Key | Incorrect or expired key | Verify key in AppFolio dashboard |
| Rate Limited | Exceeded quota | Check quota at https://docs.appfolio.com |
| Network Error | Firewall blocking | Ensure outbound HTTPS allowed |
| Module Not Found | Installation failed | Run npm install or pip install again |
Examples
TypeScript Setup
import { AppFolioClient } from '@appfolio/sdk';
const client = new AppFolioClient({
apiKey: process.env.APPFOLIO_API_KEY,
});
Python Setup
from appfolio import AppFolioClient
client = AppFolioClient(
api_key=os.environ.get('APPFOLIO_API_KEY')
)
Resources
Next Steps
After successful auth, proceed to appfolio-hello-world for your first API call.
Configure AppFolio local development with hot reload and testing.
AppFolio Local Dev Loop
Overview
Set up a fast, reproducible local development workflow for AppFolio.
Prerequisites
- Completed
appfolio-install-authsetup - Node.js 18+ with npm/pnpm
- Code editor with TypeScript support
- Git for version control
Instructions
Step 1: Create Project Structure
my-appfolio-project/
├── src/
│ ├── appfolio/
│ │ ├── client.ts # AppFolio client wrapper
│ │ ├── config.ts # Configuration management
│ │ └── utils.ts # Helper functions
│ └── index.ts
├── tests/
│ └── appfolio.test.ts
├── .env.local # Local secrets (git-ignored)
├── .env.example # Template for team
└── package.json
Step 2: Configure Environment
# Copy environment template
cp .env.example .env.local
# Install dependencies
npm install
# Start development server
npm run dev
Step 3: Setup Hot Reload
{
"scripts": {
"dev": "tsx watch src/index.ts",
"test": "vitest",
"test:watch": "vitest --watch"
}
}
Step 4: Configure Testing
import { describe, it, expect, vi } from 'vitest';
import { AppFolioClient } from '../src/appfolio/client';
describe('AppFolio Client', () => {
it('should initialize with API key', () => {
const client = new AppFolioClient({ apiKey: 'test-key' });
expect(client).toBeDefined();
});
});
Output
- Working development environment with hot reload
- Configured test suite with mocking
- Environment variable management
- Fast iteration cycle for AppFolio development
Error Handling
| Error | Cause | Solution |
|---|---|---|
| Module not found | Missing dependency | Run npm install |
| Port in use | Another process | Kill process or change port |
| Env not loaded | Missing .env.local | Copy from .env.example |
| Test timeout | Slow network | Increase test timeout |
Examples
Mock AppFolio Responses
vi.mock('@appfolio/sdk', () => ({
AppFolioClient: vi.fn().mockImplementation(() => ({
// Mock methods here
})),
}));
Debug Mode
# Enable verbose logging
DEBUG=APPFOLIO=* npm run dev
Resources
- AppFolio SDK Reference
- Vitest Documentation
-
Optimize AppFolio API performance with caching, batching, and connection pooling.
ReadWriteEditAppFolio Performance Tuning
Overview
Optimize AppFolio API performance with caching, batching, and connection pooling.
Prerequisites
- AppFolio SDK installed
- Understanding of async patterns
- Redis or in-memory cache available (optional)
- Performance monitoring in place
Latency Benchmarks
Operation P50 P95 P99 Read 50ms 150ms 300ms Write 100ms 250ms 500ms List 75ms 200ms 400ms Caching Strategy
Response Caching
import { LRUCache } from 'lru-cache'; const cache = new LRUCache<string, any>({ max: 1000, ttl: 60000, // 1 minute updateAgeOnGet: true, }); async function cachedAppFolioRequest<T>( key: string, fetcher: () => Promise<T>, ttl?: number ): Promise<T> { const cached = cache.get(key); if (cached) return cached as T; const result = await fetcher(); cache.set(key, result, { ttl }); return result; }Redis Caching (Distributed)
import Redis from 'ioredis'; const redis = new Redis(process.env.REDIS_URL); async function cachedWithRedis<T>( key: string, fetcher: () => Promise<T>, ttlSeconds = 60 ): Promise<T> { const cached = await redis.get(key); if (cached) return JSON.parse(cached); const result = await fetcher(); await redis.setex(key, ttlSeconds, JSON.stringify(result)); return result; }Request Batching
import DataLoader from 'dataloader'; const appfolioLoader = new DataLoader<string, any>( async (ids) => { // Batch fetch from AppFolio const results = await appfolioClient.batchGet(ids); return ids.map(id => results.find(r => r.id === id) || null); }, { maxBatchSize: 100, batchScheduleFn: callback => setTimeout(callback, 10), } ); // Usage - automatically batched const [item1, item2, item3] = await Promise.all([ appfolioLoader.load('id-1'), appfolioLoader.load('id-2'), appfolioLoader.load('id-3'), ]);Connection Optimization
import { Agent } from 'https'; // Keep-alive connection pooling const agent = new Agent({ keepAlive: true, maxSockets: 10, maxFreeSockets: 5, timeout: 30000, }); const client = new AppFolioClient({ apiKey: process.env.APPFOLIO_API_KEY!, httpAgent: agent, });Pagination Optimization
async function* paginatedAppFolioList<T>( fetcher: (cursor?: string) => Promise<{ data: T[]; nextCursor?: string }> ): AsyncG
Execute AppFolio production deployment checklist and rollback procedures.
AppFolio Production Checklist
Overview
Complete checklist for deploying AppFolio integrations to production.
Prerequisites
- Staging environment tested and verified
- Production API keys available
- Deployment pipeline configured
- Monitoring and alerting ready
Instructions
Step 1: Pre-Deployment Configuration
- [ ] Production API keys in secure vault
- [ ] Environment variables set in deployment platform
- [ ] API key scopes are minimal (least privilege)
- [ ] Webhook endpoints configured with HTTPS
- [ ] Webhook secrets stored securely
Step 2: Code Quality Verification
- [ ] All tests passing (
npm test) - [ ] No hardcoded credentials
- [ ] Error handling covers all AppFolio error types
- [ ] Rate limiting/backoff implemented
- [ ] Logging is production-appropriate
Step 3: Infrastructure Setup
- [ ] Health check endpoint includes AppFolio connectivity
- [ ] Monitoring/alerting configured
- [ ] Circuit breaker pattern implemented
- [ ] Graceful degradation configured
Step 4: Documentation Requirements
- [ ] Incident runbook created
- [ ] Key rotation procedure documented
- [ ] Rollback procedure documented
- [ ] On-call escalation path defined
Step 5: Deploy with Gradual Rollout
# Pre-flight checks
curl -f https://staging.example.com/health
curl -s https://status.appfolio.com
# Gradual rollout - start with canary (10%)
kubectl apply -f k8s/production.yaml
kubectl set image deployment/appfolio-integration app=image:new --record
kubectl rollout pause deployment/appfolio-integration
# Monitor canary traffic for 10 minutes
sleep 600
# Check error rates and latency before continuing
# If healthy, continue rollout to 50%
kubectl rollout resume deployment/appfolio-integration
kubectl rollout pause deployment/appfolio-integration
sleep 300
# Complete rollout to 100%
kubectl rollout resume deployment/appfolio-integration
kubectl rollout status deployment/appfolio-integration
Output
- Deployed AppFolio integration
- Health checks passing
- Monitoring active
- Rollback procedure documented
Error Handling
| Alert | Condition | Severity |
|---|---|---|
| API Down | 5xx errors > 10/min | P1 |
| High Latency | p99 > 5000ms | P2 |
| Rate Limited | 429 errors > 5/min | P2 |
| Auth Failures | 401/403 errors > 0 | P1 |
Examples
Health Check Implementation
async function healthCheck(): Promise<{ status: string; appfolio: any }Implement AppFolio rate limiting, backoff, and idempotency patterns.
AppFolio Rate Limits
Overview
Handle AppFolio rate limits gracefully with exponential backoff and idempotency.
Prerequisites
- AppFolio SDK installed
- Understanding of async/await patterns
- Access to rate limit headers
Instructions
Step 1: Understand Rate Limit Tiers
| Tier | Requests/min | Requests/day | Burst |
|---|---|---|---|
| Free | 60 | 1,000 | 10 |
| Pro | 300 | 10,000 | 50 |
| Enterprise | 1,000 | 100,000 | 200 |
Step 2: Implement Exponential Backoff with Jitter
async function withExponentialBackoff<T>(
operation: () => Promise<T>,
config = { maxRetries: 5, baseDelayMs: 1000, maxDelayMs: 32000, jitterMs: 500 }
): Promise<T> {
for (let attempt = 0; attempt <= config.maxRetries; attempt++) {
try {
return await operation();
} catch (error: any) {
if (attempt === config.maxRetries) throw error;
const status = error.status || error.response?.status;
if (status !== 429 && (status < 500 || status >= 600)) throw error;
// Exponential delay with jitter to prevent thundering herd
const exponentialDelay = config.baseDelayMs * Math.pow(2, attempt);
const jitter = Math.random() * config.jitterMs;
const delay = Math.min(exponentialDelay + jitter, config.maxDelayMs);
console.log(`Rate limited. Retrying in ${delay.toFixed(0)}ms...`);
await new Promise(r => setTimeout(r, delay));
}
}
throw new Error('Unreachable');
}
Step 3: Add Idempotency Keys
import { v4 as uuidv4 } from 'uuid';
import crypto from 'crypto';
// Generate deterministic key from operation params (for safe retries)
function generateIdempotencyKey(operation: string, params: Record<string, any>): string {
const data = JSON.stringify({ operation, params });
return crypto.createHash('sha256').update(data).digest('hex');
}
async function idempotentRequest<T>(
client: AppFolioClient,
params: Record<string, any>,
idempotencyKey?: string // Pass existing key for retries
): Promise<T> {
// Use provided key (for retries) or generate deterministic key from params
const key = idempotencyKey || generateIdempotencyKey(params.method || 'POST', params);
return client.request({
...params,
headers: { 'Idempotency-Key': key, ...params.headers },
});
}
Output
- Reliable API calls with automatic retry
- Idempotent requests preventing duplicates
- Rate limit headers properly handled
Error Handling
| Header | Description | Acti
Implement AppFolio reference architecture with best-practice project layout.
ReadGrep
AppFolio Reference ArchitectureOverviewProduction-ready architecture patterns for AppFolio integrations. Prerequisites
Project Structure
Layer Architecture
Key ComponentsStep 1: Client Wrapper
Step 2: Error BoundaryApply production-ready AppFolio SDK patterns for TypeScript and Python.
ReadWriteEdit
AppFolio SDK PatternsOverviewProduction-ready patterns for AppFolio SDK usage in TypeScript and Python. Prerequisites
InstructionsStep 1: Implement Singleton Pattern (Recommended)
Step 2: Add Error Handling Wrapper
Step 3: Implement Retry Logic
Output
Error Handling
ExamplesFactory Pattern (Multi-tenant)Apply AppFolio security best practices for secrets and access control.
ReadWriteGrep
AppFolio Security BasicsOverviewSecurity best practices for AppFolio API keys, tokens, and access control. Prerequisites
InstructionsStep 1: Configure Environment Variables
Step 2: Implement Secret Rotation
Step 3: Apply Least Privilege
Output
Error Handling
ExamplesService Account Pattern
Webhook Signature Verification
Security Checklist
Audit LoggingAnalyze, plan, and execute AppFolio SDK upgrades with breaking change detection.
ReadWriteEditBash(npm:*)Bash(git:*)
AppFolio Upgrade & MigrationOverviewGuide for upgrading AppFolio SDK versions and handling breaking changes. Prerequisites
InstructionsStep 1: Check Current Version
Step 2: Review Changelog
Step 3: Create Upgrade Branch
Step 4: Handle Breaking ChangesUpdate import statements, configuration, and method signatures as needed. Output
Error Handling
ExamplesImport Changes
Configuration Changes
Rollback Procedure
Deprecation Handling
ResourcesNext StepsFor CI integration during upgrades, see Implement AppFolio webhook signature validation and event handling.
ReadWriteEditBash(curl:*)
AppFolio Webhooks & EventsOverviewSecurely handle AppFolio webhooks with signature validation and replay protection. Prerequisites
Webhook Endpoint SetupExpress.js
Signature Verification
Event Handler PatternReady to use appfolio-pack?Related Plugins000-jeremy-content-consistency-validatorRead-only validator that generates comprehensive discrepancy reports comparing messaging consistency across ANY HTML-based website (WordPress, Hugo, Next.js, React, Vue, static HTML, etc.), GitHub repositories, and local documentation. Detects mixed messaging without making changes. 002-jeremy-yaml-master-agentIntelligent YAML validation, generation, and transformation agent with schema inference, linting, and format conversion capabilities 003-jeremy-vertex-ai-media-masterComprehensive Google Vertex AI multimodal mastery for Jeremy - video processing (6+ hours), audio generation, image creation with Gemini 2.0/2.5 and Imagen 4. Marketing campaign automation, content generation, and media asset production. 004-jeremy-google-cloud-agent-sdkGoogle Cloud Agent Development Kit (ADK) and Agent Starter Pack mastery - build containerized multi-agent systems with production-ready templates, deploy to Cloud Run/GKE/Agent Engine, RAG agents, ReAct agents, and multi-agent orchestration. agent-context-managerAutomatically detects and loads AGENTS.md files to provide agent-specific instructions ai-commit-genAI-powered commit message generator - analyzes your git diff and creates conventional commit messages instantly
Tags
appfoliosaassdkintegration
|
|---|