Repository files navigation

Hexser Workspace

From the founders: Hi all, thank you for checking out Hexser.

We are the authors of N Lang,, and we strongly believe that Rust's and N Lang's robust type systems and meaningful designs are the future of software engineering. We wrote this library to allow people to create incredible applications in Rust quickly while also giving them best-in-class generative code support and good design.

"Good Design is Good Business" - Thomas J. Watson Jr., the former CEO of IBM.

Hexser allows you to build incredibly small and incredibly large Rust apps that fit perfectly into the Squillo ecosystem but also for professional teams. We are proud to Open-Sourcing this library under MIT or Apache and can't wait to see how you use it.

Enjoy!


Build real-world, hexagonal Rust apps without the ceremony. Hexser is a pragmatic, zero‑boilerplate take on Hexagonal Architecture with a clear Domain–Ports–Adapters flow, fast iteration, automatically graphed inference, and copy‑pasteable examples.


Crates

Main crates (jump in):

  • hexser — Core traits, types, errors, graph model, and opt‑in derive macros. Also available on crates.io: https://crates.io/crates/hexser
  • hexser_macros — Procedural macros (feature = "macros") to reduce repetition.
  • hexser_potions — “Potions”: small, mixable examples for common app operations (formerly “blueprints”).

Documentation:

  • hexser crate README: ./hexser/README.md
  • hexser_potions crate README: ./hexser_potions/README.md
  • hexser_macros crate README: ./hexser_macros/README.md

Why Hexser?

Why teams choose Hexser:

  • Zero boilerplate: write traits for your Ports and small impls for Adapters — that’s it.
  • Query‑first repositories: lightweight domain filter/sort types keep adapters simple and testable.
  • First‑class use‑cases: model application logic as Directives (clear, explicit, testable).
  • Fast feedback: in‑memory adapters and ready‑to‑paste Potions get you shipping quickly.
  • Opt‑in macros: reduce repetition without hiding control flow; nothing “magic” at runtime.

Quick start

Quick start with hexser:

[dependencies]
hexser = { path = "./hexser", version = "0.5", features = ["macros"] }
use hexser::prelude::*;// Domain entitystructUser{id:String}implHexEntityforUser{typeId = String;}// Repository port (query-oriented)// Define lightweight filter/sort types in your domain#[derive(Debug,Clone)]enumUserFilter{ByEmail(String),ById(String),All}#[derive(Debug,Clone,Copy,PartialEq,Eq)]enumUserSortKey{Email}traitUserRepository:QueryRepository<User>{}// Usage (adapter decides how to match filters)// let found = <YourRepo as QueryRepository<User>>::find_one(&repo, &UserFilter::ByEmail("a@b.com".into()))?;

Claude Code plugin

Using hexser with Claude Code? Install the official plugin — it teaches Claude the current hexser API and adds commands for scaffolding, review, visualization, and migration:

/plugin marketplace add squillo/hexser
/plugin install hexser@hexser

It ships an auto-activating hexser skill (it fires whenever you edit Rust that uses hexser) plus slash commands: /hexser:new, /hexser:add-adapter, /hexser:add-usecase, /hexser:review, /hexser:graph, /hexser:migrate, and /hexser:mcp-setup (wires hexser's MCP server so Claude can read your architecture graph live). See plugins/hexser/README.md.

CloudEvents v1.0 Support

Hexser includes built-in support for CloudEvents v1.0 specification, enabling standards-compliant, transport-agnostic domain event publishing and consumption:

  • Standards-compliant: Full CloudEvents v1.0 specification compliance
  • Transport-agnostic: Works with HTTP, Kafka, AMQP, and other transports
  • Hexagonal design: Clear separation between domain events, ports, and adapters
  • Zero dependencies: Native implementation without external CloudEvents crate
  • CQRS integration: Seamless integration with Directives (write) and Queries (read)
use hexser::prelude::*;use hexser::ports::events::{CloudEventsEnvelope,EventPublisher};// Define domain eventstructUserCreated{user_id:String,email:String,}implDomainEventforUserCreated{fnevent_type(&self) -> &str{"com.example.user.created"}fnaggregate_id(&self) -> String{self.user_id.clone()}}// Wrap in CloudEvents envelopelet event = UserCreated{user_id:String::from("user-123"),email:String::from("user@example.com"),};let envelope = CloudEventsEnvelope::from_domain_event(String::from("evt-001"),String::from("/services/user-service"),
event,);// Publish via any transport adapter// publisher.publish(&envelope)?;

Documentation: See hexser/docs/events.md for comprehensive guide including:

  • CloudEvents v1.0 attribute mappings (required: id, source, specversion, type)
  • Transport bindings (HTTP binary/structured, Kafka, AMQP)
  • CQRS integration patterns
  • Security and reliability considerations

Potions Ecosystem

Why “Potions”? They are lightweight, composable recipes you can pour into your app — perfect for experimenting, learning, and scaffolding.

Explore Potions (examples):

  • Authentication: Minimal sign‑up flow with a Directive and an in‑memory repository.
  • CRUD: Simple in‑memory Repository example, ready to paste.

Use directly from the workspace:

[dependencies]
hexser_potions = { path = "./hexser_potions", version = "0.5" }

Then in your code:

use hexser_potions::auth::{SignUpUser,InMemoryUserRepository, execute_signup};letmut repo = InMemoryUserRepository::default();let user = execute_signup(&mut repo,SignUpUser{email:"a@b.com".into()})?;

Licensing

License: MIT or Apache‑2.0

About

Rust Hexagonal Architecture

Resources

