{"id":13394192,"url":"https://github.com/thesephist/mira","last_synced_at":"2025-05-12T08:31:30.167Z","repository":{"id":97277444,"uuid":"250137506","full_name":"thesephist/mira","owner":"thesephist","description":"A place for notes, but for the people I keep in touch with","archived":false,"fork":false,"pushed_at":"2021-04-12T17:44:54.000Z","size":4043,"stargazers_count":115,"open_issues_count":1,"forks_count":11,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-07-31T17:21:27.919Z","etag":null,"topics":["contacts","crm","go","single-page-app","torus-dom"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/thesephist.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2020-03-26T02:03:01.000Z","updated_at":"2024-05-14T23:44:12.000Z","dependencies_parsed_at":"2023-06-26T03:02:20.222Z","dependency_job_id":null,"html_url":"https://github.com/thesephist/mira","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesephist%2Fmira","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesephist%2Fmira/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesephist%2Fmira/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesephist%2Fmira/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thesephist","download_url":"https://codeload.github.com/thesephist/mira/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225130753,"owners_count":17425506,"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":["contacts","crm","go","single-page-app","torus-dom"],"created_at":"2024-07-30T17:01:12.028Z","updated_at":"2024-11-18T04:46:55.819Z","avatar_url":"https://github.com/thesephist.png","language":"JavaScript","funding_links":[],"categories":["JavaScript","Repositories"],"sub_categories":[],"readme":"# Mira ☎️\n\nMira is a personal contacts manager for myself, built for my workflow. A place for notes, but for the people I keep in touch with. It's built with [Torus](https://github.com/thesephist/torus) on the frontend as a single-page app and a lightweight Go backend.\n\nMira is designed for quick actions and references to people I've met, and things I want to remember about those people. It looks like this in action:\n\n![Mira on desktop](screenshot.png)\n\nIn particular, in addition to normal contact info you see in every app, Mira is capable of storing a few specific kinds of data I like to remember about people:\n\n- past meetings (\"mtg\"): where are all the places I've met this person, in which occasion, and what did we talk about that I want to remember?\n- last met (\"last\"): when did we last talk? This is useful when I want to follow up with people I haven't talked to in too long.\n- place: what city do they live in? This is useful for remembering to visit people I haven't seen in a while whenever I visit a city for the first time in some time.\n- unstructured notes: things like extracurricular or volunteering involvements, event attendance, hobbies, and other extraneous information that's useful to know, but not trivial.\n\nIf you want to try Mira, there's a fork of Mira [here](https://github.com/abdelhai/mira) that you can one-click deploy on [Deta](https://www.deta.sh)!\n\n## ⚠️ Mira is a prototype ⚠️\n\nThis current version of Mira is a \"rough draft\" of sorts. Eventually, I hope to write a version of Mira that's fast, efficient, and works exactly the way I want my workflow to be. But a problem here is that I'm not even 100% sure what that workflow _looks like_ yet -- I've never had anything that worked super well for me, so my current workflow is pretty ad-hoc and haphazard.\n\nThe main point of this first version of Mira is to have a tool that works well, and is a close approximation of an ideal interface, but where I can iterate on the data models and structures / interface quickly to _find_ that ideal workflow, for a second revision, which will probably be written in [Ink](https://github.com/thesephist/ink) as a part of the [Polyx](https://github.com/thesephist/polyx) software suite.\n\n## Architecture\n\nMira is a mostly-static application on the backend with a single dynamic API endpoint, `/data`, which just stores and makes available a JSON blob for the frontend. This data is managed entirely by the frontend, for quick iteration speed whenever I want to change the data schema. Mira's current version explicitly doesn't use SQLite3 or another relational DB for this reason.\n\nThe frontend application is a pretty vanilla Torus application. The core of the Contact data model is stored in the `Contact` record class:\n\n```js\nclass Contact extends Record {\n\n    singleProperties() {\n        return [\n            // [ui label, property name, placeholder, use \u003ctextarea\u003e?]\n            ['name', 'name', 'name'],\n            ['place', 'place', 'place'],\n            ['work', 'work', 'work'],\n            ['twttr', 'twttr', '@username'],\n            ['last', 'last', 'last met...'],\n            ['notes', 'notes', 'notes', true],\n        ];\n    }\n\n    multiProperties() {\n        return [\n            ['tel', 'tel', 'tel'],\n            ['email', 'email', 'email'],\n            ['mtg', 'mtg', 'meeting', true],\n        ]\n    }\n\n}\n```\n\nGiven this schema specified on the model, the rest of the application is designed to compose naturally to result in an editing and viewing interface that suits the schema for each contact item. Adjusting this schema automatically adapts the application to store new kinds of data about each contact, which allows me to tweak and experiment with the exact data format quickly.\n\nIn other words, given this schema, the interface shown in the screenshot in this README above is automatically generated by the UI. As we add new fields to the schema, the UI will automatically adapt to include them. This is the core of this, Mira v0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthesephist%2Fmira","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthesephist%2Fmira","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthesephist%2Fmira/lists"}