# octoberswimmer.com > AI-optimized mirror of octoberswimmer.com containing 24 pages totalling 5,098 words of clean markdown content, structured data, and semantic HTML. Original source: https://octoberswimmer.com/. Last updated: 2026-06-16T06:25:24.736Z. Each page is available as HTML (with JSON-LD structured data) and Markdown (text-only, ideal for LLMs and RAG). ## Homepage - [October Swimmer](/content/site-root.html): , Professional Development Tools for Salesforce From planning to production - Salesforce applications and CLI tools for the complete development workflow Your Complete Development Workflow πŸ“‹ Planning p2 πŸ”¨ Building & Testing force-md aer apexfmt Thunder πŸš€ Deploying force πŸ’Ύ Data Management ro batchforce πŸ” Debugging & Performance Apex Flame View All Tools β†’ Trusted By (66 words) ## Articles & Blog Posts - [Examples](/content/tools/batchforce/examples/index.html): Freeze Users Freeze all users with specific profiles by updating UserLogin records. $ batchforce update UserLogin -q "SELECT Id FROM UserLogin WHERE UserId IN (SELECT Id FROM User WHERE Profile.Name IN ('Marketing', 'Customer Support'))" '{Id: record.Id, IsFrozen: true}' Create Notes from Tasks Create new Notes from Tasks linked to specific SObject records by upserting ContentVersion records., Freeze Users Freeze all users with specific profiles by updating UserLogin records. $ batchforce update UserLogin -q "SELECT Id FROM UserLogin WHERE UserId IN (SELECT Id FROM User WHERE Profile.Name IN ('Marketing', 'Customer Support'))" '{Id: record.Id, IsFrozen: true}' Create Notes from Tasks Create new Notes from Tasks linked to specific SObject records by upserting ContentVersion records. (549 words) - [p2 GitHub Project Scheduler](/content/tools/p2/index.html): Coming Soon p2 is a statistical scheduling engine that turns prioritized, estimated tasks into realistic completion date ranges. The p2 GitHub App applies p2 to GitHub Projects by reading issue estimates and dependencies, then automatically calculating and updating completion dates., Coming Soon p2 is a statistical scheduling engine that turns prioritized, estimated tasks into realistic completion date ranges. The p2 GitHub App applies p2 to GitHub Projects by reading issue estimates and dependencies, then automatically calculating and updating completion dates. (512 words) - [Changelog](/content/lunasa/changelog/index.html): Lunasa v1.21 (2023-04-10) Default Account List View Add setting to optionally set the default Account list view Lunasa v1.20 (2023-02-16) Add Event Type Make Event.Type available to the Create Event Field Set Lunasa v1.19 (2020-10-20) Limit Modal Width Restrict the maximum width of the Event editing modal window to avoid stretching fields too much on high resolution screens Lunasa v1.18 (2020-09-24) Single Column Mode Optionally display Event fields in a single column Lunasa v1.16 (2019-12-10) Filter By Sort Field Filter Accounts by any sort field, not just Account Name, Lunasa v1.21 (2023-04-10) Default Account List View Add setting to optionally set the default Account list view Lunasa v1.20 (2023-02-16) Add Event Type Make Event.Type available to the Create Event Field Set Lunasa v1.19 (2020-10-20) Limit Modal Width Restrict the maximum width of the Event editing modal window to avoid stretching fields too much on high resolution screens Lunasa v1.18 (2020-09-24) Single Column Mode Optionally display Event fields in a single column Lunasa v1.16 (2019-12-10) Filter By Sort Field Filter Accounts by any sort field, not just Account Name (408 words) - [Getting Started with aer](/content/tools/aer/getting-started/index.html): Learn how to configure aer for local Apex testing, including packages and data setup., Learn how to configure aer for local Apex testing, including packages and data setup. (869 words) - [Pricing](/content/pricing/index.html): PricingOctober Swimmer offers a comprehensive suite of tools for Salesforce development. Individual Tools Tool Description License Price p2 Project planning and task management Commercial Coming Soon force Get metadata in and out of your org easily Open Source Free force-md Edit metadata easily and keep it tidy Open Source Free aer Run and debug Apex locally Commercial Starting at $25/month apexfmt Keep your code tidy Open Source Free Thunder Build Lightning Experience apps in Go Commercial Coming Soon ro Simple backups Commercial $100/month per org batchforce Keep your data tidy easily Commercial $100/month Apex Flame Debug and profile Apex code Commercial $10/month per org Sponsorship & Custom Features Open Source Sponsorship Need custom features for our free tools? Sponsor development and we’ll build it for everyone., PricingOctober Swimmer offers a comprehensive suite of tools for Salesforce development. Individual Tools Tool Description License Price p2 Project planning and task management Commercial Coming Soon force Get metadata in and out of your org easily Open Source Free force-md Edit metadata easily and keep it tidy Open Source Free aer Run and debug Apex locally Commercial Starting at $25/month apexfmt Keep your code tidy Open Source Free Thunder Build Lightning Experience apps in Go Commercial Coming Soon ro Simple backups Commercial $100/month per org batchforce Keep your data tidy easily Commercial $100/month Apex Flame Debug and profile Apex code Commercial $10/month per org Sponsorship & Custom Features Open Source Sponsorship Need custom features for our free tools? Sponsor development and we’ll build it for everyone. (176 words) - [How to Estimate](/content/tools/p2/docs/how-to-estimate/index.html): p2 schedules best when you provide realistic low and high estimates in hours. Use ranges to capture uncertainty, not just a single number. In p2 Low Estimate - Optimistic estimate in hours High Estimate - Pessimistic estimate in hours Estimate With Ranges Low is a realistic best case, not a miracle. High is a realistic worst case, not a disaster scenario. The person doing the work should own the estimate. Ranges should be wide when the work is unclear and narrower as you learn. Target An 80% Confidence Interval Treat your low and high as an 80% confidence interval. You should be wrong about 1 out of 5 tasks. That is normal and expected. Calibration check: Imagine a wager where you win if the task finishes between your low and high, and lose if it finishes outside the range. Compare that to a simple 80% bet (like roulette with 8 winning numbers out of 10). If you would always take your range bet, the range is too wide. If you would always take roulette, the range is too narrow. This calibration exercise is adapted from Douglas W. Hubbard’s How to Measure Anything., p2 schedules best when you provide realistic low and high estimates in hours. Use ranges to capture uncertainty, not just a single number. In p2 Low Estimate - Optimistic estimate in hours High Estimate - Pessimistic estimate in hours Estimate With Ranges Low is a realistic best case, not a miracle. High is a realistic worst case, not a disaster scenario. The person doing the work should own the estimate. Ranges should be wide when the work is unclear and narrower as you learn. Target An 80% Confidence Interval Treat your low and high as an 80% confidence interval. You should be wrong about 1 out of 5 tasks. That is normal and expected. Calibration check: Imagine a wager where you win if the task finishes between your low and high, and lose if it finishes outside the range. Compare that to a simple 80% bet (like roulette with 8 winning numbers out of 10). If you would always take your range bet, the range is too wide. If you would always take roulette, the range is too narrow. This calibration exercise is adapted from Douglas W. Hubbard’s How to Measure Anything. (339 words) - [Pricing](/content/lunasa/pricing/index.html): Lunasa PricingSubscription Model $10/month per user Monthly billing Cancel anytime Includes support and updates One-Time License $3000 one-time fee Perpetual license Up to 50 users 1 year of support and updates included Additional support available separately Questions? Contact us for any pricing questions or custom requirements., Lunasa PricingSubscription Model $10/month per user Monthly billing Cancel anytime Includes support and updates One-Time License $3000 one-time fee Perpetual license Up to 50 users 1 year of support and updates included Additional support available separately Questions? Contact us for any pricing questions or custom requirements. (63 words) - [apexfmt](/content/tools/apexfmt/index.html): Format Apex code automatically. Usage # Format file to stdout apexfmt MyClass.cls # Format and overwrite files apexfmt -w *.cls *.trigger # Check which files need formatting apexfmt -l sfdx/main/default/classes/*.cls # Format SOQL query echo "SELECT Id, Name FROM Account WHERE Type = 'Customer'" | apexfmt -s # Format from stdin cat MyClass.cls | apexfmt What it does Uses tabs for indentation (like gofmt) Formats method chaining and parameters Properly indents conditionals and loops Formats SOQL queries with line breaks Preserves comments Handles collections and object initialization Options -w, --write - Overwrite files in-place -l, --list - List files that need formatting -s, --soql - Format SOQL from stdin -v, --verbose - Debug logging Installation On macOS and Linux, install with Homebrew:, Format Apex code automatically. Usage # Format file to stdout apexfmt MyClass.cls # Format and overwrite files apexfmt -w *.cls *.trigger # Check which files need formatting apexfmt -l sfdx/main/default/classes/*.cls # Format SOQL query echo "SELECT Id, Name FROM Account WHERE Type = 'Customer'" | apexfmt -s # Format from stdin cat MyClass.cls | apexfmt What it does Uses tabs for indentation (like gofmt) Formats method chaining and parameters Properly indents conditionals and loops Formats SOQL queries with line breaks Preserves comments Handles collections and object initialization Options -w, --write - Overwrite files in-place -l, --list - List files that need formatting -s, --soql - Format SOQL from stdin -v, --verbose - Debug logging Installation On macOS and Linux, install with Homebrew: (163 words) - [Thunder](/content/tools/thunder/index.html): Build Lightning Experience Apps in Go Thunder lets you build Salesforce Lightning Experience applications in Go that compile to WebAssembly. Write type-safe, maintainable applications using the Elm Architecture pattern with professional SLDS-styled components. Key Features Go + WebAssembly - Write Lightning apps in Go, compile to WASM SLDS Components - Complete library of Lightning Design System components Elm Architecture - Predictable state management with masc framework Local Development - Rapid development with hot reload Type Safety - Compile-time checking for reliable applications, Build Lightning Experience Apps in Go Thunder lets you build Salesforce Lightning Experience applications in Go that compile to WebAssembly. Write type-safe, maintainable applications using the Elm Architecture pattern with professional SLDS-styled components. Key Features Go + WebAssembly - Write Lightning apps in Go, compile to WASM SLDS Components - Complete library of Lightning Design System components Elm Architecture - Predictable state management with masc framework Local Development - Rapid development with hot reload Type Safety - Compile-time checking for reliable applications (297 words) - [force-md](/content/tools/force-md/index.html): Edit Salesforce metadata files. Usage # Clean up and sort metadata files force-md tidy src/objects/* src/permissionsets/* # Add Apex class to permission set force-md permissionset apex add -c MyClass src/permissionsets/My_Permission_Set.permissionset # Clone field permissions between fields force-md permissionset field-permissions clone -s Account.Old_Field__c -f Account.New_Field__c src/permissionsets/* # Add object permissions to profiles force-md profile object-permissions add -o Account src/profiles/* # Edit field properties force-md objects fields edit -f My_Field__c -l "New Label" -r src/objects/Account.object # Merge permission sets force-md permissionset merge -s src/permissionsets/Subset.permissionset src/permissionsets/Superset.permissionset What it does Tidy metadata - Clean up and sort XML files consistently Permission sets - Add/edit Apex, object, field, and tab permissions Profiles - Manage object permissions and settings Objects - Edit field properties, validation rules, record types Package.xml - Add/remove metadata types and components Installation Built with Go. Download binary or:, Edit Salesforce metadata files. Usage # Clean up and sort metadata files force-md tidy src/objects/* src/permissionsets/* # Add Apex class to permission set force-md permissionset apex add -c MyClass src/permissionsets/My_Permission_Set.permissionset # Clone field permissions between fields force-md permissionset field-permissions clone -s Account.Old_Field__c -f Account.New_Field__c src/permissionsets/* # Add object permissions to profiles force-md profile object-permissions add -o Account src/profiles/* # Edit field properties force-md objects fields edit -f My_Field__c -l "New Label" -r src/objects/Account.object # Merge permission sets force-md permissionset merge -s src/permissionsets/Subset.permissionset src/permissionsets/Superset.permissionset What it does Tidy metadata - Clean up and sort XML files consistently Permission sets - Add/edit Apex, object, field, and tab permissions Profiles - Manage object permissions and settings Objects - Edit field properties, validation rules, record types Package.xml - Add/remove metadata types and components Installation Built with Go. Download binary or: (179 words) - [Lunasa](/content/lunasa/index.html): Simple meeting and appointment scheduling straight from your Salesforce accounts. Schedule events for any account all on one screen. Drag and drop scheduler let’s you plan your day, week, and month, all on one page. Manage your calendar and make appointments quickly and easily with Lunasa. β€Ή β€Ί Features Native Force.com App Lunasa runs entirely within your Salesforce org., Simple meeting and appointment scheduling straight from your Salesforce accounts. Schedule events for any account all on one screen. Drag and drop scheduler let’s you plan your day, week, and month, all on one page. Manage your calendar and make appointments quickly and easily with Lunasa. β€Ή β€Ί Features Native Force.com App Lunasa runs entirely within your Salesforce org. (133 words) - [batchforce](/content/tools/batchforce/index.html): Bulk operations for Salesforce data. Usage # Update records from query batchforce update --query "SELECT Id, Name FROM Account" Account '{Id: record.Id, Name: record.Name + " Updated"}' # Insert new records from existing batchforce insert --query "SELECT Id, Name FROM Account WHERE Type = 'Customer'" Account '{Name: record.Name + " Copy"}' # Upsert from CSV with external ID batchforce upsert --external-id External_Id__c --file accounts.csv Account '{Name: record.Name}' # Delete with conditional logic batchforce delete --query "SELECT Id, Name FROM Account" Account 'record.Name matches "test.*" ? {Id: record.Id} : nil' # Dry run to preview changes batchforce update --dry-run --query "SELECT Id, Name FROM Account LIMIT 5" Account '{Id: record.Id, Name: "Test"}' Why use batchforce? Handles large datasets: Millions of records, automatic batching Error recovery: Failed records reported, partial success handling Flexible operations: Update, delete, upsert, transform Validation: Dry-run mode, data validation before commit Pricing Enterprise: $100/month per org (unlimited users) Consulting: $100/month per user (unlimited orgs), Bulk operations for Salesforce data. Usage # Update records from query batchforce update --query "SELECT Id, Name FROM Account" Account '{Id: record.Id, Name: record.Name + " Updated"}' # Insert new records from existing batchforce insert --query "SELECT Id, Name FROM Account WHERE Type = 'Customer'" Account '{Name: record.Name + " Copy"}' # Upsert from CSV with external ID batchforce upsert --external-id External_Id__c --file accounts.csv Account '{Name: record.Name}' # Delete with conditional logic batchforce delete --query "SELECT Id, Name FROM Account" Account 'record.Name matches "test.*" ? {Id: record.Id} : nil' # Dry run to preview changes batchforce update --dry-run --query "SELECT Id, Name FROM Account LIMIT 5" Account '{Id: record.Id, Name: "Test"}' Why use batchforce? Handles large datasets: Millions of records, automatic batching Error recovery: Failed records reported, partial success handling Flexible operations: Update, delete, upsert, transform Validation: Dry-run mode, data validation before commit Pricing Enterprise: $100/month per org (unlimited users) Consulting: $100/month per user (unlimited orgs) (216 words) - [Tools](/content/tools/index.html): Planning p2 - GitHub App for automatic project scheduling Learn more β†’ Building and Testing force-md - Edit metadata files force-md permissionset apex add -c MyClass src/permissionsets/*.permissionset Documentation β†’ force - CLI for Salesforce APIs force query "SELECT Id, Name FROM Account LIMIT 10" Documentation β†’ aer - Local Apex interpreter and test runner aer test force-app/ -f MyTest, Planning p2 - GitHub App for automatic project scheduling Learn more β†’ Building and Testing force-md - Edit metadata files force-md permissionset apex add -c MyClass src/permissionsets/*.permissionset Documentation β†’ force - CLI for Salesforce APIs force query "SELECT Id, Name FROM Account LIMIT 10" Documentation β†’ aer - Local Apex interpreter and test runner aer test force-app/ -f MyTest (154 words) - [Docs](/content/tools/aer/docs/index.html): Getting Started Guide β†’ Test-Driven Development β†’ Interactive Debugging β†’ Debug in IntelliJ β†’ Mock Managed Package Classes β†’ Profiling and Tracing β†’ GitHub Actions CI β†’ Development Server β†’ FAQ β†’ Generated reference aer command reference β†’ Documentation for aer v1.0.0, Getting Started Guide β†’ Test-Driven Development β†’ Interactive Debugging β†’ Debug in IntelliJ β†’ Mock Managed Package Classes β†’ Profiling and Tracing β†’ GitHub Actions CI β†’ Development Server β†’ FAQ β†’ Generated reference aer command reference β†’ Documentation for aer v1.0.0 (61 words) - [ro](/content/tools/ro/index.html): Export Salesforce data to files. Usage # Back up all objects ro -e login.salesforce.com # Back up using the OAuth Username/Password flow ro -e login.salesforce.com -u username@org.example.com -p passwordToken \ --connected-app=$CONSUMER_KEY --consumer-secret=$CONSUMER_SECRET # Back up using the OAuth Device Flow (headless) ro -e login.salesforce.com --device-flow # Back up specific objects ro Opportunity My_Custom_Object__c Document # Export to different formats ro --format csv ro --format json ro --format parquet # Back up to a database ro -D backup.db Why use ro? Fast: Parallel processing, optimized queries Flexible: CSV, JSON, Parquet output formats Reliable: Handles API limits, retries failed requests Simple: One command to export any object Installation If you use Homebrew, install ro with:, Export Salesforce data to files. Usage # Back up all objects ro -e login.salesforce.com # Back up using the OAuth Username/Password flow ro -e login.salesforce.com -u username@org.example.com -p passwordToken \ --connected-app=$CONSUMER_KEY --consumer-secret=$CONSUMER_SECRET # Back up using the OAuth Device Flow (headless) ro -e login.salesforce.com --device-flow # Back up specific objects ro Opportunity My_Custom_Object__c Document # Export to different formats ro --format csv ro --format json ro --format parquet # Back up to a database ro -D backup.db Why use ro? Fast: Parallel processing, optimized queries Flexible: CSV, JSON, Parquet output formats Reliable: Handles API limits, retries failed requests Simple: One command to export any object Installation If you use Homebrew, install ro with: (181 words) - [Apex Flame](/content/tools/apex-flame/index.html): Apex Flame is a tool for profiling Salesforce applications by visualizing the information in debug logs. Features Native Force.com App Apex Flame runs entirely within your Salesforce org. Profile Salesforce Applications Visually Quickly identify where time is being spent in your Salesforce applications. Identify code paths executing many SOQL queries. Drill Down Drill down into a flame graph to explore details., Apex Flame is a tool for profiling Salesforce applications by visualizing the information in debug logs. Features Native Force.com App Apex Flame runs entirely within your Salesforce org. Profile Salesforce Applications Visually Quickly identify where time is being spent in your Salesforce applications. Identify code paths executing many SOQL queries. Drill Down Drill down into a flame graph to explore details. (221 words) - [The New New Way](/content/tools/aer/the-new-new-way/index.html): A short, funny video about pairing aer with a coding agent: write Apex at light speed, then verify it instantly instead of waiting on deploys, scratch orgs, and the CI queue., A short, funny video about pairing aer with a coding agent: write Apex at light speed, then verify it instantly instead of waiting on deploys, scratch orgs, and the CI queue. (170 words) - [The Old Way](/content/tools/aer/the-old-way/index.html): A short video introducing aer and the slow, deploy-and-wait Apex development loop it replaces., A short video introducing aer and the slow, deploy-and-wait Apex development loop it replaces. (101 words) - [force cli](/content/tools/force/index.html): Command-line interface to Salesforce for managing metadata, executing queries, and deploying code. Usage # Log in to Salesforce force login # Log in to sandbox force login -i example.sandbox.my.salesforce.com # Push metadata force push -t ApexClass -n MyClass # Execute SOQL query force query "SELECT Id, Name FROM Account LIMIT 5" # Run Apex tests force test MyClass_Test Why use force cli? Fast deployment: Quick metadata push/pull operations Multi-org support: Manage multiple Salesforce environments Automation-ready: Script your Salesforce operations Metadata management: Create objects, fields, and other metadata from command line Price Free - Open source, Command-line interface to Salesforce for managing metadata, executing queries, and deploying code. Usage # Log in to Salesforce force login # Log in to sandbox force login -i example.sandbox.my.salesforce.com # Push metadata force push -t ApexClass -n MyClass # Execute SOQL query force query "SELECT Id, Name FROM Account LIMIT 5" # Run Apex tests force test MyClass_Test Why use force cli? Fast deployment: Quick metadata push/pull operations Multi-org support: Manage multiple Salesforce environments Automation-ready: Script your Salesforce operations Metadata management: Create objects, fields, and other metadata from command line Price Free - Open source (128 words) - [Docs](/content/tools/batchforce/docs/index.html): Examples β†’ Command reference β†’ Documentation for batchforce v0.10.0, Examples β†’ Command reference β†’ Documentation for batchforce v0.10.0 (37 words) - [Docs](/content/tools/force-md/docs/index.html): force-md command reference β†’ Documentation for force-md v0.40.1, force-md command reference β†’ Documentation for force-md v0.40.1 (37 words) - [Docs](/content/tools/apexfmt/docs/index.html): apexfmt command reference β†’ Documentation for apexfmt v0.55.0, apexfmt command reference β†’ Documentation for apexfmt v0.55.0 (37 words) - [sitemap-xml.html](/content/sitemap-xml.html) (1 words) ## Resources - [Full Page Index](/index.html): Browse all cached pages with rich metadata - [About This Cache](/content/about.html): Methodology, technical details, and usage guidelines - [XML Sitemap](/sitemap.xml): Machine-readable sitemap for crawler discovery - [Robots.txt](/robots.txt): Crawler directives