Stars

22 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Hexser Workspace

From the founders: Hi all, thank you for checking out Hexser.

We are the authors of N Lang,, and we strongly believe that Rust's and N Lang's robust type systems and meaningful designs are the future of software engineering. We wrote this library to allow people to create incredible applications in Rust quickly while also giving them best-in-class generative code support and good design.

"Good Design is Good Business" - Thomas J. Watson Jr., the former CEO of IBM.

Hexser allows you to build incredibly small and incredibly large Rust apps that fit perfectly into the Squillo ecosystem but also for professional teams. We are proud to Open-Sourcing this library under MIT or Apache and can't wait to see how you use it.

Enjoy!


Build real-world, hexagonal Rust apps without the ceremony. Hexser is a pragmatic, zero‑boilerplate take on Hexagonal Architecture with a clear Domain–Ports–Adapters flow, fast iteration, automatically graphed inference, and copy‑pasteable examples.


Crates

Main crates (jump in):

  • hexser — Core traits, types, errors, graph model, and opt‑in derive macros. Also available on crates.io: https://crates.io/crates/hexser
  • hexser_macros — Procedural macros (feature = "macros") to reduce repetition.
  • hexser_potions — “Potions”: small, mixable examples for common app operations (formerly “blueprints”).

Documentation:

  • hexser crate README: ./hexser/README.md
  • hexser_potions crate README: ./hexser_potions/README.md
  • hexser_macros crate README: ./hexser_macros/README.md

Why Hexser?

Why teams choose Hexser:

  • Zero boilerplate: write traits for your Ports and small impls for Adapters — that’s it.
  • Query‑first repositories: lightweight domain filter/sort types keep adapters simple and testable.
  • First‑class use‑cases: model application logic as Directives (clear, explicit, testable).
  • Fast feedback: in‑memory adapters and ready‑to‑paste Potions get you shipping quickly.
  • Opt‑in macros: reduce repetition without hiding control flow; nothing “magic” at runtime.

Quick start

Quick start with hexser:

[dependencies]
hexser = { path = "./hexser", version = "0.5", features = ["macros"] }
use hexser::prelude::*;// Domain entitystructUser{id:String}implHexEntityforUser{typeId = String;}// Repository port (query-oriented)// Define lightweight filter/sort types in your domain#[derive(Debug,Clone)]enumUserFilter{ByEmail(String),ById(String),All}#[derive(Debug,Clone,Copy,PartialEq,Eq)]enumUserSortKey{Email}traitUserRepository:QueryRepository<User>{}// Usage (adapter decides how to match filters)// let found = <YourRepo as QueryRepository<User>>::find_one(&repo, &UserFilter::ByEmail("a@b.com".into()))?;

Claude Code plugin

Using hexser with Claude Code? Install the official plugin — it teaches Claude the current hexser API and adds commands for scaffolding, review, visualization, and migration:

/plugin marketplace add squillo/hexser
/plugin install hexser@hexser

It ships an auto-activating hexser skill (it fires whenever you edit Rust that uses hexser) plus slash commands: /hexser:new, /hexser:add-adapter, /hexser:add-usecase, /hexser:review, /hexser:graph, /hexser:migrate, and /hexser:mcp-setup (wires hexser's MCP server so Claude can read your architecture graph live). See plugins/hexser/README.md.

CloudEvents v1.0 Support

Hexser includes built-in support for CloudEvents v1.0 specification, enabling standards-compliant, transport-agnostic domain event publishing and consumption:

  • Standards-compliant: Full CloudEvents v1.0 specification compliance
  • Transport-agnostic: Works with HTTP, Kafka, AMQP, and other transports
  • Hexagonal design: Clear separation between domain events, ports, and adapters
  • Zero dependencies: Native implementation without external CloudEvents crate
  • CQRS integration: Seamless integration with Directives (write) and Queries (read)
use hexser::prelude::*;use hexser::ports::events::{CloudEventsEnvelope,EventPublisher};// Define domain eventstructUserCreated{user_id:String,email:String,}implDomainEventforUserCreated{fnevent_type(&self) -> &str{"com.example.user.created"}fnaggregate_id(&self) -> String{self.user_id.clone()}}// Wrap in CloudEvents envelopelet event = UserCreated{user_id:String::from("user-123"),email:String::from("user@example.com"),};let envelope = CloudEventsEnvelope::from_domain_event(String::from("evt-001"),String::from("/services/user-service"),
event,);// Publish via any transport adapter// publisher.publish(&envelope)?;

Documentation: See hexser/docs/events.md for comprehensive guide including:

  • CloudEvents v1.0 attribute mappings (required: id, source, specversion, type)
  • Transport bindings (HTTP binary/structured, Kafka, AMQP)
  • CQRS integration patterns
  • Security and reliability considerations

Potions Ecosystem

Why “Potions”? They are lightweight, composable recipes you can pour into your app — perfect for experimenting, learning, and scaffolding.

Explore Potions (examples):

  • Authentication: Minimal sign‑up flow with a Directive and an in‑memory repository.
  • CRUD: Simple in‑memory Repository example, ready to paste.

Use directly from the workspace:

[dependencies]
hexser_potions = { path = "./hexser_potions", version = "0.5" }

Then in your code:

use hexser_potions::auth::{SignUpUser,InMemoryUserRepository, execute_signup};letmut repo = InMemoryUserRepository::default();let user = execute_signup(&mut repo,SignUpUser{email:"a@b.com".into()})?;

Licensing

License: MIT or Apache‑2.0

About

Rust Hexagonal Architecture

Resources

