Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Simbotix/simbotix_core

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Simbotix Core

Shared licensing and metering foundation for all Simbotix apps.

Overview

simbotix_core is the foundation Frappe app that provides shared infrastructure for all Simbotix applications:

  1. License Validation - Gatekeeper pattern with decorators for feature/app access control
  2. Usage Metering - Batch aggregation of resource consumption with hourly sync to central
  3. Alert Management - Threshold-based notifications (80% warning, 100% hard limit)
  4. Central API Integration - Two-way sync with simbotix.com for license and usage data

All Simbotix apps depend on simbotix_core for licensing checks and metering.

Architecture

┌─────────────────────────────────────────────────────────┐
│        Simbotix Apps (flowz, botz_studio, etc.)         │
└──────────────────┬──────────────────────────────────────┘
                   │ depends_on
                   ▼
┌─────────────────────────────────────────────────────────┐
│             simbotix_core (this app)                    │
│  ┌──────────────────────────────────────────────────┐  │
│  │ Licensing Layer                                  │  │
│  │ - @requires_license decorator                   │  │
│  │ - License validation + Redis caching            │  │
│  │ - Feature/App access control                    │  │
│  └──────────────────────────────────────────────────┘  │
│  ┌──────────────────────────────────────────────────┐  │
│  │ Metering Layer                                   │  │
│  │ - @requires_quota decorator                     │  │
│  │ - Usage recording (batch)                       │  │
│  │ - Aggregation (hourly) → Sync (hourly)          │  │
│  └──────────────────────────────────────────────────┘  │
│  ┌──────────────────────────────────────────────────┐  │
│  │ Alert Layer                                      │  │
│  │ - Threshold-based notifications                 │  │
│  │ - Overage cost calculation                      │  │
│  │ - Email notifications                           │  │
│  └──────────────────────────────────────────────────┘  │
└────────────────┬───────────────────────────────────────┘
                 │ HTTP API (HMAC-SHA256 signed)
                 ▼
    ┌──────────────────────────────┐
    │   simbotix.com (Central)     │
    │  - License authority         │
    │  - Usage aggregation         │
    │  - Billing & reporting       │
    └──────────────────────────────┘

Installation

# Add to your site
bench get-app https://github.com/Simbotix/simbotix_core
bench --site your-site install-app simbotix_core

# Configure license
# Go to: Simbotix Core Settings
# Enter your API credentials and license key from simbotix.com

DocTypes

App License

Local cache of licenses synced from central simbotix.com.

Field Type Description
license_key Data UUID-format license key
customer_id Data Central customer ID
tier Select Trial, Pioneer, Builder, Visionary, Legend
status Select Active, Suspended, Expired, Cancelled, Trial
expiry_date Date Blank = lifetime license
resource_limits JSON {storage_gb, bandwidth_gb, api_calls, ...}
enabled_features JSON ["webhooks", "ai_agents", ...]
enabled_apps JSON ["flowz", "botz_studio", ...]

Simbotix Core Settings

Global configuration (Single document).

