{"id":48644065,"url":"https://github.com/pedrosakuma/sbesourcegenerator","last_synced_at":"2026-04-25T20:01:55.978Z","repository":{"id":334236695,"uuid":"782249296","full_name":"pedrosakuma/SbeSourceGenerator","owner":"pedrosakuma","description":"Roslyn incremental source generator that converts FIX SBE XML schemas into zero-allocation C# structs with explicit memory layout. AOT-compatible, zero dependencies.","archived":false,"fork":false,"pushed_at":"2026-04-25T02:41:33.000Z","size":1197,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-25T04:24:42.032Z","etag":null,"topics":["binary-encoding","code-generation","csharp","dotnet","fix-protocol","high-performance","roslyn","sbe","source-generator","zero-allocation"],"latest_commit_sha":null,"homepage":"https://www.nuget.org/packages/SbeSourceGenerator/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pedrosakuma.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-04-04T23:29:15.000Z","updated_at":"2026-04-25T02:41:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pedrosakuma/SbeSourceGenerator","commit_stats":null,"previous_names":["pedrosakuma/sbesourcegenerator"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/pedrosakuma/SbeSourceGenerator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrosakuma%2FSbeSourceGenerator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrosakuma%2FSbeSourceGenerator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrosakuma%2FSbeSourceGenerator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrosakuma%2FSbeSourceGenerator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pedrosakuma","download_url":"https://codeload.github.com/pedrosakuma/SbeSourceGenerator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrosakuma%2FSbeSourceGenerator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32274982,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T18:29:39.964Z","status":"ssl_error","status_checked_at":"2026-04-25T18:29:32.149Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["binary-encoding","code-generation","csharp","dotnet","fix-protocol","high-performance","roslyn","sbe","source-generator","zero-allocation"],"created_at":"2026-04-10T00:14:07.493Z","updated_at":"2026-04-25T20:01:55.971Z","avatar_url":"https://github.com/pedrosakuma.png","language":"C#","readme":"# SBE Code Generator for C#\n\n[![CI](https://github.com/pedrosakuma/SbeSourceGenerator/actions/workflows/ci.yml/badge.svg)](https://github.com/pedrosakuma/SbeSourceGenerator/actions/workflows/ci.yml)\n[![NuGet](https://img.shields.io/nuget/v/SbeSourceGenerator.svg)](https://www.nuget.org/packages/SbeSourceGenerator/)\n[![NuGet Downloads](https://img.shields.io/nuget/dt/SbeSourceGenerator.svg)](https://www.nuget.org/packages/SbeSourceGenerator/)\n\nA Roslyn-based source generator that converts FIX Simple Binary Encoding (SBE) XML schemas into efficient, type-safe C# code.\n\n## Features\n\n- All SBE primitive types (int8–int64, uint8–uint64, float, double, char)\n- Message encoding/decoding with proper field layout\n- Optional fields with null value semantics\n- Composite types (nested composites, `\u003cref\u003e` elements)\n- Enumerations and bit sets (flag enums) with `Has(flag)` / `Is{Flag}()` extension helpers\n- Repeating groups with nested groups (unlimited depth, ancestor context callbacks with `in`)\n- `foreach`-style zero-allocation enumerator on simple top-level groups (v1.5.0)\n- Variable-length data (varData) with configurable length prefix (uint8/uint16/uint32)\n- Constant fields in messages, composites, and groups\n- Derived numeric constants (`MinValue`/`MaxValue` on type wrappers; `Decimals`/`Multiplier`/`MultiplierDecimal`/`Divisor` on decimal composites)\n- Allocation-free formatting via `ISpanFormattable` on char types and decimal composites; `AsTrimmedSpan()` on InlineArray char types\n- Static header parsing helpers (`TryReadTemplateId` / `TryReadHeader`) on the message header composite\n- Automatic and explicit field offset calculation\n- Byte order handling (little-endian native, big-endian with `readonly` property-based conversion)\n- Schema versioning (`sinceVersion`, `deprecated` on fields, enums, sets, data) with per-message `{Msg}VersionMap` for `blockLength → version` lookup\n- Schema evolution forward/backward compatibility via `TryReadBlock\u003cT\u003e`\n- Cross-schema coexistence (multiple schemas with isolated namespaces)\n- Custom `headerType` support\n- `characterEncoding` attribute (UTF-8, Latin1)\n- Explicit `blockLength` on messages\n- Validation constraints (min/max ranges)\n- Zero-cost `SbeDispatcher` + `ISbeMessageHandler` for devirtualized message routing\n- Comprehensive build-time diagnostics (SBE001–SBE014)\n\n## What's New in v1.5.0\n\n```csharp\n// #156: foreach-style enumerator for top-level simple groups — zero alloc, no closure capture\nif (OrderBookData.TryParse(buffer, out var reader))\n{\n    foreach (ref readonly var bid in reader.Bids) Process(in bid);\n    foreach (ref readonly var ask in reader.Asks) Process(in ask);\n}\n```\n\nIndependent per-group views — out-of-order access, early `break`, and repeated iteration are all safe (no shared cursor). Emitted only when all top-level groups are simple (no nested groups, no group-level varData); otherwise `ReadGroups` remains the only API.\n\n## What's New in v1.4.0\n\n```csharp\n// #155: AsTrimmedSpan — like AsSpan but strips trailing space/null padding (FIX convention) without allocating.\nReadOnlySpan\u003cbyte\u003e sym = msg.Symbol.AsTrimmedSpan();\nif (sym.SequenceEqual(\"PETR4\"u8)) { /* ... */ }\n\n// #153: ISpanFormattable on char types and decimal composites — allocation-free formatting\nSpan\u003cchar\u003e dest = stackalloc char[32];\nmsg.Price.TryFormat(dest, out int written, default, CultureInfo.InvariantCulture);\n\n// #156 (helpers): single source of truth for header layout\nif (MessageHeader.TryReadHeader(buffer, out var blockLength, out var templateId, out var schemaId, out var version))\n{\n    // dispatch without hardcoding offsets\n}\n```\n\n## What's New in v1.2.0\n\nFour additive consumer-ergonomics features — all emit-time only, zero impact on the encode/decode hot path:\n\n```csharp\n// #144: inlinable bit-test helpers on [Flags] sets\nif (order.Flags.IsOddLot() \u0026\u0026 order.Flags.Has(TradingFlags.PreMarket | TradingFlags.AfterHours)) { ... }\n\n// #145: derived constants on decimal composites\ndecimal price = mantissa * Price.MultiplierDecimal;          // single source of truth for scale\nstring formatted = price.ToString($\"F{Price.Decimals}\");\n\n// #146: blockLength → version lookup for evolved messages\nif (EvolvingOrderVersionMap.TryGetVersion(header.BlockLength, out int version)) { ... }\n\n// #147: zero-cost devirtualized dispatch (struct handler is JIT-specialized)\nstruct MyHandler : ISbeMessageHandler {\n    public void OnTrade(in TradeDataReader r, int blockLength, int version) { /* hot path */ }\n    /* ... OnXxx for each message ... */\n    public void OnUnknownMessage(int templateId, int blockLength, int version, ReadOnlySpan\u003cbyte\u003e payload) { }\n}\nvar handler = new MyHandler();\nSbeDispatcher.Dispatch(buffer, ref handler);\n```\n\nSee the [v1.2.0 entry in CHANGELOG.md](./CHANGELOG.md) for the full list.\n\n## What's New in v1.0.0\n\n**Zero-copy `MessageDataReader`** — `TryParse` returns a lightweight ref struct that holds a reference directly into the buffer. Access fields via `reader.Data` (zero-copy `ref readonly`), iterate top-level groups via `foreach` (since v1.5.0, no closure alloc) or `reader.ReadGroups(...)`, and recover the raw wire bytes via `reader.Buffer` / `reader.Block` (since v1.3.0) for replay/forwarding scenarios.\n\n```csharp\nif (CarData.TryParse(buffer, out var car))\n{\n    Console.WriteLine(car.Data.SerialNumber);  // zero-copy field access\n\n    // v1.5.0: foreach-style enumerators on simple top-level groups (zero alloc, no closures).\n    foreach (ref readonly var fuel in car.FuelFigures) { /* ... */ }\n\n    // For groups with nested groups or group-level varData, ReadGroups remains:\n    car.ReadGroups(\n        (in FuelFiguresData fuel) =\u003e { /* ... */ },\n        (in PerformanceFiguresData perf, AccelerationData.AccelerationHandler onAccel) =\u003e { /* ... */ });\n    Console.WriteLine($\"Total bytes: {car.BytesConsumed}\");\n}\n```\n\n\u003e **Migrating from v0.9.x?** See the [migration guide in CHANGELOG.md](./CHANGELOG.md#100---2026-04-10).\n\n## Quick Start\n\n### 1. Install\n\nInstall the NuGet package:\n\n```bash\ndotnet add package SbeSourceGenerator\n```\n\nOr add it directly to your `.csproj`:\n\n```xml\n\u003cItemGroup\u003e\n  \u003cPackageReference Include=\"SbeSourceGenerator\" Version=\"1.0.2\" /\u003e\n\u003c/ItemGroup\u003e\n```\n\n\u003e **For local development**, use a project reference instead:\n\u003e ```xml\n\u003e \u003cItemGroup\u003e\n\u003e   \u003cProjectReference Include=\"..\\SbeCodeGenerator\\SbeSourceGenerator.csproj\" \n\u003e                     OutputItemType=\"Analyzer\" \n\u003e                     ReferenceOutputAssembly=\"false\" /\u003e\n\u003e \u003c/ItemGroup\u003e\n\u003e ```\n\n### 2. Add Your Schema\n\nAdd your SBE XML schema as an additional file:\n\n```xml\n\u003cItemGroup\u003e\n  \u003cAdditionalFiles Include=\"your-schema.xml\" /\u003e\n\u003c/ItemGroup\u003e\n```\n\n### 3. Build\n\nBuild your project. The generator will automatically create C# types from your schema.\n\n### 4. Use Generated Code\n\n**Simple Messages:**\n```csharp\n// Create and encode a simple message\nvar trade = new TradeData\n{\n    TradeId = 123456,\n    Price = 9950,\n    Quantity = 100,\n    Side = Side.Buy\n};\n\n// Encode to binary format\nbyte[] buffer = new byte[TradeData.MESSAGE_SIZE];\nif (trade.TryEncode(buffer, out int bytesWritten))\n{\n    // Send via network\n    await socket.SendAsync(buffer.AsMemory(0, bytesWritten));\n}\n\n// Decode from binary format\nif (TradeData.TryParse(receivedBuffer, out var reader))\n{\n    Console.WriteLine($\"Trade: {reader.Data.TradeId}, Price: {reader.Data.Price}\");\n}\n```\n\n**Messages with Repeating Groups (Span-Based API):**\n```csharp\n// Create message with groups\nvar orderBook = new OrderBookData { InstrumentId = 42 };\nvar bids = new[] {\n    new BidsData { Price = 1000, Quantity = 100 },\n    new BidsData { Price = 1010, Quantity = 101 }\n};\nvar asks = new[] {\n    new AsksData { Price = 2000, Quantity = 200 }\n};\n\n// Encode with comprehensive TryEncode - enforces correct schema order\nSpan\u003cbyte\u003e buffer = stackalloc byte[1024];\nbool success = OrderBookData.TryEncode(\n    orderBook,\n    buffer,\n    bids,  // Groups/varData in schema-defined order\n    asks,  // Compiler ensures correct parameter order\n    out int bytesWritten\n);\n\n// Decode with groups — zero-copy via MessageDataReader\nif (OrderBookData.TryParse(buffer, out var reader))\n{\n    Console.WriteLine($\"Instrument: {reader.Data.InstrumentId}\");\n\n    // v1.5.0: foreach for simple top-level groups — no closure alloc, supports break.\n    foreach (ref readonly var bid in reader.Bids) Console.WriteLine($\"Bid: {bid.Price}\");\n    foreach (ref readonly var ask in reader.Asks) Console.WriteLine($\"Ask: {ask.Price}\");\n\n    // ReadGroups still works (and is required for nested groups / group-level varData):\n    // reader.ReadGroups(\n    //     (in BidsData bid) =\u003e Console.WriteLine($\"Bid: {bid.Price}\"),\n    //     (in AsksData ask) =\u003e Console.WriteLine($\"Ask: {ask.Price}\")\n    // );\n}\n```\n\n**Messages with Repeating Groups (Zero-Allocation Callback API):**\n```csharp\n// For high-performance scenarios: use callbacks to avoid array allocations\nvar orderBook = new OrderBookData { InstrumentId = 42 };\n\nSpan\u003cbyte\u003e buffer = stackalloc byte[1024];\nbool success = OrderBookData.TryEncode(\n    orderBook,\n    buffer,\n    bidCount: 3,\n    bidsEncoder: (int index, ref BidsData item) =\u003e {\n        // Populate item from your data source without allocations\n        item.Price = GetBidPrice(index);\n        item.Quantity = GetBidQuantity(index);\n    },\n    askCount: 2,\n    asksEncoder: (int index, ref AsksData item) =\u003e {\n        item.Price = GetAskPrice(index);\n        item.Quantity = GetAskQuantity(index);\n    },\n    out int bytesWritten\n);\n```\n\n**Messages with Variable-Length Data (Span-Based API):**\n```csharp\n// Encode message with varData\nvar order = new NewOrderData { OrderId = 123, Price = 9950 };\nvar symbolBytes = Encoding.UTF8.GetBytes(\"AAPL\");\n\nSpan\u003cbyte\u003e buffer = stackalloc byte[512];\nbool success = NewOrderData.TryEncode(\n    order,\n    buffer,\n    symbolBytes,  // VarData in schema-defined order\n    out int bytesWritten\n);\n\n// Decode varData — zero-copy via MessageDataReader\nif (NewOrderData.TryParse(buffer, out var reader))\n{\n    Console.WriteLine($\"Order: {reader.Data.OrderId}\");\n    reader.ReadGroups(\n        symbol =\u003e {\n            var text = Encoding.UTF8.GetString(symbol.VarData.Slice(0, symbol.Length));\n            Console.WriteLine($\"Symbol: {text}\");\n        }\n    );\n}\n```\n\n## Example Schema\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003csbe:messageSchema xmlns:sbe=\"http://fixprotocol.io/2016/sbe\"\n                   package=\"trading_messages\"\n                   id=\"1\"\n                   version=\"0\"\n                   semanticVersion=\"1.0\"\n                   description=\"Trading messages\"\n                   byteOrder=\"littleEndian\"\u003e\n    \u003ctypes\u003e\n        \u003ccomposite name=\"MessageHeader\"\u003e\n            \u003ctype name=\"blockLength\" primitiveType=\"uint16\"/\u003e\n            \u003ctype name=\"templateId\" primitiveType=\"uint16\"/\u003e\n            \u003ctype name=\"schemaId\" primitiveType=\"uint16\"/\u003e\n            \u003ctype name=\"version\" primitiveType=\"uint16\"/\u003e\n        \u003c/composite\u003e\n\n        \u003ctype name=\"TradeId\" primitiveType=\"int64\"/\u003e\n        \u003ctype name=\"Price\" primitiveType=\"int64\"/\u003e\n\n        \u003cenum name=\"Side\" encodingType=\"uint8\"\u003e\n            \u003cvalidValue name=\"Buy\"\u003e0\u003c/validValue\u003e\n            \u003cvalidValue name=\"Sell\"\u003e1\u003c/validValue\u003e\n        \u003c/enum\u003e\n    \u003c/types\u003e\n\n    \u003csbe:message name=\"Trade\" id=\"1\" description=\"Trade message\"\u003e\n        \u003cfield name=\"tradeId\" id=\"1\" type=\"TradeId\"/\u003e\n        \u003cfield name=\"price\" id=\"2\" type=\"Price\"/\u003e\n        \u003cfield name=\"quantity\" id=\"3\" type=\"int64\"/\u003e\n        \u003cfield name=\"side\" id=\"4\" type=\"Side\"/\u003e\n    \u003c/sbe:message\u003e\n\u003c/sbe:messageSchema\u003e\n```\n\n## Generated Code\n\nThe generator creates:\n\n- **Enums**: C# enums for SBE enum types\n- **Sets**: C# flag enums for SBE set types\n- **Composites**: C# structs for composite types\n- **Types**: Type aliases and wrappers\n- **Messages**: C# structs for SBE messages\n- **Groups**: Nested structs for repeating groups\n\nAll generated types use `[StructLayout(LayoutKind.Explicit)]` with `[FieldOffset]` attributes for efficient binary serialization.\n\n## Architecture\n\n```\nSBESourceGenerator (Orchestrator)\n    │\n    ├── TypesCodeGenerator\n    │   ├── Enums\n    │   ├── Sets\n    │   ├── Composites\n    │   └── Types\n    │\n    ├── MessagesCodeGenerator\n    │   └── Messages with Groups, parsing helpers, and {Msg}VersionMap\n    │\n    ├── DispatcherGenerator\n    │   ├── ISbeMessageHandler (per-schema interface)\n    │   └── SbeDispatcher (struct-generic zero-cost dispatch)\n    │\n    └── UtilitiesCodeGenerator\n        ├── SpanReader\n        └── SpanWriter\n```\n\nSee [ARCHITECTURE_DIAGRAMS.md](./docs/ARCHITECTURE_DIAGRAMS.md) for detailed architecture diagrams.\n\n## Diagnostics\n\nThe generator provides comprehensive diagnostics:\n\n| Code | Severity | Description |\n|------|----------|-------------|\n| SBE001 | Error | Invalid integer attribute value |\n| SBE002 | Error | Missing required attribute |\n| SBE003 | Error | Invalid enum flag value |\n| SBE004 | Error | Malformed schema |\n| SBE005 | Warning | Unsupported construct |\n| SBE006 | Error | Invalid type length |\n| SBE007 | Info | Big-endian schema with conditional byte swap |\n| SBE008 | Error | Unresolved type reference |\n| SBE009 | Warning | Invalid numeric constraint |\n| SBE010 | Warning | Unknown primitive type fallback |\n| SBE011 | Error | Set choice bit position exceeds encoding width |\n| SBE012 | Warning | Invalid SbeAssumeHostEndianness value |\n| SBE013 | Warning | Duplicate type name |\n| SBE014 | Warning | sinceVersion exceeds schema version |\n\nSee [Diagnostics README](./src/SbeCodeGenerator/Diagnostics/README.md) for details.\n\n## Testing\n\n### Run Unit Tests\n\n```bash\ndotnet test tests/SbeCodeGenerator.Tests/\n```\n\n### Run Integration Tests\n\n```bash\ndotnet test tests/SbeCodeGenerator.IntegrationTests/\n```\n\n### All Tests\n\n```bash\ndotnet test\n```\n\n## Documentation\n\n- **[Changelog](./CHANGELOG.md)** - Version history and release notes\n- **[Contributing](./CONTRIBUTING.md)** - Development setup and guidelines\n- **[Architecture Diagrams](./docs/ARCHITECTURE_DIAGRAMS.md)** - System architecture\n- **[Testing Guide](./docs/TESTING_GUIDE.md)** - How to test the generator\n- **[CI/CD Pipeline](./docs/CICD_PIPELINE.md)** - CI/CD configuration and NuGet publishing\n\n## Project Structure\n\n```\nSbeSourceGenerator/\n├── src/\n│   └── SbeCodeGenerator/          # Source generator implementation\n│       ├── Diagnostics/          # Diagnostic descriptors\n│       ├── Generators/           # Code generators\n│       │   ├── Fields/          # Field generators\n│       │   └── Types/           # Type generators\n│       ├── Helpers/             # Helper utilities\n│       └── Schema/              # DTOs and parsing\n├── tests/\n│   ├── SbeCodeGenerator.Tests/       # Unit tests\n│   └── SbeCodeGenerator.IntegrationTests/  # Integration tests\n├── examples/                     # Example applications\n│   ├── SbeBinanceConsole/       # Binance market data processing\n│   └── HighPerformanceMarketData/ # High-performance SBE patterns\n├── benchmarks/                   # BenchmarkDotNet performance benchmarks\n├── profiling/                    # Profiling tools and scripts\n└── docs/                        # Documentation files\n```\n\n## Examples\n\nThe repository includes several example projects in the `examples/` folder:\n\n1. **SbeBinanceConsole** - Binance market data processing with live dashboard\n2. **HighPerformanceMarketData** - High-performance SBE message processing patterns\n\n## Performance\n\nThe generated code is designed for high performance:\n\n- Zero-copy deserialization via `MessageDataReader` ref struct (`reader.Data` is `ref readonly` into buffer)\n- Zero-copy `ReadBlockRef\u003cT\u003e` for advanced SpanReader usage\n- `ReadGroups` with `in` delegate callbacks (no struct copies)\n- `readonly` property getters to prevent defensive copies\n- Struct-based value types (no heap allocations)\n- Explicit memory layout for cache efficiency\n- Blittable types for P/Invoke scenarios\n\n**Benchmark Infrastructure**: Benchmarks using BenchmarkDotNet are available in the `benchmarks/` directory.\n\n## Compliance\n\nThe generator implements the FIX SBE 1.0 specification, including all core encoding types, repeating groups (with nesting), variable-length data, schema versioning, and field presence modes. See [Changelog](./CHANGELOG.md) for version history.\n\n## Contributing\n\nContributions are welcome! See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.\n\n### Development Setup\n\n1. Clone the repository\n2. Open `SbeCodeGenerator.sln` in Visual Studio 2022+ or VS Code\n3. Build the solution: `dotnet build`\n4. Run tests: `dotnet test`\n\n## Requirements\n\n- .NET SDK 9.0+ (for building examples and tests)\n- The generator itself targets **netstandard2.0** and works with any compatible runtime\n- Roslyn Source Generators support (Visual Studio 2022+, .NET SDK 6.0+)\n\n## References\n\n- [FIX Simple Binary Encoding (SBE) Standard](https://www.fixtrading.org/standards/sbe/)\n- [SBE GitHub Repository](https://github.com/FIXTradingCommunity/fix-simple-binary-encoding)\n- [Real Logic SBE Implementation](https://github.com/real-logic/simple-binary-encoding)\n\n## License\n\nSee [LICENSE.txt](./LICENSE.txt) for license information.\n\n## Support\n\nFor questions, issues, or feature requests:\n- Open an issue on GitHub\n- Check existing documentation\n- Review example projects\n\n---\n\n**Version**: 1.0.2 (see [Changelog](./CHANGELOG.md))\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedrosakuma%2Fsbesourcegenerator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpedrosakuma%2Fsbesourcegenerator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedrosakuma%2Fsbesourcegenerator/lists"}