Stars

22 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Hexser Workspace

From the founders: Hi all, thank you for checking out Hexser.

We are the authors of N Lang,, and we strongly believe that Rust's and N Lang's robust type systems and meaningful designs are the future of software engineering. We wrote this library to allow people to create incredible applications in Rust quickly while also giving them best-in-class generative code support and good design.

"Good Design is Good Business" - Thomas J. Watson Jr., the former CEO of IBM.

Hexser allows you to build incredibly small and incredibly large Rust apps that fit perfectly into the Squillo ecosystem but also for professional teams. We are proud to Open-Sourcing this library under MIT or Apache and can't wait to see how you use it.

Enjoy!


Build real-world, hexagonal Rust apps without the ceremony. Hexser is a pragmatic, zero‑boilerplate take on Hexagonal Architecture with a clear Domain–Ports–Adapters flow, fast iteration, automatically graphed inference, and copy‑pasteable examples.


Crates

Main crates (jump in):

  • hexser — Core traits, types, errors, graph model, and opt‑in derive macros. Also available on crates.io: https://crates.io/crates/hexser
  • hexser_macros — Procedural macros (feature = "macros") to reduce repetition.
  • hexser_potions — “Potions”: small, mixable examples for common app operations (formerly “blueprints”).

Documentation:

  • hexser crate README: ./hexser/README.md
  • hexser_potions crate README: ./hexser_potions/README.md
  • hexser_macros crate README: ./hexser_macros/README.md

Why Hexser?

Why teams choose Hexser:

  • Zero boilerplate: write traits for your Ports and small impls for Adapters — that’s it.
  • Query‑first repositories: lightweight domain filter/sort types keep adapters simple and testable.
  • First‑class use‑cases: model application logic as Directives (clear, explicit, testable).
  • Fast feedback: in‑memory adapters and ready‑to‑paste Potions get you shipping quickly.
  • Opt‑in macros: reduce repetition without hiding control flow; nothing “magic” at runtime.

Quick start

Quick start with hexser:

[dependencies]
hexser = { path = "./hexser", version = "0.5", features = ["macros"] }
use hexser::prelude::*;// Domain entitystructUser{id:String}implHexEntityforUser{typeId = String;}// Repository port (query-oriented)// Define lightweight filter/sort types in your domain#[derive(Debug,Clone)]enumUserFilter{ByEmail(String),ById(String),All}#[derive(Debug,Clone,Copy,PartialEq,Eq)]enumUserSortKey{Email}traitUserRepository:QueryRepository<User>{}// Usage (adapter decides how to match filters)// let found = <YourRepo as QueryRepository<User>>::find_one(&repo, &UserFilter::ByEmail("a@b.com".into()))?;

Claude Code plugin

Using hexser with Claude Code? Install the official plugin — it teaches Claude the current hexser API and adds commands for scaffolding, review, visualization, and migration:

/plugin marketplace add squillo/hexser
/plugin install hexser@hexser

It ships an auto-activating hexser skill (it fires whenever you edit Rust that uses hexser) plus slash commands: /hexser:new, /hexser:add-adapter, /hexser:add-usecase, /hexser:review, /hexser:graph, /hexser:migrate, and /hexser:mcp-setup (wires hexser's MCP server so Claude can read your architecture graph live). See plugins/hexser/README.md.

CloudEvents v1.0 Support

Hexser includes built-in support for CloudEvents v1.0 specification, enabling standards-compliant, transport-agnostic domain event publishing and consumption:

  • Standards-compliant: Full CloudEvents v1.0 specification compliance
  • Transport-agnostic: Works with HTTP, Kafka, AMQP, and other transports
  • Hexagonal design: Clear separation between domain events, ports, and adapters
  • Zero dependencies: Native implementation without external CloudEvents crate
  • CQRS integration: Seamless integration with Directives (write) and Queries (read)
use hexser::prelude::*;use hexser::ports::events::{CloudEventsEnvelope,EventPublisher};// Define domain eventstructUserCreated{user_id:String,email:String,}implDomainEventforUserCreated{fnevent_type(&self) -> &str{"com.example.user.created"}fnaggregate_id(&self) -> String{self.user_id.clone()}}// Wrap in CloudEvents envelopelet event = UserCreated{user_id:String::from("user-123"),email:String::from("user@example.com"),};let envelope = CloudEventsEnvelope::from_domain_event(String::from("evt-001"),String::from("/services/user-service"),
event,);// Publish via any transport adapter// publisher.publish(&envelope)?;

Documentation: See hexser/docs/events.md for comprehensive guide including:

  • CloudEvents v1.0 attribute mappings (required: id, source, specversion, type)
  • Transport bindings (HTTP binary/structured, Kafka, AMQP)
  • CQRS integration patterns
  • Security and reliability considerations

Potions Ecosystem

Why “Potions”? They are lightweight, composable recipes you can pour into your app — perfect for experimenting, learning, and scaffolding.

Explore Potions (examples):

  • Authentication: Minimal sign‑up flow with a Directive and an in‑memory repository.
  • CRUD: Simple in‑memory Repository example, ready to paste.

Use directly from the workspace:

[dependencies]
hexser_potions = { path = "./hexser_potions", version = "0.5" }

Then in your code:

use hexser_potions::auth::{SignUpUser,InMemoryUserRepository, execute_signup};letmut repo = InMemoryUserRepository::default();let user = execute_signup(&mut repo,SignUpUser{email:"a@b.com".into()})?;

Licensing

License: MIT or Apache‑2.0

About

Rust Hexagonal Architecture

Resources

Stars

