{"id":15010916,"url":"https://github.com/agentm/project-m36","last_synced_at":"2025-05-14T05:11:04.057Z","repository":{"id":22457932,"uuid":"25796504","full_name":"agentm/project-m36","owner":"agentm","description":"Project: M36 Relational Algebra Engine","archived":false,"fork":false,"pushed_at":"2025-05-05T20:14:22.000Z","size":7648,"stargazers_count":929,"open_issues_count":89,"forks_count":47,"subscribers_count":33,"default_branch":"master","last_synced_at":"2025-05-05T20:48:59.762Z","etag":null,"topics":["haskell","relational-algebra"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/agentm.png","metadata":{"files":{"readme":"README.markdown","changelog":"Changelog.markdown","contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2014-10-27T00:17:22.000Z","updated_at":"2025-04-24T09:44:43.000Z","dependencies_parsed_at":"2024-01-05T19:25:08.547Z","dependency_job_id":"bafa1fce-4c4b-4d89-b49c-619faebcd76c","html_url":"https://github.com/agentm/project-m36","commit_stats":{"total_commits":1379,"total_committers":30,"mean_commits":45.96666666666667,"dds":"0.10804931109499638","last_synced_commit":"82ecce87161637c6f97a27b26e4f03551c8979ad"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agentm%2Fproject-m36","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agentm%2Fproject-m36/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agentm%2Fproject-m36/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agentm%2Fproject-m36/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/agentm","download_url":"https://codeload.github.com/agentm/project-m36/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254076850,"owners_count":22010611,"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":["haskell","relational-algebra"],"created_at":"2024-09-24T19:37:20.261Z","updated_at":"2025-05-14T05:11:04.038Z","avatar_url":"https://github.com/agentm.png","language":"Haskell","funding_links":[],"categories":["Haskell"],"sub_categories":[],"readme":"# Ξ Project:M36 Relational Algebra Engine\n\n[![Haskell Programming Language](https://img.shields.io/badge/language-Haskell-blue.svg)](https://www.haskell.org)\n[![Public Domain](https://img.shields.io/badge/license-Public%20Domain-brightgreen.svg)](http://unlicense.org)\n[![Hackage](https://img.shields.io/hackage/v/project-m36.svg)](http://hackage.haskell.org/package/project-m36)\n[![Hackage dependency status](https://img.shields.io/hackage-deps/v/project-m36.svg)](http://packdeps.haskellers.com/feed?needle=project-m36)\n[![Windows Build status](https://ci.appveyor.com/api/projects/status/q7jyddd6dy1ibqdo/branch/master?svg=true)](https://ci.appveyor.com/project/agentm/project-m36)\n[![Github Workflow status](https://github.com/agentm/project-m36/workflows/CI/badge.svg)](https://github.com/agentm/project-m36/actions?query=workflow%3ACI)\n\n\n*Software can always be made faster, but rarely can it be made more correct.*\n\n## Introduction\n\nProject:M36 implements a relational algebra engine as inspired by the writings of Chris Date. Project:M36 supports both SQL and TutorialD interactive access.\n\n## Quick Install\n\nProject:M36 can be downloaded and run via docker, which supports Windows 10+, macOS, and Linux.\n\nRun `docker run -it projectm36/project-m36 tutd` to start the [TutorialD](docs/tutd_tutorial.markdown) command line interface.\n\nRun `docker run -it projectm36/project-m36 sqlegacy` to start the [SQLegacy](docs/sqlegacy.markdown) (SQL dialect) command line interface.\n\n## Description\n\nUnlike most database management systems (DBMS), Project:M36 is opinionated software which adheres strictly to the mathematics of the relational algebra. The purpose of this adherence is to prove that software which implements mathematically-sound design principles reaps benefits in the form of code clarity, consistency, performance, and future-proofing.\n\nProject:M36 can be used as an in-process or remote DBMS.\n\nProject:M36 is written entirely in the [Haskell programming language](https://www.haskell.org/).\n\n## Sample Session\n\n[![asciicast](https://asciinema.org/a/3syu35c8cydm403292a74l1n5.png)](https://asciinema.org/a/3syu35c8cydm403292a74l1n5)\n\n## Use-Cases\n\nProject:M36 supports multiple frontends which target different audiences.\n\n* learn about the relational algebra via TutorialD\n* use SQLegacy to learn how SQL differs from the relational algebra\n* store and manipulate databases\n* use Project:M36 as a native Haskell database backend\n\n## Community\n\n* [TutorialD for SQL Developers](https://www.udemy.com/course/tutoriald-for-sql-developers/)\n  * ask in IRC channel for discount code to get free access\n* [Developer's Blog](https://agentm.github.io/project-m36/)\n* [Mailing List/Discussion Group](https://groups.google.com/d/forum/project-m36)\n* IRC Channel: irc.libera.chat #project-m36 -- [Chat via Web Client](http://kiwiirc.com/nextclient/irc.libera.chat:+6697/#project-m36)\n* [Hackage](https://hackage.haskell.org/package/project-m36)\n* [Diogo Biazus' Project:M36 Video Tutorial](https://www.youtube.com/watch?v=_GC_lxlVEnE)\n\n## Documentation\n\n### Introductory Materials\n\n1. [Installation and Introduction to Project:M36](docs/introduction_to_projectm36.markdown)\n1. [Introduction to the Relational Algebra](docs/introduction_to_the_relational_algebra.markdown)\n1. [TutorialD Cheatsheet](docs/tutd_cheatsheet.markdown)\n1. [TutorialD via Jupyter Notebook Walkthrough](jupyter/TutorialD%20Notebook%20Walkthrough.ipynb)\n1. [TutorialD Tutorial](docs/tutd_tutorial.markdown)\n1. [15 Minute Tutorial](docs/15_minute_tutorial.markdown)\n1. [Developer's Change Log](Changelog.markdown)\n1. [Simple Client API](docs/simple_api.markdown)\n1. [CSV Import/Export](docs/import_export_csv.markdown)\n1. [Developer Setup](docs/dev_setup.markdown)\n\n### Database Comparisons\n\n1. [ACID Database Properties](docs/acid_assessment.markdown)\n1. [On NULL (in SQL)](docs/on_null.markdown)\n1. [Reaching \"Out of the Tarpit\" with Project:M36](docs/reaching_out_of_the_tarpit.markdown)\n1. [An Architecture for Data Independence](docs/data_independence.markdown)'\n\n\n### SQL Support\n\n1. [Why SQLegacy?](docs/why_sqlegacy.markdown)\n1. [SQLegacy Documentation](docs/sqlegacy.markdown)\n\n### Advanced Features\n\n1. [Transaction Graph Operators](docs/transaction_graph_operators.markdown)\n1. [ProjectM36.Client Library](docs/projectm36_client_library.markdown)\n1. [Data Frames for Sorting](docs/dataframes.markdown)\n1. [Adding New Data Types](docs/new_datatypes.markdown)\n1. [Database-Manipulating Functions](docs/database_context_functions.markdown)\n1. [Serving Remote ProjectM36 Databases](docs/server_mode.markdown)\n1. [Using Notifications](docs/using_notifications.markdown)\n1. [Merge Transactions](docs/merge_transactions.markdown)\n1. [Atom (Value) Functions](docs/atomfunctions.markdown)\n1. [Trans-Graph Relational Expressions](docs/transgraphrelationalexpr.markdown)\n1. [Isomorphic Schemas](docs/isomorphic_schemas.markdown)\n1. [Replication](docs/replication.markdown)\n1. [Basic Operator Benchmarks](https://rawgit.com/agentm/project-m36/master/docs/basic_benchmarks.html)\n1. [Merkle Transaction Hashes](docs/merkle_transaction_graph.markdown)\n1. [Handling DDL Changes](docs/Handling_DDL_Changes.markdown)\n\n### Integrations\n\n1. [WebSocket Server](docs/websocket_server.markdown)\n1. [Jupyter Notebook Kernel](docs/jupyter_kernel.markdown)\n1. [Persistent Driver](https://github.com/YuMingLiao/persistent-project-m36)\n\n## Development\n\nProject:M36 is developed in Haskell and compiled with GHC 9.2 or later.\n\n## Related Projects\n\n* [The Third Manifesto](http://thethirdmanifesto.com/): the philosophical basis for relational algebra engines\n* [Rel](http://reldb.org/): a TutorialD implementation against a BerkeleyDB backend\n* [Andl](http://andl.org/): a new database language with SQLite and PostgreSQL backends\n* [Coddie](https://github.com/scvalencia/Coddie): a python-based relational algebra interpreter\n\n## Suggested Reading\n\n* [Out of the Tarpit](https://github.com/papers-we-love/papers-we-love/blob/2eb8d21/design/out-of-the-tar-pit.pdf): a proposed software architecture which minimizes state and complexity. Project:M36 implements the requirements of this paper.\n* [Database Design \u0026 Relational Theory: Normal Forms and All That Jazz](http://shop.oreilly.com/product/0636920025276.do): mathematical foundations for the principles of the relational algebra\n* [Database Explorations: Essays on the Third Manifesto and Related Topics](http://bookstore.trafford.com/Products/SKU-000177853/Database-Explorations.aspx): additional essays and debates on practical approaches to relational algebra engine design\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagentm%2Fproject-m36","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fagentm%2Fproject-m36","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagentm%2Fproject-m36/lists"}