Field Type Description
central_api_url Data Base URL (default: https://simbotix.com/api)
api_key Data Site API key from simbotix.com
api_secret Password Site API secret
license_key Data Active license key
warning_threshold Percent Alert threshold (default: 80%)
hard_limit_threshold Percent Hard limit (default: 100%)
block_on_exceeded Check Block actions vs allow overage

Usage Record

Individual usage events, aggregated hourly then synced.

Field Type Description
resource_type Select Type of resource consumed
quantity Float Amount consumed (e.g., 0.001 GB)
app_name Data Source app
aggregated Check Whether record has been aggregated
synced Check Whether synced to central

Usage Alert

Threshold notifications when usage crosses warning/hard limits.

Field Type Description
resource_type Select Resource that triggered alert
alert_type Select Warning (80%), Exceeded (100%), Blocked
current_usage Float Current usage value
limit_value Float Limit value
overage_amount Currency Estimated overage charges

Usage

Decorators

from simbotix_core.utils.licensing import requires_license, requires_quota

# Require a specific feature
@requires_license(feature="webhooks")
def create_webhook(doc, method):
    pass

# Require a specific app
@requires_license(app="flowz")
def execute_workflow(workflow_id):
    pass

# Check quota and record usage (1 unit)
@requires_quota(resource="api_calls")
@frappe.whitelist()
def my_api_endpoint():
    return {"data": "..."}

# Record multiple units
@requires_quota(resource="emails", quantity=5)
def send_bulk_email(recipients):
    pass

Functions

from simbotix_core.utils.licensing import (
    is_licensed,
    get_license,
    get_license_tier,
    get_resource_limit,
    get_enabled_features,
    get_enabled_apps,
    sync_license
)

from simbotix_core.utils.metering import (
    record_usage,
    get_current_usage,
    get_all_usage,
    get_usage_percentage,
    check_limits,
    calculate_overage
)

# Check if licensed
if is_licensed(feature="ai_agents"):
    # Feature is available
    pass

if is_licensed(app="flowz"):
    # App is licensed
    pass

# Get full license info
license = get_license()
# Returns: {license_key, customer_id, tier, status, is_valid,
#           resource_limits, enabled_features, enabled_apps}

# Get current tier
tier = get_license_tier()  # "Builder"

# Get resource limit
limit = get_resource_limit("storage_gb")  # 30.0 (0 = unlimited)

# Get enabled features/apps
features = get_enabled_features()  # ["webhooks", "funnel_analytics"]
apps = get_enabled_apps()  # ["flowz", "botz_studio"]

# Record usage manually
record_usage("executions", 1, app_name="flowz")
record_usage("storage_gb", 0.005, app_name="my_app", doctype="File", docname="file123")

# Check current usage
current = get_current_usage("api_calls")  # 45000
all_usage = get_all_usage()  # {storage_gb: 15.5, api_calls: 45000, ...}

# Get percentage of limit used
pct = get_usage_percentage("emails")  # 75.5

# Check limit status
status = check_limits("api_calls")  # "ok" | "warning" | "exceeded"

# Calculate overage
overage = calculate_overage("storage_gb")
# Returns: {exceeded_by: 5.5, overage_cost: 8.25, rate: 1.50}

Central API Client

from simbotix_core.utils.central_api import get_api_client

client = get_api_client()

# Validate license
result = client.validate_license("license-key-uuid")
# Returns: {valid: True, license: {...}, message: "..."}

# Get license details
details = client.get_license_details("license-key-uuid")

# Report usage
client.report_usage("license-key-uuid", [
    {"resource": "api_calls", "quantity": 1000, "period_start": "...", "period_end": "..."}
])

# Heartbeat
result = client.heartbeat("license-key-uuid", {"site": "mysite.com", "version": "1.0"})
# Returns: {acknowledged: True, commands: [...]}

Resource Types

Resource Description Tracked By
storage_gb Storage consumption File uploads (auto)
bandwidth_gb Bandwidth usage Response size
database_gb Database size Daily check
api_calls API call count @requires_quota
file_uploads_gb Monthly uploads File doctype (auto)
executions Workflow runs FlowZ/BotZ
emails Emails sent Email Queue (auto)
ai_queries AI API calls AI endpoints
webhooks Active webhooks Count

Tier Limits

Resource Trial Pioneer Builder Visionary Legend
Storage (GB) 1 10 30 75 150
Bandwidth (GB) 10 100 300 750 Unlimited
Database (GB) 0.5 2 5 15 50
API Calls 5K 50K 200K 1M Unlimited
File Uploads (GB) 1 5 15 50 Unlimited
Executions 1K 10K 50K Unlimited Unlimited
Emails 100 1K 5K 20K Unlimited
AI Queries 0 0 1K 5K 20K
Webhooks 2 5 20 Unlimited Unlimited

Note: Starter, Growth, Scale, Enterprise map to Pioneer, Builder, Visionary, Legend respectively

Overage Pricing

Resource Rate Unit
storage_gb $1.50 per GB/month
bandwidth_gb $0.08 per GB
database_gb $3.00 per GB/month
api_calls $0.50 per 10K calls
file_uploads_gb $1.50 per GB/month
executions $2.00 per 10K executions
emails $1.00 per 1K emails
ai_queries $0.015 per query
webhooks $0 (no overage)

API Endpoints

License Queries

# Get license info
GET /api/method/simbotix_core.api.licensing.get_license_info
# Returns: {success, license: {tier, status, is_valid, expiry_date, ...}}

# Get usage summary
GET /api/method/simbotix_core.api.licensing.get_usage_summary
# Returns: {success, tier, usage: {resource: {current, limit, percentage, status}}}

# Check feature
GET /api/method/simbotix_core.api.licensing.check_feature?feature=webhooks
# Returns: {licensed: bool, tier: str}

# Check app
GET /api/method/simbotix_core.api.licensing.check_app?app_name=flowz
# Returns: {licensed: bool, tier: str}

Overage & Alerts

# Get overage estimate
GET /api/method/simbotix_core.api.licensing.get_overage_estimate
# Returns: {success, overages: {...}, total_estimated_cost}

# Get pending alerts
GET /api/method/simbotix_core.api.licensing.get_pending_alerts
# Returns: {success, alerts: [...], count}

# Acknowledge alert
POST /api/method/simbotix_core.api.licensing.acknowledge_alert?alert_name=UA-2025-01-00001
# Returns: {success, message}

Sync

# Manual sync
POST /api/method/simbotix_core.api.licensing.sync_now
# Returns: {success, message, license: {...}}

Scheduler Tasks

Task Frequency Description
sync_license Hourly Sync license from central
aggregate_usage Hourly Group individual records by resource+hour
sync_usage_to_central Hourly Send aggregated usage to simbotix.com
check_all_limits Hourly Create alerts for thresholds
cleanup_old_records Daily Delete synced records older than 30 days

Document Events (Auto-tracking)

The following are automatically tracked:

  • File.after_insert → Records storage_gb usage
  • Email Queue.after_insert → Records emails usage

Adding as Dependency

In your app's hooks.py:

required_apps = ["frappe", "simbotix_core"]

Caching

Redis cache keys (5-minute TTL by default):

  • simbotix_license_cache - Active license key
  • simbotix_license_data - Full license document
  • simbotix_core_settings - Settings document

Cache is automatically invalidated on:

  • App License save
  • Simbotix Core Settings save
  • Manual sync via API

Flow Examples

License Check Flow

App calls @requires_license(feature="x")
  ↓
Check Redis cache → (miss) → Fetch App License document
  ↓
Validate status & expiry
  ↓
Check feature in enabled_features
  ↓ (success)
Execute function
  ↓ (failure)
Raise PermissionError

Usage Metering Flow

App calls record_usage("api_calls", 1)
  ↓
Enqueue background job → Create Usage Record
  ↓
Hourly: aggregate_usage() → Groups by resource+hour
  ↓
Hourly: sync_usage_to_central() → POST to simbotix.com
  ↓
Daily: cleanup_old_records() → Delete synced records >30 days

Alert Flow

Hourly: check_all_limits()
  ↓
Compare current usage vs limit vs thresholds
  ↓
At 80%: Create Warning alert → Send email
  ↓
At 100%: Create Exceeded alert → Send email (optionally block)
  ↓
User acknowledges via API or desk

Testing

Run tests with:

bench --site your-site run-tests --app simbotix_core

Test files:

  • test_app_license.py - License document tests
  • test_simbotix_core_settings.py - Settings tests
  • test_usage_alert.py - Alert tests
  • test_usage_record.py - Usage record tests
  • test_api.py - API endpoint tests
  • test_licensing.py - Licensing utility tests
  • test_metering.py - Metering utility tests
  • test_central_api.py - Central API client tests

Configuration

Go to Simbotix Core Settings to configure:

Setting Default Description
Central API URL https://simbotix.com/api Central server URL
API Key - Site API key from simbotix.com
API Secret - Site API secret
License Key - Active license key
Sync Interval (hours) 1 1-24 hours
Warning Threshold 80% Alert when usage reaches this %
Hard Limit Threshold 100% Block/overage when usage reaches this %
Block on Exceeded No Block actions (Yes) or allow overage (No)
Use Redis Cache Yes Cache license in Redis
Cache TTL (seconds) 300 Cache expiry time
Alert Email - Email for notifications

License

MIT

Author

Rajesh Medampudi rajesh@simbotix.com

About

Shared licensing and metering foundation for all Simbotix Frappe apps

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.