Thank you for your interest in contributing to the Open Accounting Interchange Format! This document provides guidelines for contributing to the project.
- Code of Conduct
- Ways to Contribute
- Reporting Issues
- Proposing Changes
- Extension Process
- Pull Request Guidelines
- Style Guidelines
This project follows the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to [conduct@oaif.org].
Found an issue with the specification, schema, or tools? Open an issue.
Have an idea for improving OAIF? Start a discussion.
- Fix typos or unclear wording
- Add examples
- Translate to other languages
- Improve platform mapping tables
Create converters, validators, or integrations:
- Import/export tools for accounting software
- Validation utilities
- Language bindings
- IDE plugins
Help document field mappings for:
- Accounting software not yet covered
- Regional/localized versions
- Industry-specific systems
See Extension Process below.
When reporting bugs, please include:
- Summary: Clear, concise description
- Environment: OS, SQLite version, tool version
- Steps to Reproduce: Numbered steps
- Expected Behavior: What should happen
- Actual Behavior: What actually happens
- Sample File: If applicable (redact sensitive data!)
Do not open public issues for security vulnerabilities.
Instead, email [security@oaif.org] with:
- Description of the vulnerability
- Steps to reproduce
- Potential impact
We will respond within 48 hours.
Changes to the core specification require discussion:
- Open a Discussion: Explain the problem and proposed solution
- Gather Feedback: Allow at least 2 weeks for community input
- Draft RFC: Write a formal proposal if there's support
- Review Period: Minimum 30 days for major changes
- Vote/Consensus: Major changes require rough consensus
For changes to oaif_schema.sql:
- Backward Compatibility: Changes must not break existing files
- Migration Path: Document how to upgrade existing files
- Tests: Include validation queries
- Documentation: Update spec and mappings
For tools in the tools/ directory:
- Tests Required: Include unit tests
- Documentation: Update usage instructions
- Cross-Platform: Test on Linux, macOS, Windows
OAIF supports three levels of extensions:
Anyone can create these immediately.
- Namespace:
vendor.yourcompany.TYPE - Table prefix:
vendor_yourcompany_ - No approval needed
- Document in your own repo
Example:
-- Vendor transaction type
INSERT INTO transaction_type (name, description, is_standard)
VALUES ('vendor.acme.CUSTOM_INVOICE', 'Acme custom invoice type', 0);
-- Vendor table
CREATE TABLE vendor_acme_custom_data (
id INTEGER PRIMARY KEY,
txn_header_id INTEGER REFERENCES txn_header(id),
acme_specific_field TEXT
);Community-reviewed extensions with broader applicability.
- Submit RFC: Open issue with
[RFC]prefix - Required sections:
- Problem statement
- Proposed solution
- Use cases (minimum 2 different platforms)
- Schema changes
- Example data
- Review period: 60 days minimum
- Namespace:
ext.name.TYPE(assigned after approval)
Proven extensions promoted to core specification.
Requirements:
- Active use by 3+ implementations
- 6+ months in production
- No unresolved issues
- Full documentation
- Test coverage
Process:
- Nominate via issue
- 90-day review period
- Consensus approval
- Promotion to UPPERCASE standard type
- Search existing issues/PRs for duplicates
- For spec changes, ensure discussion has occurred
- Run any applicable tests
- Update documentation
Title: Clear, descriptive (e.g., "Add INVEST_SPINOFF transaction type")
Description:
## Summary
Brief description of changes
## Motivation
Why is this change needed?
## Changes
- List of changes
- In bullet points
## Testing
How was this tested?
## Checklist
- [ ] Spec updated
- [ ] Schema updated
- [ ] Mappings updated
- [ ] Tests pass- Automated checks must pass
- At least one maintainer review
- Address feedback
- Squash commits if requested
- Maintainer merges
- Use Markdown
- One sentence per line (easier diffs)
- Code blocks for SQL, JSON, examples
- Tables for mappings and comparisons
-- Table names: snake_case
CREATE TABLE transaction_type (
-- Columns: snake_case
id INTEGER PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
description TEXT,
-- Foreign keys at end
parent_id INTEGER REFERENCES parent_table(id),
-- Metadata columns last
source_id TEXT,
source_raw TEXT
);
-- Indexes named: idx_table_column
CREATE INDEX idx_txn_header_date ON txn_header(txn_date);| Type | Convention | Example |
|---|---|---|
| Standard | UPPERCASE | INVOICE, JOURNAL |
| Proposed Extension | ext.name.TYPE | ext.nonprofit.GRANT |
| Vendor | vendor.company.TYPE | vendor.quickbooks.MEMORIZED |
- Use present tense ("Adds feature" not "Added feature")
- Start descriptions with capital letter
- No period at end of bullet points
- Period at end of complete sentences
Contributors are recognized in:
- CONTRIBUTORS.md - All contributors
- Release notes - Significant contributions
- README acknowledgments - Major features
- General questions: Discussions
- Specification questions: Open an issue with
[Question]tag - Tool support: Open an issue in the tool's repository
Thank you for contributing to OAIF! Your efforts help free accounting data for everyone. 🎉