22 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Hexser Workspace

From the founders: Hi all, thank you for checking out Hexser.

We are the authors of N Lang,, and we strongly believe that Rust's and N Lang's robust type systems and meaningful designs are the future of software engineering. We wrote this library to allow people to create incredible applications in Rust quickly while also giving them best-in-class generative code support and good design.

"Good Design is Good Business" - Thomas J. Watson Jr., the former CEO of IBM.

Hexser allows you to build incredibly small and incredibly large Rust apps that fit perfectly into the Squillo ecosystem but also for professional teams. We are proud to Open-Sourcing this library under MIT or Apache and can't wait to see how you use it.

Enjoy!


Build real-world, hexagonal Rust apps without the ceremony. Hexser is a pragmatic, zero‑boilerplate take on Hexagonal Architecture with a clear Domain–Ports–Adapters flow, fast iteration, automatically graphed inference, and copy‑pasteable examples.


Crates

Main crates (jump in):

  • hexser — Core traits, types, errors, graph model, and opt‑in derive macros. Also available on crates.io: https://crates.io/crates/hexser
  • hexser_macros — Procedural macros (feature = "macros") to reduce repetition.
  • hexser_potions — “Potions”: small, mixable examples for common app operations (formerly “blueprints”).

Documentation:

  • hexser crate README: ./hexser/README.md
  • hexser_potions crate README: ./hexser_potions/README.md
  • hexser_macros crate README: ./hexser_macros/README.md

Why Hexser?

Why teams choose Hexser:

  • Zero boilerplate: write traits for your Ports and small impls for Adapters — that’s it.
  • Query‑first repositories: lightweight domain filter/sort types keep adapters simple and testable.
  • First‑class use‑cases: model application logic as Directives (clear, explicit, testable).
  • Fast feedback: in‑memory adapters and ready‑to‑paste Potions get you shipping quickly.
  • Opt‑in macros: reduce repetition without hiding control flow; nothing “magic” at runtime.

Quick start

Quick start with hexser:

[dependencies]
hexser = { path = "./hexser", version = "0.5", features = ["macros"] }
use hexser::prelude::*;// Domain entitystructUser{id:String}implHexEntityforUser{typeId = String;}// Repository port (query-oriented)// Define lightweight filter/sort types in your domain#[derive(Debug,Clone)]enumUserFilter{ByEmail(String),ById(String),All}#[derive(Debug,Clone,Copy,PartialEq,Eq)]enumUserSortKey{Email}traitUserRepository:QueryRepository<User>{}// Usage (adapter decides how to match filters)// let found = <YourRepo as QueryRepository<User>>::find_one(&repo, &UserFilter::ByEmail("a@b.com".into()))?;

Claude Code plugin

Using hexser with Claude Code? Install the official plugin — it teaches Claude the current hexser API and adds commands for scaffolding, review, visualization, and migration:

/plugin marketplace add squillo/hexser
/plugin install hexser@hexser

It ships an auto-activating hexser skill (it fires whenever you edit Rust that uses hexser) plus slash commands: /hexser:new, /hexser:add-adapter, /hexser:add-usecase, /hexser:review, /hexser:graph, /hexser:migrate, and /hexser:mcp-setup (wires hexser's MCP server so Claude can read your architecture graph live). See plugins/hexser/README.md.

CloudEvents v1.0 Support

Hexser includes built-in support for CloudEvents v1.0 specification, enabling standards-compliant, transport-agnostic domain event publishing and consumption:

  • Standards-compliant: Full CloudEvents v1.0 specification compliance
  • Transport-agnostic: Works with HTTP, Kafka, AMQP, and other transports
  • Hexagonal design: Clear separation between domain events, ports, and adapters
  • Zero dependencies: Native implementation without external CloudEvents crate
  • CQRS integration: Seamless integration with Directives (write) and Queries (read)
use hexser::prelude::*;use hexser::ports::events::{CloudEventsEnvelope,EventPublisher};// Define domain eventstructUserCreated{user_id:String,email:String,}implDomainEventforUserCreated{fnevent_type(&self) -> &str{"com.example.user.created"}fnaggregate_id(&self) -> String{self.user_id.clone()}}// Wrap in CloudEvents envelopelet event = UserCreated{user_id:String::from("user-123"),email:String::from("user@example.com"),};let envelope = CloudEventsEnvelope::from_domain_event(String::from("evt-001"),String::from("/services/user-service"),
event,);// Publish via any transport adapter// publisher.publish(&envelope)?;

Documentation: See hexser/docs/events.md for comprehensive guide including:

  • CloudEvents v1.0 attribute mappings (required: id, source, specversion, type)
  • Transport bindings (HTTP binary/structured, Kafka, AMQP)
  • CQRS integration patterns
  • Security and reliability considerations

Potions Ecosystem

Why “Potions”? They are lightweight, composable recipes you can pour into your app — perfect for experimenting, learning, and scaffolding.

Explore Potions (examples):

  • Authentication: Minimal sign‑up flow with a Directive and an in‑memory repository.
  • CRUD: Simple in‑memory Repository example, ready to paste.

Use directly from the workspace:

[dependencies]
hexser_potions = { path = "./hexser_potions", version = "0.5" }

Then in your code:

use hexser_potions::auth::{SignUpUser,InMemoryUserRepository, execute_signup};letmut repo = InMemoryUserRepository::default();let user = execute_signup(&mut repo,SignUpUser{email:"a@b.com".into()})?;

Licensing

License: MIT or Apache‑2.0

About

Rust Hexagonal Architecture

Resources

Stars

