google-agents-cli-scaffold
Project scaffolding, deployment configuration, and CI/CD setup for Google ADK agents.
databases-architecture-skill
Master database design (SQL, NoSQL), system architecture, API design (REST, GraphQL), and building scalable systems. Learn PostgreSQL, MongoDB, system design patterns, and enterprise architectures.
Full skill instructions
Complete guide to designing databases, systems, and APIs that scale.
Data → Schema → APIs → Architecture
↓ ↓ ↓ ↓
SQL Normalize REST Microservices
NoSQL Indexes GraphQL Patterns
SQL Fundamentals (2-3 weeks)
Database Design (3-4 weeks)
NoSQL Databases (2-3 weeks)
API Design (3-4 weeks)
System Architecture (ongoing)
-- CREATE TABLE
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- INSERT
INSERT INTO users (name, email, age)
VALUES ('Alice', '[email protected]', 25);
-- SELECT (basic)
SELECT * FROM users;
SELECT name, email FROM users;
-- WHERE (filtering)
SELECT * FROM users WHERE age > 25;
SELECT * FROM users WHERE age >= 25 AND age <= 35;
-- LIKE (pattern matching)
SELECT * FROM users WHERE name LIKE 'A%'; -- Starts with A
-- ORDER BY (sorting)
SELECT * FROM users ORDER BY age DESC; -- Highest first
-- LIMIT (pagination)
SELECT * FROM users LIMIT 10 OFFSET 20; -- Skip 20, show 10
-- JOINS
SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;
-- LEFT JOIN (include nulls)
SELECT users.name, COUNT(orders.id) as order_count
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id, users.name;
-- GROUP BY & AGGREGATION
SELECT age, COUNT(*) as count, AVG(salary) as avg_salary
FROM users
GROUP BY age
HAVING COUNT(*) > 5; -- Filter groups
-- Window functions
SELECT name, salary,
AVG(salary) OVER (PARTITION BY department) as dept_avg,
RANK() OVER (ORDER BY salary DESC) as salary_rank
FROM employees;
-- CTEs (Common Table Expressions)
WITH high_earners AS (
SELECT * FROM employees WHERE salary > 100000
)
SELECT department, COUNT(*) as count
FROM high_earners
GROUP BY department;
-- UPDATE
UPDATE users SET age = 26 WHERE name = 'Alice';
-- DELETE
DELETE FROM users WHERE age < 18;
Normalization (Reduce data redundancy):
1NF: Each column has atomic value
2NF: Remove partial dependencies
3NF: Remove transitive dependencies
BCNF: Every determinant is a candidate key
Example - Poor vs Good Design:
-- POOR (denormalized)
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(255),
course1 VARCHAR(255),
course2 VARCHAR(255),
course3 VARCHAR(255),
teacher1 VARCHAR(255),
teacher2 VARCHAR(255)
);
-- GOOD (normalized)
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(255)
);
CREATE TABLE courses (
id INT PRIMARY KEY,
name VARCHAR(255),
teacher_id INT FOREIGN KEY
);
CREATE TABLE enrollments (
student_id INT FOREIGN KEY,
course_id INT FOREIGN KEY,
PRIMARY KEY (student_id, course_id)
);
-- Create index
CREATE INDEX idx_email ON users(email);
CREATE INDEX idx_age_salary ON users(age, salary); -- Composite
-- Analyze query performance
EXPLAIN SELECT * FROM users WHERE email = '[email protected]';
-- Index types
-- B-tree: General purpose (default)
-- Hash: Exact matches only
-- GiST: Geospatial, full-text search
-- BRIN: Large datasets, sequential data
-- When to index
-- ✓ Columns in WHERE clause
-- ✓ Columns in JOIN ON clause
-- ✗ Low cardinality (yes/no, status)
-- ✗ Small tables
-- JSONB (JSON with indexing)
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
metadata JSONB
);
INSERT INTO products VALUES (1, 'Laptop', '{"color": "silver", "specs": {"cpu": "M1"}}');
-- Query JSONB
SELECT * FROM products WHERE metadata->>'color' = 'silver';
SELECT * FROM products WHERE metadata->'specs'->>'cpu' = 'M1';
-- Array columns
CREATE TABLE tags (
id SERIAL PRIMARY KEY,
article_id INT,
tags TEXT[]
);
SELECT * FROM tags WHERE 'database' = ANY(tags);
-- Full-text search
CREATE TABLE articles (
id SERIAL PRIMARY KEY,
title VARCHAR(255),
content TEXT,
search_vector tsvector
);
UPDATE articles SET search_vector = to_tsvector('english', title || ' ' || content);
SELECT * FROM articles WHERE search_vector @@ to_tsquery('database');
// Insert documents
db.users.insertOne({
_id: ObjectId(),
name: "Alice",
email: "[email protected]",
age: 25,
tags: ["developer", "python"],
address: {
street: "123 Main St",
city: "New York",
zip: "10001"
}
});
// Query documents
db.users.find({ name: "Alice" });
db.users.find({ age: { $gt: 25 } }); // Greater than
db.users.find({ tags: "python" }); // Array contains
// Update
db.users.updateOne(
{ name: "Alice" },
{ $set: { age: 26 } }
);
db.users.updateOne(
{ _id: ObjectId(...) },
{ $push: { tags: "javascript" } } // Add to array
);
// Aggregation pipeline
db.users.aggregate([
{ $match: { age: { $gt: 20 } } },
{ $group: { _id: null, avg_age: { $avg: "$age" } } },
{ $sort: { avg_age: -1 } }
]);
// Indexes
db.users.createIndex({ email: 1 });
db.users.createIndex({ name: 1, age: 1 });
db.users.createIndex({ search: "text" }); // Full-text search
import redis
r = redis.Redis(host='localhost', port=6379)
# Strings
r.set('user:1:name', 'Alice')
r.get('user:1:name') # b'Alice'
r.incr('page:views') # Increment counter
# TTL (Time to live)
r.setex('token:xyz', 3600, 'valid') # Expires in 1 hour
# Lists
r.lpush('queue:jobs', 'job1', 'job2')
r.rpop('queue:jobs') # Dequeue
r.llen('queue:jobs') # Length
# Sets
r.sadd('tags:post:1', 'python', 'database', 'backend')
r.smembers('tags:post:1')
r.sismember('tags:post:1', 'python') # Is member?
# Hashes
r.hset('user:1', mapping={'name': 'Alice', 'email': '[email protected]'})
r.hgetall('user:1')
# Pub/Sub
r.publish('channel:notifications', 'New message')
# Transactions
pipe = r.pipeline()
pipe.set('key1', 'value1')
pipe.set('key2', 'value2')
pipe.execute()
HTTP Methods:
GET - Retrieve resource (safe, idempotent)
POST - Create resource
PUT - Replace entire resource (idempotent)
PATCH - Partial update
DELETE - Remove resource (idempotent)
Status Codes:
200 OK - Success
201 Created - Resource created
204 No Content - Success, no body
400 Bad Request - Client error
401 Unauthorized - Auth required
403 Forbidden - Not allowed
404 Not Found - Resource missing
500 Internal Server Error
Resource URLs:
GET /api/users # List all
GET /api/users/:id # Get one
POST /api/users # Create
PUT /api/users/:id # Update (full)
PATCH /api/users/:id # Update (partial)
DELETE /api/users/:id # Delete
// Nested resources
GET /api/users/:id/posts # User's posts
POST /api/users/:id/posts # Create post for user
Request/Response Example:
POST /api/users
Content-Type: application/json
{
"name": "Alice",
"email": "[email protected]",
"age": 25
}
Response (201 Created):
{
"id": 123,
"name": "Alice",
"email": "[email protected]",
"age": 25,
"created_at": "2024-01-15T10:30:00Z"
}
# Schema
type User {
id: ID!
name: String!
email: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
content: String!
author: User!
}
type Query {
user(id: ID!): User
users(limit: Int): [User!]!
post(id: ID!): Post
}
type Mutation {
createUser(name: String!, email: String!): User!
updateUser(id: ID!, name: String): User
deleteUser(id: ID!): Boolean!
}
# Query
query GetUserWithPosts {
user(id: "123") {
name
email
posts {
title
id
}
}
}
# Mutation
mutation CreateUser {
createUser(name: "Alice", email: "[email protected]") {
id
name
email
}
}
GraphQL vs REST:
| Aspect | REST | GraphQL |
|---|---|---|
| Over-fetching | Common | None |
| Under-fetching | Need multiple requests | Single query |
| Caching | Easy (HTTP caching) | More complex |
| Learning curve | Low | High |
| Use case | Simple CRUD | Complex, nested data |
Vertical Scaling (Scale Up):
Horizontal Scaling (Scale Out):
Cache Levels:
1. Client-side (browser cache)
2. CDN (edge caching)
3. Application cache (Redis, Memcached)
4. Database (query caching)
Cache Invalidation Strategies:
1. TTL (Time to Live) - Automatic expiration
2. Event-based - Invalidate on change
3. Purge - Manual invalidation
Advantages:
✓ Independent scaling
✓ Technology diversity
✓ Faster deployment
Challenges:
✗ Network latency
✗ Distributed transactions
✗ Operational complexity
Pattern:
API Gateway → Services → Databases
↓
Service Discovery
Message Queue
Logging/Monitoring
Split data across multiple databases
- Range-based: User ID 1-1000 → DB1, 1001-2000 → DB2
- Hash-based: hash(user_id) % num_shards
- Directory-based: Lookup table maps to shard
Tradeoffs:
✓ Horizontal scaling
✗ Complex queries
✗ Operational overhead
Source: https://roadmap.sh/sql, https://roadmap.sh/system-design, https://roadmap.sh/api-design
Project scaffolding, deployment configuration, and CI/CD setup for Google ADK agents.
Set up tracing, logging, and monitoring for deployed ADK agents across Cloud Trace, BigQuery, and third-party platforms.
Enterprise Azure infrastructure architect generating Bicep or Terraform from workload descriptions.
Plan and configure production-ready Azure Kubernetes Service clusters with Day-0 and Day-1 best practices.
Raw mechanical interfaces fusing Swiss typographic print with military terminal aesthetics. Rigid grids, extreme type scale contrast, utilitarian color, analog degradation effects. For data-heavy dashboards, portfolios, or editorial sites that need to feel like declassified blueprints.
Web search, scraping, extraction, crawling, and monitoring via ScrapeGraph AI CLI.
Skill for working with Firebase Hosting (Classic). Use this when you want to deploy static web apps, Single Page Apps (SPAs), or simple microservices. Do NOT use for Firebase App Hosting.
Deploy and manage web apps with Firebase App Hosting. Use this skill when deploying Next.js/Angular apps with backends.
Deploy applications and websites to Vercel. Use when the user requests deployment actions like "deploy my app", "deploy and give me the link", "push this live", or "create a preview deployment".
Build SEO-optimized pages at scale using templates, data, and proven playbook patterns.
Design and build isolated, reusable Convex backend components with clear boundaries and app-facing wrappers.
Deploy and manage projects on Vercel using token-based authentication. Use when working with Vercel CLI using access tokens rather than interactive login — e.g. "deploy to vercel", "set up vercel", "add environment variables to vercel".
Opus.ai: Revolutionize Your Web Experience
Build a no-code AI app in minutes.
An IDE for code migration from legacy to modern frameworks through coding agents.
Automate CGI animation in live-action scenes
Branded artistic QR-code concepts
Launch a website in seconds with AI.
Streamline Your Coding Experience with AI Code Helper
Convert any screenshot or design to clean code.