{"id":13480718,"url":"https://github.com/sboesebeck/morphium","last_synced_at":"2026-04-09T19:03:12.296Z","repository":{"id":3914193,"uuid":"5003275","full_name":"sboesebeck/morphium","owner":"sboesebeck","description":"Morphium - Mongodb Messaging and Java Object Mapper ","archived":false,"fork":false,"pushed_at":"2024-05-19T11:20:46.000Z","size":10984,"stargazers_count":55,"open_issues_count":2,"forks_count":19,"subscribers_count":17,"default_branch":"master","last_synced_at":"2024-05-19T14:07:05.488Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sboesebeck.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2012-07-12T12:48:33.000Z","updated_at":"2024-05-21T08:48:14.531Z","dependencies_parsed_at":"2024-01-24T11:31:10.198Z","dependency_job_id":"d78523fc-ebf8-486f-8b12-72a5a78b88b2","html_url":"https://github.com/sboesebeck/morphium","commit_stats":null,"previous_names":[],"tags_count":134,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sboesebeck%2Fmorphium","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sboesebeck%2Fmorphium/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sboesebeck%2Fmorphium/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sboesebeck%2Fmorphium/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sboesebeck","download_url":"https://codeload.github.com/sboesebeck/morphium/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245835909,"owners_count":20680291,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-07-31T17:00:44.111Z","updated_at":"2026-04-09T19:03:12.279Z","avatar_url":"https://github.com/sboesebeck.png","language":"Java","funding_links":[],"categories":["Libraries"],"sub_categories":["Java"],"readme":"# Morphium 6.2.0\n\n**Feature-rich MongoDB ODM and messaging framework for Java 21+**\n\nAvailable languages: English and [Deutsch](README.de.md)\n\n- 🗄️ **High-performance object mapping** with annotation-driven configuration\n- 📨 **Integrated message queue** backed by MongoDB (no extra infrastructure)\n- ⚡ **Multi-level caching** with cluster-wide invalidation\n- 🔌 **Custom MongoDB wire-protocol driver** tuned for Morphium\n- 🧪 **In-memory driver** for fast tests (no MongoDB required)\n- 🎯 **JMS API (experimental)** for standards-based messaging\n- 🚀 **Java 21** with virtual threads for optimal concurrency\n\n[![Maven Central](https://img.shields.io/maven-central/v/de.caluga/morphium.svg)](https://search.maven.org/artifact/de.caluga/morphium)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\n## 🎯 Why Morphium?\n\nMorphium is the only Java ODM that ships a message queue living inside MongoDB. If you already run MongoDB, you can power persistence, messaging, caching, and change streams with a single component.\n\n| Feature | Morphium | Spring Data + RabbitMQ | Kafka |\n|---------|----------|------------------------|-------|\n| Infrastructure | MongoDB only | MongoDB + RabbitMQ | MongoDB + Kafka |\n| Setup complexity | ⭐ Very low | ⭐⭐⭐ Medium | ⭐⭐⭐⭐⭐ High |\n| Message persistence | Built in | Optional | Built in |\n| Message priority | ✅ Yes | ✅ Yes | ❌ No |\n| Distributed locks | ✅ Yes | ❌ No | ❌ No |\n| Throughput (internal tests) | ~8K msg/s | 10K–50K msg/s | 100K+ msg/s |\n| Operations | ⭐ Very easy | ⭐⭐ Medium | ⭐⭐⭐⭐ Complex |\n\n_* Numbers are indicative and depend heavily on hardware and workload._\n\n## 📚 Documentation\n\n### Quick access\n- **[Documentation hub](docs/index.md)** – entry point for all guides\n- **[Overview](docs/overview.md)** – core concepts, quick start, compatibility\n- **[Upgrade v6.1→v6.2](docs/howtos/migration-v6_1-to-v6_2.md)** – migration checklist for 6.2.0\n- **[Migration v5→v6](docs/howtos/migration-v5-to-v6.md)** – step-by-step upgrade guide\n- **[InMemory Driver Guide](docs/howtos/inmemory-driver.md)** – capabilities, caveats, testing tips\n- **[Optimistic Locking (`@Version`)](docs/howtos/optimistic-locking.md)** – prevent lost updates with `@Version`\n- **[SSL/TLS \u0026 MONGODB-X509](docs/ssl-tls.md)** – encrypted connections and certificate-based authentication\n\n### More resources\n- Aggregation examples: `docs/howtos/aggregation-examples.md`\n- Messaging implementations: `docs/howtos/messaging-implementations.md`\n- Performance guide: `docs/performance-scalability-guide.md`\n- Production deployment: `docs/production-deployment-guide.md`\n- Monitoring \u0026 troubleshooting: `docs/monitoring-metrics-guide.md`\n\n## 🚀 What’s New in v6.2\n\n### Multi-Module Maven Build\nMorphium is now a multi-module project: `morphium-parent` (BOM), `morphium` (core library), and `poppydb` (server). The core library `de.caluga:morphium` no longer drags in server dependencies (Netty, etc.) — 90% leaner for users who just need the ODM.\n\n### PoppyDB – Standalone MongoDB-Compatible Server\nThe former MorphiumServer is now an independent module `de.caluga:poppydb`. It implements the MongoDB Wire Protocol as an in-memory server with Replica Set emulation, Change Streams, Aggregation Pipeline, and snapshot-based persistence.\n\nPoppyDB and Morphium Messaging are **optimized for each other** — both sides recognize the counterpart and adapt their behavior, resulting in lower latency and less overhead than with a real MongoDB as messaging backend.\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ede.caluga\u003c/groupId\u003e\n    \u003cartifactId\u003epoppydb\u003c/artifactId\u003e\n    \u003cversion\u003e6.2.0\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e \u003c!-- or remove scope for production use --\u003e\n\u003c/dependency\u003e\n```\n\n- ✅ **Full Wire Protocol**: Any MongoDB client can connect (mongosh, Compass, PyMongo, ...)\n- ✅ **Messaging Backend**: Run Morphium messaging without MongoDB — optimized for low-latency\n- ✅ **CLI Tooling**: `poppydb-6.2.0-cli.jar` for standalone deployment\n- ✅ **Replica Set Emulation**: Test cluster behavior without real MongoDB\n- ✅ **Snapshot Persistence**: `--dump-dir` / `--dump-interval` to preserve data across restarts\n\n### MorphiumDriverException is now unchecked\n`MorphiumDriverException` extends `RuntimeException` — consistent with the MongoDB Java driver. Eliminates 40+ boilerplate `catch-wrap-rethrow` blocks.\n\n### @Reference Cascade Delete/Store\n`@Reference` now supports `cascadeDelete` and `cascadeStore` for automatic lifecycle management of referenced entities.\n\n### @AutoSequence\nAnnotation-driven auto-increment sequences — no manual counter management needed.\n\n### @CreationTime Improvements\nWorks correctly with `store()` and `storeList()`, supports `@CreationTime` on `Date`, `long`, and `String` fields.\n\n### CosmosDB Auto-Detection\nMorphium detects Azure CosmosDB connections and automatically adjusts behavior for compatibility.\n\nSee [CHANGELOG](CHANGELOG.md) for full details.\n\n## Upgrading from 6.1.x to 6.2.0\n\n### Breaking: MorphiumDriverException is now unchecked\n\n`MorphiumDriverException` extends `RuntimeException` instead of `Exception`. This eliminates boilerplate `catch-wrap-rethrow` blocks but requires attention in existing code:\n\n```java\n// Multi-catch — simplify (MorphiumDriverException IS a RuntimeException now)\n// Before:\ncatch (RuntimeException | MorphiumDriverException e) { ... }\n// After:\ncatch (RuntimeException e) { ... }\n\n// throws declarations — can be removed (but still compile if left in)\n// Before:\npublic void doStuff() throws MorphiumDriverException { ... }\n// After:\npublic void doStuff() { ... }\n\n// Standalone catch — works unchanged\ncatch (MorphiumDriverException e) { ... }  // still compiles\n```\n\n### Breaking: MorphiumServer → PoppyDB\n\nThe embedded MongoDB-compatible server was extracted to its own module and renamed:\n\n| | 6.1.x | 6.2.0 |\n|---|---|---|\n| Maven artifact | included in `morphium` | separate: `de.caluga:poppydb:6.2.0` |\n| Package | `de.caluga.morphium.server` | `de.caluga.poppydb` |\n| Main class | `MorphiumServer` | `PoppyDB` |\n| CLI JAR | `morphium-*-server-cli.jar` | `poppydb-*-cli.jar` |\n| Test tag | `@Tag(\"morphiumserver\")` | `@Tag(\"poppydb\")` |\n\nIf you use PoppyDB in tests, add the dependency:\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ede.caluga\u003c/groupId\u003e\n    \u003cartifactId\u003epoppydb\u003c/artifactId\u003e\n    \u003cversion\u003e6.2.0\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\nWire-protocol compatibility is preserved — PoppyDB responds to both `poppyDB` and `morphiumServer` in the hello handshake.\n\n### Deprecated: Direct config setters → sub-objects\n\n`MorphiumConfig` now organizes settings into typed sub-objects. The old setters still work but are `@Deprecated`:\n\n```java\n// 6.1.x style (deprecated but functional)\ncfg.setDatabase(\"mydb\");\ncfg.addHostToSeed(\"localhost\", 27017);\n\n// 6.2.0 style (preferred)\ncfg.connectionSettings().setDatabase(\"mydb\");\ncfg.clusterSettings().addHostToSeed(\"localhost\", 27017);\ncfg.driverSettings().setDriverName(\"PooledDriver\");\n```\n\nAvailable sub-objects: `connectionSettings()`, `clusterSettings()`, `driverSettings()`, `messagingSettings()`, `cacheSettings()`, `authSettings()`, `threadPoolSettings()`, `objectMappingSettings()`, `writerSettings()`.\n\n### New: Multi-Module Maven Structure\n\nThe `morphium` core artifact no longer bundles server dependencies (Netty, etc.). If you only use Morphium as ODM, your dependency tree is ~90% leaner — no changes to your pom needed.\n\n### Migration checklist\n\n1. **Search for `catch (RuntimeException | MorphiumDriverException`** — simplify to `catch (RuntimeException`\n2. **Search for `import de.caluga.morphium.server`** — replace with `import de.caluga.poppydb`\n3. **Search for `MorphiumServer`** — rename to `PoppyDB`\n4. **Search for `@Tag(\"morphiumserver\")`** — rename to `@Tag(\"poppydb\")`\n5. **Add `poppydb` dependency** if you use the embedded server in tests\n6. **Optional:** migrate direct config setters to sub-object style\n7. **Optional:** adopt new features (`@Reference(cascadeDelete)`, `@AutoSequence`, `@Version`)\n\n## 🚀 What’s New in v6.1.x\n\n### MONGODB-X509 Client-Certificate Authentication\n- Connect to MongoDB instances that require mutual TLS / x.509 client certificates\n- Configure via `AuthSettings.setAuthMechanism(\"MONGODB-X509\")` together with the existing `SslHelper` mTLS setup\n\n### `@Version` – Optimistic Locking\nPrevents lost updates in concurrent environments without requiring pessimistic database locks. See `docs/howtos/optimistic-locking.md` for the full guide.\n\n## 🚀 What’s New in v6.0\n\n### Java 21 \u0026 Modern Language Features\n- **Virtual threads** for high-throughput messaging and change streams\n- **Pattern matching** across driver and mapping layers\n- **Records**: Not yet supported as `@Entity` or `@Embedded` types (see [#116](https://github.com/sboesebeck/morphium/issues/116))\n- **Sealed class support** for cleaner domain models\n\n### Driver \u0026 Connectivity\n- **SSL/TLS Support**: Secure connections to MongoDB instances (added in v6.0)\n- **Virtual threads** in the driver for optimal concurrency\n\n### Messaging Improvements\n- **Fewer duplicates** thanks to refined message processing\n- **Virtual-thread integration** for smoother concurrency\n- **Higher throughput** confirmed in internal benchmarking\n- **Distributed locking** for coordinated multi-instance deployments\n\n### In-Memory Driver Enhancements\n- **No MongoDB required** for unit tests or CI pipelines\n- **Significantly faster test cycles** in pure in-memory mode\n- **~93% MongoDB feature coverage** including advanced operations\n- **Full aggregation pipeline** with `$lookup`, `$graphLookup`, `$bucket`, `$mergeObjects`\n- **MapReduce support** with JavaScript engine integration\n- **Array operators** including `$pop`, `$push`, `$pull`, `$addToSet`\n- **Change streams \u0026 transactions** available for integration testing\n- **Drop-in replacement** for most development and testing scenarios\n\n### Documentation Overhaul\n- Complete rewrite of the guide set\n- Practical examples and end-to-end use cases\n- Dedicated migration playbook from 5.x to 6.x\n- Architecture insights and best practices\n\n## ✅ Requirements\n- Java 21 or newer\n- MongoDB 5.0+ for production deployments\n- Maven\n\nMaven dependencies:\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ede.caluga\u003c/groupId\u003e\n  \u003cartifactId\u003emorphium\u003c/artifactId\u003e\n  \u003cversion\u003e[6.2.0,)\u003c/version\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n  \u003cgroupId\u003eorg.mongodb\u003c/groupId\u003e\n  \u003cartifactId\u003ebson\u003c/artifactId\u003e\n  \u003cversion\u003e4.7.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nMigrating from v5? → `docs/howtos/migration-v5-to-v6.md`\n\n## ⚡ Quick Start\n\n### Maven dependency\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ede.caluga\u003c/groupId\u003e\n  \u003cartifactId\u003emorphium\u003c/artifactId\u003e\n  \u003cversion\u003e6.2.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### Object mapping example\n\n```java\nimport de.caluga.morphium.Morphium;\nimport de.caluga.morphium.MorphiumConfig;\nimport de.caluga.morphium.annotations.*;\nimport de.caluga.morphium.driver.MorphiumId;\nimport java.time.LocalDateTime;\nimport java.util.List;\n\n// Entity definition\n@Entity\npublic class User {\n    @Id\n    private MorphiumId id;\n    private String name;\n    private String email;\n    private LocalDateTime createdAt;\n    // getters/setters\n}\n\n// Configuration\nMorphiumConfig cfg = new MorphiumConfig();\ncfg.connectionSettings().setDatabase(\"myapp\");\ncfg.clusterSettings().addHostToSeed(\"localhost\", 27017);\ncfg.driverSettings().setDriverName(\"PooledDriver\");\n\nMorphium morphium = new Morphium(cfg);\n\n// Store entity\nUser user = new User();\nuser.setName(\"John Doe\");\nuser.setEmail(\"john@example.com\");\nuser.setCreatedAt(LocalDateTime.now());\nmorphium.store(user);\n\n// Query\nList\u003cUser\u003e users = morphium.createQueryFor(User.class)\n    .f(\"email\").matches(\".*@example.com\")\n    .sort(\"createdAt\")\n    .asList();\n```\n\n### Messaging example\n\n```java\nimport de.caluga.morphium.messaging.MorphiumMessaging;\nimport de.caluga.morphium.messaging.Msg;\n\n// Messaging setup\nMorphiumMessaging messaging = morphium.createMessaging();\nmessaging.setSenderId(\"my-app\");\nmessaging.start();\n\n// Send a message\nMsg message = new Msg(\"orderQueue\", \"Process Order\", \"Order #12345\");\nmessage.setPriority(5);\nmessage.setTtl(300000); // 5 minutes\nmessaging.sendMessage(message);\n\n// Receive messages\nmessaging.addListenerForTopic(\"orderQueue\", (m, msg) -\u003e {\n    // process order ...\n    return null; // no reply\n});\n```\n\n### Properties \u0026 environment configuration\n\n```bash\n# Environment variables\nexport MONGODB_URI='mongodb://user:pass@localhost:27017/app?replicaSet=rs0'\nexport MORPHIUM_DRIVER=inmem\n\n# System properties\nmvn -Dmorphium.uri='mongodb://localhost/mydb' test\n\n# Properties file (morphium.properties)\nmorphium.hosts=mongo1.example.com:27017,mongo2.example.com:27017\nmorphium.database=myapp\nmorphium.replicaSet=myReplicaSet\n```\n\n## 🧪 Tests \u0026 Test Runner\n\n### Maven\n```bash\n# All tests\nmvn test\n\n# Full build with checks\nmvn clean verify\n\n# Tagged test selection\nmvn test -Dgroups=\"core,messaging\"\n\n# Run against a real MongoDB instance\nmvn test -Dmorphium.driver=pooled -Dmorphium.uri=mongodb://localhost/testdb\n```\n\n### `./runtests.sh` helper\n```bash\n# Default: in-memory driver (fast, no MongoDB required)\n./runtests.sh\n\n# Run tagged suites\n./runtests.sh --tags core,messaging\n\n# Parallel runs\n./runtests.sh --parallel 8 --tags core\n\n# Retry only failed methods\n./runtests.sh --rerunfailed\n./runtests.sh --rerunfailed --retry 3\n\n# Single test class\n./runtests.sh CacheTests\n\n# Statistics\n./runtests.sh --stats\n./getFailedTests.sh  # list failed methods\n```\n\nRun `./runtests.sh --help` to see every option.\n\n### Multi-Backend Testing\n\nTests are parameterized to run against multiple drivers. Use `--driver` to select:\n\n```bash\n# InMemory only (fastest, default)\n./runtests.sh --driver inmem\n\n# Against external MongoDB with all drivers (pooled + single + inmem)\n./runtests.sh --uri mongodb://mongo1,mongo2/testdb --driver all\n\n# Against external MongoDB with pooled driver only\n./runtests.sh --uri mongodb://mongo1,mongo2/testdb --driver pooled\n\n# Against PoppyDB (auto-starts local server)\n./runtests.sh --poppydb --driver pooled  # --morphium-server is a deprecated alias\n```\n\n**Complete test coverage** requires running against all backends:\n```bash\n# 1. Fast in-memory tests\n./runtests.sh --driver inmem\n\n# 2. Real MongoDB tests\n./runtests.sh --uri mongodb://your-mongodb/testdb --driver all\n\n# 3. PoppyDB tests\n./runtests.sh --poppydb --driver pooled  # --morphium-server is a deprecated alias\n```\n\n**New in v6.1**\n- ✅ **Unified test base**: All tests now use `MultiDriverTestBase` with parameterized drivers\n- ✅ **Driver selection**: Each test declares which drivers it supports via `@MethodSource`\n- ✅ **Parallel safe**: Tests isolated per parallel slot with unique databases\n\n**New in v6.0**\n- ✅ **Method-level reruns**: `--rerunfailed` only re-executes failing methods\n- ✅ **No more hangs**: known deadlocks resolved\n- ✅ **Faster iteration**: noticeably quicker partial retries\n- ✅ **Better filtering**: class-name filters now reliable\n\nRun `./runtests.sh --help` to see every option.\n\n### Test configuration precedence\n\n`TestConfig` consolidates all test settings. Priority order:\n1. System properties (`-Dmorphium.*`)\n2. Environment variables (`MORPHIUM_*`, `MONGODB_URI`)\n3. `src/test/resources/morphium-test.properties`\n4. Defaults (localhost:27017)\n\n## 🔧 PoppyDB \u0026 InMemoryDriver\n\n### InMemoryDriver – MongoDB-free testing\n\nThe in-memory driver provides a largely MongoDB-compatible data store fully in memory:\n\n**Features**\n- ✅ Full CRUD operations\n- ✅ Rich query operator coverage\n- ✅ Aggregation stages such as `$match`, `$group`, `$project`\n- ✅ Single-instance transactions\n- ✅ Basic change streams\n- ✅ JavaScript `$where` support\n\n**Performance**\n- Significantly faster than external MongoDB for tests\n- No network latency\n- No disk I/O\n- Ideal for CI/CD pipelines\n\n**Usage**\n```bash\n# All tests with the in-memory driver\n./runtests.sh --driver inmem\n\n# Specific tests\nmvn test -Dmorphium.driver=inmem -Dtest=\"CacheTests\"\n```\n\nSee `docs/howtos/inmemory-driver.md` for feature coverage and limitations.\n\n### PoppyDB – Standalone MongoDB replacement\n\nPoppyDB (formerly MorphiumServer) runs the Morphium wire-protocol driver in a separate process, allowing it to act as a lightweight, in-memory MongoDB replacement.\n\n**Maven dependency** (server module):\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ede.caluga\u003c/groupId\u003e\n  \u003cartifactId\u003epoppydb\u003c/artifactId\u003e\n  \u003cversion\u003e6.2.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n**Building the Server**\n\n```bash\nmvn clean package -pl poppydb -am -Dmaven.test.skip=true\n```\n\nThis creates `poppydb/target/poppydb-6.2.0-cli.jar`.\n\n**Running the Server**\n\n```bash\n# Start the server on the default port (17017)\njava -jar poppydb/target/poppydb-6.2.0-cli.jar\n\n# Start on a different port\njava -jar poppydb/target/poppydb-6.2.0-cli.jar --port 8080\n\n# Start with persistence (snapshots)\njava -jar poppydb/target/poppydb-6.2.0-cli.jar --dump-dir ./data --dump-interval 300\n```\n\n**Replica Set Support (Experimental)**\n\nPoppyDB supports basic replica set emulation. Start multiple instances with the same replica set name and seed list:\n\n```bash\njava -jar poppydb/target/poppydb-6.2.0-cli.jar --rs-name my-rs --rs-seed host1:17017,host2:17018\n```\n\n**Use cases**\n- Local development without installing MongoDB\n- CI environments\n- Embedded database for desktop applications\n- Smoke-testing MongoDB tooling (mongosh, Compass, mongodump, ...)\n\n**Current limitations**\n- No sharding support\n- Some advanced aggregation operators and joins still missing\n\nSee `docs/poppydb.md` for more details on persistence and replica sets.\n\n## 🚀 Production Use Cases\n\nOrganizations run Morphium in production for:\n- **E-commerce**: order processing with guaranteed delivery\n- **Financial services**: coordinating transactions across microservices\n- **Healthcare**: patient-data workflows with strict compliance\n- **IoT platforms**: device state synchronization and command distribution\n- **Content management**: document workflows and event notifications\n\n## 🤝 Community \u0026 Contribution\n\n### Stay in touch\n- **Blog**: https://caluga.de\n- **GitHub**: [sboesebeck/morphium](https://github.com/sboesebeck/morphium)\n- **Issues**: Report bugs or request features on GitHub\n\n### Contributing\n\nWe appreciate pull requests! Areas where help is especially welcome:\n- **InMemoryDriver**: expanding MongoDB feature coverage\n- **Documentation**: tutorials, examples, translations\n- **Performance**: profiling and benchmarks\n- **Tests**: broader scenarios and regression coverage\n\n**How to contribute**\n1. Fork the repository\n2. Create a feature branch **from `develop`** (`git checkout -b feature/AmazingFeature develop`)\n3. Commit your changes (`git commit -m 'Add AmazingFeature'`)\n4. Push the branch (`git push origin feature/AmazingFeature`)\n5. Open a pull request **against `develop`** (not `master`)\n\n**Important:** `master` is only updated during releases. All PRs must target `develop`.\n\n**Tips**\n- Respect test tags (`@Tag(\"inmemory\")`, `@Tag(\"poppydb\")`)\n- Run `./runtests.sh --tags core` before submitting\n- Update documentation when you change APIs\n\n## 📜 License\n\nApache License 2.0 – see [LICENSE](LICENSE) for details.\n\n## 🙏 Thanks\n\nThanks to every contributor who helped ship Morphium 6.2.0 and to the MongoDB community for continuous feedback.\n\n---\n\n**Questions?** Open an issue on [GitHub](https://github.com/sboesebeck/morphium/issues) or browse the [documentation](docs/index.md).\n\n**Planning an upgrade?** Follow the [migration guide](docs/howtos/migration-v5-to-v6.md).\n\nEnjoy Morphium 6.2.0! 🚀\n\n*Stephan Bösebeck \u0026 the Morphium team*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsboesebeck%2Fmorphium","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsboesebeck%2Fmorphium","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsboesebeck%2Fmorphium/lists"}