22 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Hexser Workspace

From the founders: Hi all, thank you for checking out Hexser.

We are the authors of N Lang,, and we strongly believe that Rust's and N Lang's robust type systems and meaningful designs are the future of software engineering. We wrote this library to allow people to create incredible applications in Rust quickly while also giving them best-in-class generative code support and good design.

"Good Design is Good Business" - Thomas J. Watson Jr., the former CEO of IBM.

Hexser allows you to build incredibly small and incredibly large Rust apps that fit perfectly into the Squillo ecosystem but also for professional teams. We are proud to Open-Sourcing this library under MIT or Apache and can't wait to see how you use it.

Enjoy!


Build real-world, hexagonal Rust apps without the ceremony. Hexser is a pragmatic, zero‑boilerplate take on Hexagonal Architecture with a clear Domain–Ports–Adapters flow, fast iteration, automatically graphed inference, and copy‑pasteable examples.


Crates

Main crates (jump in):

  • hexser — Core traits, types, errors, graph model, and opt‑in derive macros. Also available on crates.io: https://crates.io/crates/hexser
  • hexser_macros — Procedural macros (feature = "macros") to reduce repetition.
  • hexser_potions — “Potions”: small, mixable examples for common app operations (formerly “blueprints”).

Documentation:

  • hexser crate README: ./hexser/README.md
  • hexser_potions crate README: ./hexser_potions/README.md
  • hexser_macros crate README: ./hexser_macros/README.md

Why Hexser?

Why teams choose Hexser:

  • Zero boilerplate: write traits for your Ports and small impls for Adapters — that’s it.
  • Query‑first repositories: lightweight domain filter/sort types keep adapters simple and testable.
  • First‑class use‑cases: model application logic as Directives (clear, explicit, testable).
  • Fast feedback: in‑memory adapters and ready‑to‑paste Potions get you shipping quickly.
  • Opt‑in macros: reduce repetition without hiding control flow; nothing “magic” at runtime.

Quick start

Quick start with hexser:

[dependencies]
hexser = { path = "./hexser", version = "0.5", features = ["macros"] }
use hexser::prelude::*;// Domain entitystructUser{id:String}implHexEntityforUser{typeId = String;}// Repository port (query-oriented)// Define lightweight filter/sort types in your domain#[derive(Debug,Clone)]enumUserFilter{ByEmail(String),ById(String),All}#[derive(Debug,Clone,Copy,PartialEq,Eq)]enumUserSortKey{Email}traitUserRepository:QueryRepository<User>{}// Usage (adapter decides how to match filters)// let found = <YourRepo as QueryRepository<User>>::find_one(&repo, &UserFilter::ByEmail("a@b.com".into()))?;

Claude Code plugin

Using hexser with Claude Code? Install the official plugin — it teaches Claude the current hexser API and adds commands for scaffolding, review, visualization, and migration:

/plugin marketplace add squillo/hexser
/plugin install hexser@hexser

It ships an auto-activating hexser skill (it fires whenever you edit Rust that uses hexser) plus slash commands: /hexser:new, /hexser:add-adapter, /hexser:add-usecase, /hexser:review, /hexser:graph, /hexser:migrate, and /hexser:mcp-setup (wires hexser's MCP server so Claude can read your architecture graph live). See plugins/hexser/README.md.

CloudEvents v1.0 Support

Hexser includes built-in support for CloudEvents v1.0 specification, enabling standards-compliant, transport-agnostic domain event publishing and consumption:

  • Standards-compliant: Full CloudEvents v1.0 specification compliance
  • Transport-agnostic: Works with HTTP, Kafka, AMQP, and other transports
  • Hexagonal design: Clear separation between domain events, ports, and adapters
  • Zero dependencies: Native implementation without external CloudEvents crate
  • CQRS integration: Seamless integration with Directives (write) and Queries (read)
use hexser::prelude::*;use hexser::ports::events::{CloudEventsEnvelope,EventPublisher};// Define domain eventstructUserCreated{user_id:String,email:String,}implDomainEventforUserCreated{fnevent_type(&self) -> &str{"com.example.user.created"}fnaggregate_id(&self) -> String{self.user_id.clone()}}// Wrap in CloudEvents envelopelet event = UserCreated{user_id:String::from("user-123"),email:String::from("user@example.com"),};let envelope = CloudEventsEnvelope::from_domain_event(String::from("evt-001"),String::from("/services/user-service"),
event,);// Publish via any transport adapter// publisher.publish(&envelope)?;

Documentation: See hexser/docs/events.md for comprehensive guide including:

  • CloudEvents v1.0 attribute mappings (required: id, source, specversion, type)
  • Transport bindings (HTTP binary/structured, Kafka, AMQP)
  • CQRS integration patterns
  • Security and reliability considerations

Potions Ecosystem

Why “Potions”? They are lightweight, composable recipes you can pour into your app — perfect for experimenting, learning, and scaffolding.

Explore Potions (examples):

  • Authentication: Minimal sign‑up flow with a Directive and an in‑memory repository.
  • CRUD: Simple in‑memory Repository example, ready to paste.

Use directly from the workspace:

[dependencies]
hexser_potions = { path = "./hexser_potions", version = "0.5" }

Then in your code:

use hexser_potions::auth::{SignUpUser,InMemoryUserRepository, execute_signup};letmut repo = InMemoryUserRepository::default();let user = execute_signup(&mut repo,SignUpUser{email:"a@b.com".into()})?;

Licensing

License: MIT or Apache‑2.0

About

Rust Hexagonal Architecture

Resources

Stars

22 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Hexser Workspace

From the founders: Hi all, thank you for checking out Hexser.

We are the authors of N Lang,, and we strongly believe that Rust's and N Lang's robust type systems and meaningful designs are the future of software engineering. We wrote this library to allow people to create incredible applications in Rust quickly while also giving them best-in-class generative code support and good design.

"Good Design is Good Business" - Thomas J. Watson Jr., the former CEO of IBM.

Hexser allows you to build incredibly small and incredibly large Rust apps that fit perfectly into the Squillo ecosystem but also for professional teams. We are proud to Open-Sourcing this library under MIT or Apache and can't wait to see how you use it.

Enjoy!


Build real-world, hexagonal Rust apps without the ceremony. Hexser is a pragmatic, zero‑boilerplate take on Hexagonal Architecture with a clear Domain–Ports–Adapters flow, fast iteration, automatically graphed inference, and copy‑pasteable examples.


Crates

Main crates (jump in):

  • hexser — Core traits, types, errors, graph model, and opt‑in derive macros. Also available on crates.io: https://crates.io/crates/hexser
  • hexser_macros — Procedural macros (feature = "macros") to reduce repetition.
  • hexser_potions — “Potions”: small, mixable examples for common app operations (formerly “blueprints”).

Documentation:

  • hexser crate README: ./hexser/README.md
  • hexser_potions crate README: ./hexser_potions/README.md
  • hexser_macros crate README: ./hexser_macros/README.md

Why Hexser?

Why teams choose Hexser:

  • Zero boilerplate: write traits for your Ports and small impls for Adapters — that’s it.
  • Query‑first repositories: lightweight domain filter/sort types keep adapters simple and testable.
  • First‑class use‑cases: model application logic as Directives (clear, explicit, testable).
  • Fast feedback: in‑memory adapters and ready‑to‑paste Potions get you shipping quickly.
  • Opt‑in macros: reduce repetition without hiding control flow; nothing “magic” at runtime.

Quick start

Quick start with hexser:

[dependencies]
hexser = { path = "./hexser", version = "0.5", features = ["macros"] }
use hexser::prelude::*;// Domain entitystructUser{id:String}implHexEntityforUser{typeId = String;}// Repository port (query-oriented)// Define lightweight filter/sort types in your domain#[derive(Debug,Clone)]enumUserFilter{ByEmail(String),ById(String),All}#[derive(Debug,Clone,Copy,PartialEq,Eq)]enumUserSortKey{Email}traitUserRepository:QueryRepository<User>{}// Usage (adapter decides how to match filters)// let found = <YourRepo as QueryRepository<User>>::find_one(&repo, &UserFilter::ByEmail("a@b.com".into()))?;

Claude Code plugin

Using hexser with Claude Code? Install the official plugin — it teaches Claude the current hexser API and adds commands for scaffolding, review, visualization, and migration:

/plugin marketplace add squillo/hexser
/plugin install hexser@hexser

It ships an auto-activating hexser skill (it fires whenever you edit Rust that uses hexser) plus slash commands: /hexser:new, /hexser:add-adapter, /hexser:add-usecase, /hexser:review, /hexser:graph, /hexser:migrate, and /hexser:mcp-setup (wires hexser's MCP server so Claude can read your architecture graph live). See plugins/hexser/README.md.

CloudEvents v1.0 Support

Hexser includes built-in support for CloudEvents v1.0 specification, enabling standards-compliant, transport-agnostic domain event publishing and consumption:

  • Standards-compliant: Full CloudEvents v1.0 specification compliance
  • Transport-agnostic: Works with HTTP, Kafka, AMQP, and other transports
  • Hexagonal design: Clear separation between domain events, ports, and adapters
  • Zero dependencies: Native implementation without external CloudEvents crate
  • CQRS integration: Seamless integration with Directives (write) and Queries (read)
use hexser::prelude::*;use hexser::ports::events::{CloudEventsEnvelope,EventPublisher};// Define domain eventstructUserCreated{user_id:String,email:String,}implDomainEventforUserCreated{fnevent_type(&self) -> &str{"com.example.user.created"}fnaggregate_id(&self) -> String{self.user_id.clone()}}// Wrap in CloudEvents envelopelet event = UserCreated{user_id:String::from("user-123"),email:String::from("user@example.com"),};let envelope = CloudEventsEnvelope::from_domain_event(String::from("evt-001"),String::from("/services/user-service"),
event,);// Publish via any transport adapter// publisher.publish(&envelope)?;

Documentation: See hexser/docs/events.md for comprehensive guide including:

  • CloudEvents v1.0 attribute mappings (required: id, source, specversion, type)
  • Transport bindings (HTTP binary/structured, Kafka, AMQP)
  • CQRS integration patterns
  • Security and reliability considerations

Potions Ecosystem

Why “Potions”? They are lightweight, composable recipes you can pour into your app — perfect for experimenting, learning, and scaffolding.

Explore Potions (examples):

  • Authentication: Minimal sign‑up flow with a Directive and an in‑memory repository.
  • CRUD: Simple in‑memory Repository example, ready to paste.

Use directly from the workspace:

[dependencies]
hexser_potions = { path = "./hexser_potions", version = "0.5" }

Then in your code:

use hexser_potions::auth::{SignUpUser,InMemoryUserRepository, execute_signup};letmut repo = InMemoryUserRepository::default();let user = execute_signup(&mut repo,SignUpUser{email:"a@b.com".into()})?;

Licensing

License: MIT or Apache‑2.0

About

Rust Hexagonal Architecture

Resources

Stars

22 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Hexser Workspace

From the founders: Hi all, thank you for checking out Hexser.

We are the authors of N Lang,, and we strongly believe that Rust's and N Lang's robust type systems and meaningful designs are the future of software engineering. We wrote this library to allow people to create incredible applications in Rust quickly while also giving them best-in-class generative code support and good design.

"Good Design is Good Business" - Thomas J. Watson Jr., the former CEO of IBM.

Hexser allows you to build incredibly small and incredibly large Rust apps that fit perfectly into the Squillo ecosystem but also for professional teams. We are proud to Open-Sourcing this library under MIT or Apache and can't wait to see how you use it.

Enjoy!


Build real-world, hexagonal Rust apps without the ceremony. Hexser is a pragmatic, zero‑boilerplate take on Hexagonal Architecture with a clear Domain–Ports–Adapters flow, fast iteration, automatically graphed inference, and copy‑pasteable examples.


Crates

Main crates (jump in):

  • hexser — Core traits, types, errors, graph model, and opt‑in derive macros. Also available on crates.io: https://crates.io/crates/hexser
  • hexser_macros — Procedural macros (feature = "macros") to reduce repetition.
  • hexser_potions — “Potions”: small, mixable examples for common app operations (formerly “blueprints”).

Documentation:

  • hexser crate README: ./hexser/README.md
  • hexser_potions crate README: ./hexser_potions/README.md
  • hexser_macros crate README: ./hexser_macros/README.md

Why Hexser?

Why teams choose Hexser:

  • Zero boilerplate: write traits for your Ports and small impls for Adapters — that’s it.
  • Query‑first repositories: lightweight domain filter/sort types keep adapters simple and testable.
  • First‑class use‑cases: model application logic as Directives (clear, explicit, testable).
  • Fast feedback: in‑memory adapters and ready‑to‑paste Potions get you shipping quickly.
  • Opt‑in macros: reduce repetition without hiding control flow; nothing “magic” at runtime.

Quick start

Quick start with hexser:

[dependencies]
hexser = { path = "./hexser", version = "0.5", features = ["macros"] }
use hexser::prelude::*;// Domain entitystructUser{id:String}implHexEntityforUser{typeId = String;}// Repository port (query-oriented)// Define lightweight filter/sort types in your domain#[derive(Debug,Clone)]enumUserFilter{ByEmail(String),ById(String),All}#[derive(Debug,Clone,Copy,PartialEq,Eq)]enumUserSortKey{Email}traitUserRepository:QueryRepository<User>{}// Usage (adapter decides how to match filters)// let found = <YourRepo as QueryRepository<User>>::find_one(&repo, &UserFilter::ByEmail("a@b.com".into()))?;

Claude Code plugin

Using hexser with Claude Code? Install the official plugin — it teaches Claude the current hexser API and adds commands for scaffolding, review, visualization, and migration:

/plugin marketplace add squillo/hexser
/plugin install hexser@hexser

It ships an auto-activating hexser skill (it fires whenever you edit Rust that uses hexser) plus slash commands: /hexser:new, /hexser:add-adapter, /hexser:add-usecase, /hexser:review, /hexser:graph, /hexser:migrate, and /hexser:mcp-setup (wires hexser's MCP server so Claude can read your architecture graph live). See plugins/hexser/README.md.

CloudEvents v1.0 Support

Hexser includes built-in support for CloudEvents v1.0 specification, enabling standards-compliant, transport-agnostic domain event publishing and consumption:

  • Standards-compliant: Full CloudEvents v1.0 specification compliance
  • Transport-agnostic: Works with HTTP, Kafka, AMQP, and other transports
  • Hexagonal design: Clear separation between domain events, ports, and adapters
  • Zero dependencies: Native implementation without external CloudEvents crate
  • CQRS integration: Seamless integration with Directives (write) and Queries (read)
use hexser::prelude::*;use hexser::ports::events::{CloudEventsEnvelope,EventPublisher};// Define domain eventstructUserCreated{user_id:String,email:String,}implDomainEventforUserCreated{fnevent_type(&self) -> &str{"com.example.user.created"}fnaggregate_id(&self) -> String{self.user_id.clone()}}// Wrap in CloudEvents envelopelet event = UserCreated{user_id:String::from("user-123"),email:String::from("user@example.com"),};let envelope = CloudEventsEnvelope::from_domain_event(String::from("evt-001"),String::from("/services/user-service"),
event,);// Publish via any transport adapter// publisher.publish(&envelope)?;

Documentation: See hexser/docs/events.md for comprehensive guide including:

  • CloudEvents v1.0 attribute mappings (required: id, source, specversion, type)
  • Transport bindings (HTTP binary/structured, Kafka, AMQP)
  • CQRS integration patterns
  • Security and reliability considerations

Potions Ecosystem

Why “Potions”? They are lightweight, composable recipes you can pour into your app — perfect for experimenting, learning, and scaffolding.

Explore Potions (examples):

  • Authentication: Minimal sign‑up flow with a Directive and an in‑memory repository.
  • CRUD: Simple in‑memory Repository example, ready to paste.

Use directly from the workspace:

[dependencies]
hexser_potions = { path = "./hexser_potions", version = "0.5" }

Then in your code:

use hexser_potions::auth::{SignUpUser,InMemoryUserRepository, execute_signup};letmut repo = InMemoryUserRepository::default();let user = execute_signup(&mut repo,SignUpUser{email:"a@b.com".into()})?;

Licensing

License: MIT or Apache‑2.0

About

Rust Hexagonal Architecture

Resources

Stars

22 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Hexser Workspace

From the founders: Hi all, thank you for checking out Hexser.

We are the authors of N Lang,, and we strongly believe that Rust's and N Lang's robust type systems and meaningful designs are the future of software engineering. We wrote this library to allow people to create incredible applications in Rust quickly while also giving them best-in-class generative code support and good design.

"Good Design is Good Business" - Thomas J. Watson Jr., the former CEO of IBM.

Hexser allows you to build incredibly small and incredibly large Rust apps that fit perfectly into the Squillo ecosystem but also for professional teams. We are proud to Open-Sourcing this library under MIT or Apache and can't wait to see how you use it.

Enjoy!


Build real-world, hexagonal Rust apps without the ceremony. Hexser is a pragmatic, zero‑boilerplate take on Hexagonal Architecture with a clear Domain–Ports–Adapters flow, fast iteration, automatically graphed inference, and copy‑pasteable examples.


Crates

Main crates (jump in):

  • hexser — Core traits, types, errors, graph model, and opt‑in derive macros. Also available on crates.io: https://crates.io/crates/hexser
  • hexser_macros — Procedural macros (feature = "macros") to reduce repetition.
  • hexser_potions — “Potions”: small, mixable examples for common app operations (formerly “blueprints”).

Documentation:

  • hexser crate README: ./hexser/README.md
  • hexser_potions crate README: ./hexser_potions/README.md
  • hexser_macros crate README: ./hexser_macros/README.md

Why Hexser?

Why teams choose Hexser:

  • Zero boilerplate: write traits for your Ports and small impls for Adapters — that’s it.
  • Query‑first repositories: lightweight domain filter/sort types keep adapters simple and testable.
  • First‑class use‑cases: model application logic as Directives (clear, explicit, testable).
  • Fast feedback: in‑memory adapters and ready‑to‑paste Potions get you shipping quickly.
  • Opt‑in macros: reduce repetition without hiding control flow; nothing “magic” at runtime.

Quick start

Quick start with hexser:

[dependencies]
hexser = { path = "./hexser", version = "0.5", features = ["macros"] }
use hexser::prelude::*;// Domain entitystructUser{id:String}implHexEntityforUser{typeId = String;}// Repository port (query-oriented)// Define lightweight filter/sort types in your domain#[derive(Debug,Clone)]enumUserFilter{ByEmail(String),ById(String),All}#[derive(Debug,Clone,Copy,PartialEq,Eq)]enumUserSortKey{Email}traitUserRepository:QueryRepository<User>{}// Usage (adapter decides how to match filters)// let found = <YourRepo as QueryRepository<User>>::find_one(&repo, &UserFilter::ByEmail("a@b.com".into()))?;

Claude Code plugin

Using hexser with Claude Code? Install the official plugin — it teaches Claude the current hexser API and adds commands for scaffolding, review, visualization, and migration:

/plugin marketplace add squillo/hexser
/plugin install hexser@hexser

It ships an auto-activating hexser skill (it fires whenever you edit Rust that uses hexser) plus slash commands: /hexser:new, /hexser:add-adapter, /hexser:add-usecase, /hexser:review, /hexser:graph, /hexser:migrate, and /hexser:mcp-setup (wires hexser's MCP server so Claude can read your architecture graph live). See plugins/hexser/README.md.

CloudEvents v1.0 Support

Hexser includes built-in support for CloudEvents v1.0 specification, enabling standards-compliant, transport-agnostic domain event publishing and consumption:

  • Standards-compliant: Full CloudEvents v1.0 specification compliance
  • Transport-agnostic: Works with HTTP, Kafka, AMQP, and other transports
  • Hexagonal design: Clear separation between domain events, ports, and adapters
  • Zero dependencies: Native implementation without external CloudEvents crate
  • CQRS integration: Seamless integration with Directives (write) and Queries (read)
use hexser::prelude::*;use hexser::ports::events::{CloudEventsEnvelope,EventPublisher};// Define domain eventstructUserCreated{user_id:String,email:String,}implDomainEventforUserCreated{fnevent_type(&self) -> &str{"com.example.user.created"}fnaggregate_id(&self) -> String{self.user_id.clone()}}// Wrap in CloudEvents envelopelet event = UserCreated{user_id:String::from("user-123"),email:String::from("user@example.com"),};let envelope = CloudEventsEnvelope::from_domain_event(String::from("evt-001"),String::from("/services/user-service"),
event,);// Publish via any transport adapter// publisher.publish(&envelope)?;

Documentation: See hexser/docs/events.md for comprehensive guide including:

  • CloudEvents v1.0 attribute mappings (required: id, source, specversion, type)
  • Transport bindings (HTTP binary/structured, Kafka, AMQP)
  • CQRS integration patterns
  • Security and reliability considerations

Potions Ecosystem

Why “Potions”? They are lightweight, composable recipes you can pour into your app — perfect for experimenting, learning, and scaffolding.

Explore Potions (examples):

  • Authentication: Minimal sign‑up flow with a Directive and an in‑memory repository.
  • CRUD: Simple in‑memory Repository example, ready to paste.

Use directly from the workspace:

[dependencies]
hexser_potions = { path = "./hexser_potions", version = "0.5" }

Then in your code:

use hexser_potions::auth::{SignUpUser,InMemoryUserRepository, execute_signup};letmut repo = InMemoryUserRepository::default();let user = execute_signup(&mut repo,SignUpUser{email:"a@b.com".into()})?;

Licensing

License: MIT or Apache‑2.0

About

Rust Hexagonal Architecture

Resources

Stars

22 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages