{"id":24556335,"url":"https://github.com/dwyl/mvp","last_synced_at":"2025-10-04T07:32:31.624Z","repository":{"id":39421957,"uuid":"166601787","full_name":"dwyl/mvp","owner":"dwyl","description":"📲 simplest version of the @dwyl app","archived":false,"fork":false,"pushed_at":"2025-01-14T16:12:02.000Z","size":2060,"stargazers_count":91,"open_issues_count":44,"forks_count":2,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-01-14T18:12:35.471Z","etag":null,"topics":["alpinejs","example","examples","minimum-viable-product","mvp","petal","phoenix","phoenix-framework","phoenix-liveview","tailwindcss","time","todo","todolist","tracking","tutorial"],"latest_commit_sha":null,"homepage":"https://mvp.fly.dev","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dwyl.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,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-01-19T22:50:14.000Z","updated_at":"2025-01-14T16:11:58.000Z","dependencies_parsed_at":"2022-07-13T09:20:28.545Z","dependency_job_id":"bb8f720e-49ee-4dab-b9ff-5617458fd986","html_url":"https://github.com/dwyl/mvp","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/dwyl%2Fmvp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwyl%2Fmvp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwyl%2Fmvp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwyl%2Fmvp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dwyl","download_url":"https://codeload.github.com/dwyl/mvp/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235227506,"owners_count":18956141,"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":["alpinejs","example","examples","minimum-viable-product","mvp","petal","phoenix","phoenix-framework","phoenix-liveview","tailwindcss","time","todo","todolist","tracking","tutorial"],"created_at":"2025-01-23T05:00:46.497Z","updated_at":"2025-10-04T07:32:26.212Z","avatar_url":"https://github.com/dwyl.png","language":"Elixir","readme":"\u003cdiv align=\"center\"\u003e\n\n# @dwyl App MVP 💡 ⏳ ✅\n\nThe most basic version\nof the **@dwyl App**\n[**MVP** feature set](https://github.com/dwyl/app/issues/266).\n\n# _Please `try` it_: [mvp.fly.dev](https://mvp.fly.dev/) 🙏\n\nAnd help us to ...\n\n\u003ca href=\"https://agilevelocity.com/product-owner/mvp-mmf-psi-wtf-part-one-understanding-the-mvp\"\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/194400/65666966-b28dbd00-e036-11e9-9d11-1f5d3e22258e.png\" width=\"500\" alt=\"MVP Loop\"\u003e\n\u003c/a\u003e\n\n![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/dwyl/mvp/ci.yml?label=build\u0026style=flat-square\u0026branch=main)\n[![codecov.io](https://img.shields.io/codecov/c/github/dwyl/mvp/main.svg?style=flat-square)](http://codecov.io/github/dwyl/mvp?branch=main)\n[![Hex.pm](https://img.shields.io/hexpm/v/elixir_auth_google?color=brightgreen\u0026style=flat-square)](https://hex.pm/packages/elixir_auth_google)\n[![contributions welcome](https://img.shields.io/badge/feedback-welcome-brightgreen.svg?style=flat-square)](https://github.com/dwyl/app-mvp/issues)\n[![HitCount](https://hits.dwyl.com/dwyl/app-mvp.svg)](https://hits.dwyl.com/dwyl/app-mvp)\n\n\n\u003c/div\u003e\n\u003cbr /\u003e\n\n- [@dwyl App MVP 💡 ⏳ ✅](#dwyl-app-mvp---)\n- [_Please `try` it_: mvp.fly.dev 🙏](#please-try-it-mvpflydev-)\n- [Why? 🤷‍♀️](#why-️)\n- [_What_? 💭](#what-)\n  - [MVP? 🚧](#mvp-)\n  - [Two Apps in _One_ ✌️](#two-apps-in-one-️)\n    - [Proposed MVP UI/UX 💡](#proposed-mvp-uiux-)\n- [_Who?_ 👥](#who-)\n  - [Feedback! 🙏](#feedback-)\n    - [Perform Some Actions in the App 📱](#perform-some-actions-in-the-app-)\n- [_How_? 💻](#how-)\n  - [Tech Stack? 🧰](#tech-stack-)\n  - [Run the MVP App on your `localhost` ⬇️](#run-the-mvp-app-on-your-localhost-️)\n  - [_Build_ It! 👷‍♀️](#build-it-️)\n  - [Contributing 👩‍💻](#contributing-)\n    - [More Features? 🔔](#more-features-)\n\n# Why? 🤷‍♀️ \n\nOur goal with this\n[MVP](https://github.com/dwyl/technical-glossary/issues/44)\nis to build the **minimal _usable_ App** \u003cbr /\u003e\nthat covers our basic \"***Capture, Categorize, Complete***\"\n[**workflow**](https://github.com/dwyl/product-roadmap#what). \u003cbr /\u003e\nIt is well-documented, tested\nand easy for a beginner to run \u0026 understand.\n\nWe _shipped_ the App to\nFly: \n[mvp.fly.dev](https://mvp.fly.dev/)\nand _use/test_ it (_internally_). \u003cbr /\u003e\nAfter collecting initial feedback,\nwe will integrate it into the main\n[dwyl/**app**](https://github.com/dwyl/app) \nrepo.\u003cbr /\u003e\nWe maintain this repo\nas a **reference** for **new joiners** \u003cbr /\u003e\nwanting the **most _basic_ version**\nto **learn** from.\n\n\u003c!-- going to move this somewhere else ...\n## But _Why_...? \n\nOur \n[why](https://www.ted.com/talks/simon_sinek_how_great_leaders_inspire_action)\nfor building this MVP\n(and subsequent [App](https://github.com/dwyl/app))\nis that we felt the \n[_pain_](https://github.com/dwyl/app/issues/213#issuecomment-650531694)\nof _not_ having it!\n\n![nelson-persona](https://user-images.githubusercontent.com/194400/85919307-faf63780-b861-11ea-959c-6a16f0d251fb.png)\n\nIf you have feel the pain of\nlacking focus/priority,\nnot knowing what to work on now/next\nor suffer from \n[procrastination](https://github.com/nelsonic/nelsonic.github.io/issues/849),\nthen you too have the problem we ~~have~~ _are fixing_!\n\nWe consider the problem of knowing what to work on,\nhow to prioritise work\nand keep track of it\nto be a \n[\"keystone\"](https://en.wikipedia.org/wiki/Keystone_(architecture)#Metaphor)\nto what we want to build in the \n[future](https://github.com/dwyl/phase-two).\nIf you _agree_,\nplease let us know.\n\n## Startup Ideas? 💡\n\nWe _love_ talking about startup ideas. ❤️ 🎉 \u003cbr /\u003e\nIf you are new to this, \nwe recommend watching the following\n[YC](https://www.ycombinator.com/)\nvideos:\n\n+ Jared Friedman's\n_How to Get Startup Ideas_:\n[youtu.be/uvw-u99yj8w](https://youtu.be/uvw-u99yj8w?t=424)\n+ Michael Seibel's\n_How to Get and Test Startup Ideas_:\n[youtu.be/vDXkpJw16os](https://youtu.be/vDXkpJw16os)\n+ Kevin Hale's _How to Evaluate Startup Ideas_:\nhttps://youtu.be/DOtCl5PU8F0\n\n\u003cbr /\u003e\n--\u003e\n\n# _What_? 💭\n\nA **mobile-first** \n**_hybrid_**\n**task and activity** (time)\n**tracking tool**.\n\u003c!-- with built-in (basic) team **communication**. --\u003e\n\n## MVP? 🚧\n\nA Minimum Viable Product (MVP),\nas its' name suggests,\nis the _minimum_ \nwe can do to test the idea.\n\n\u003e If you're new to MVPs, \n\u003e the Wikipedia article is a good starting point:\n[wikipedia.org/wiki/Minimum_viable_product](https://en.wikipedia.org/wiki/Minimum_viable_product) \u003cbr /\u003e\n\u003e Or listen to Eric Ries describe it in 3 minutes:\n\u003e https://youtu.be/1FoCbbbcYT8 \u003cbr /\u003e\n\u003e Validate your business idea: \n\u003e THE LEAN STARTUP by Eric Ries:\n\u003e https://youtu.be/QaoVWtLX038 \u003cbr /\u003e\n\u003e Building Minimal Viable Product with Michael Seibel UC Berkeley Course:\n\u003e https://youtu.be/m4isFputh68?t=75 \u003cbr /\u003e\n\u003e How _Not_ To Start A Startup | Michael Seibel: \n\u003e https://youtu.be/9tq-lTjTu2Q?t=413\n\n\n## Two Apps in _One_ ✌️\n\nWe've found it _tedious_ \nto use **several _separate_ apps**\nfor task and time tracking 🤦‍♂️ \u003cbr /\u003e\nand think it's _logical_ \nto _combine_ the functionality. \nThis MVP combines **two apps** into ***one***. 💡\n\nIn our journey \nto understand the features we want\nfrom \n[first principles](https://fs.blog/first-principles/),\nwe **built** the two _separate_ apps:\n\n1. Todo list: \n   [github.com/dwyl/phoenix-liveview-**todo-list**](https://github.com/dwyl/phoenix-liveview-todo-list-tutorial)\n2. Stop Watch (Timer):\n   [github.com/dwyl/phoenix-liveview-**stopwatch**](https://github.com/dwyl/phoenix-liveview-stopwatch)\n\u003c!--\n3. Chat (Communication): \n   [github.com/dwyl/phoenix-liveview-**chat**](https://github.com/dwyl/phoenix-liveview-chat-example)\n--\u003e \n\nWe encourage you to read \nand understand the individual feature Apps\n***`before`***\ntrying to run the MVP. 👀\u003cbr /\u003e\nBut our hope is that\nthe UI/UX in the MVP\nis sufficiently intuitive\nthat it **_immediately_ makes sense**. 🤞\n\n### Proposed MVP UI/UX 💡\n\nThis is our wireframe UI/UX\nwe used as the _guide_ \nto create the MVP functionality:\n\n![mvp-proposed-ux](https://user-images.githubusercontent.com/194400/73374277-d9445480-42b1-11ea-980a-3fabbfe5a9fd.png)\n\nThe idea is a todo list\nthat tracks how much time\nwe spend on a task. \n\nIt's _deliberately_ \"basic\" \nand \n[\"ugly\"](https://youtu.be/m4isFputh68?t=158)\nso we _don't_ focus on aesthetics. 🚀\u003cbr /\u003e\nIt will _definitely_ change over time \nas we _use_ the App \nand collect _feedback_. 💬\u003cbr /\u003e\nIf you want to _help_ make it better,\n[share your thoughts!](https://github.com/dwyl/app-mvp/issues/) 🙏\n\nMore detail on the MVP features: \n[dwyl/app/issues/265](https://github.com/dwyl/app/issues/265)\n\n\u003cbr /\u003e\n\n# _Who?_ 👥\n\nThis **MVP** has **_two_ target audiences**:\n\n1. **@dwyl team** to \n  [\"dogfood\"](https://en.wikipedia.org/wiki/Eating_your_own_dog_food)\n  the basic workflow in our App. \u003cbr /\u003e\n  It's meant to work for _us_\n  and have just enough functionality \n  to solve our _basic_ needs.\n\n2. **Wider community** of people \n  who want to see a \n  **_fully_-functioning `Phoenix` app**\n  with good documentation and testing.\n\n_Longer_ term, the MVP \nwill help future @dwyl team members\nget \n[**up-to-speed**](https://dictionary.cambridge.org/dictionary/english/up-to-speed) \non our App \u0026 Stack **_much_ faster**.\n\n## Feedback! 🙏\n\nYour feedback is very much encouraged/welcome! 💬\u003cbr /\u003e\nIf you find the repo interesting/useful, please ⭐ on GitHub. \u003cbr /\u003e\nAnd if you have any questions,\nplease open an issue:\n[app-mvp/issues](https://github.com/dwyl/app-mvp/issues) ❓\n\u003cbr /\u003e\n\n\n### Perform Some Actions in the App 📱\n\nPlease visit \n[`mvp.fly.dev`](https://mvp.fly.dev/) \n(_or run the app on your `localhost` - see below_) \u003cbr /\u003e\nand perform some actions to test the App:\n\n1. ***Create*** a todo list `item`; \u003cbr /\u003e\n   \u003e Note: this item is **`public`** (anyone can see it!) \u003cbr /\u003e\n   If you want **`private`** items you need to **login**. \n2. ***Start*** a `timer` for the (`public`) `item`\n3. ***Stop*** the `timer` for the `item` (press **`start`**)\n4. ***Mark*** the `item` as `done` (press/tap the `checkbox` to the left of the `item.text`)\n5. ***Click*** on the `done` tab and **`archive`** the `item` (it will disappear)\n6. ***Click*** on the `archived` tab and you will see your archived item\n7. ***Create*** a new (`public`) `item`.\n8. ***Start*** a `timer` for the (`public`) `item` and leave it running\n9. ***Login*** using your **`GitHub`** or **`Google`** account.\n10. ***Create*** a todo list `item` while logged-in with a `tag`.\n11. ***Start*** a `timer` for the `item`\n12. ***Stop*** the `timer`\n13. ***Resume*** the `timer` that you just stopped.\n14. ***Create*** a new (`private`) todo list `item` while logged-in with a different `tag`\n15. ***Start*** a `timer` for the `item` \n16. ***Open*** a second web browser and watch the ***realtime sync***!\n17. ***Click*** on the first private `item` `tag` and see the filtered list of `items` with that `tag`\n18. ***Click*** on the `active` tab or go back in the browser\n19. ***Mark*** the first `item` you created as `done`\n20. ***Edit*** the remaining `item` text for the timer that is already running.\n21. ***Mark*** the (`private`) `item` as `done` and see the time it took.\n22. ***`Archive`*** the `item`\n24. ***Click*** on the `tags` label on the navbar to check the `tag`s created.\n25. ***Go back***\n26. ***Logout*** of the app\n27. ***View*** the (`public`) `item` you created earlier with the `timer` still running.\n\nThat's it. \nThe MVP in a nutshell. \nHere's a **`GIF`** \nif you're low on time:\n\n![speedrun](https://user-images.githubusercontent.com/17494745/198015908-40b08f1a-4f5c-4058-9ec8-dd90c4140edc.gif)\n\nThe **`GIF`** showcases the (todo list) `items`, \n`tag` filtering and `timers`\nbeing synched across 2 browsers\n(one desktop and another mimicking mobile)\nin realtime.\n\n\n\u003cbr /\u003e\n\n# _How_? 💻\n\nOur goal is \nto document as much \nof the implementation as possible,\nso that _anyone_ \ncan follow along.\n\nIf you spot a gap in the docs,\nplease \n[let us know!](https://github.com/dwyl/app-mvp/issues)\n\n\n## Tech Stack? 🧰\n\nThis **MVP** app uses the **`PETAL` Stack**\ndescribed in: \n[dwyl/**technology-stack**](https://github.com/dwyl/technology-stack)\n\nGoing through the individual feature apps listed \n[above](#two-apps-in-one-️)\nwill give you the knowledge\nto understand this MVP.\n\nIf you have _any_ coding skills \n(e.g: `JavaScript`, `Java`,  `Python`, \n`Ruby`, `PHP`, `SQL`, etc.) \u003cbr /\u003e\nyou will be able to follow along\nwithout much difficulty\nas the code is **_deliberately_ simple**.\n\n## Run the MVP App on your `localhost` ⬇️\n\n\u003e **Note**: You will need to have \n**`Elixir`** and **`Postgres` installed**, \u003cbr /\u003e\nsee: \n[learn-elixir#installation](https://github.com/dwyl/learn-elixir#installation)\nand \n[learn-postgresql#installation](https://github.com/dwyl/learn-postgresql#installation)\n\n\u003e **Tip**: check the prerequisites in:\n\u003e [**/phoenix-chat-example**](https://github.com/dwyl/phoenix-chat-example#0-pre-requisites-before-you-start)\n\nOn your `localhost`, \nrun the following commands \nin your terminal:\n\n```sh\ngit clone git@github.com:dwyl/mvp.git \u0026\u0026 cd mvp\nsource .env_sample\nmix setup\n```\n\nThat will load up the necessary env variables to run the app, \ndownload the **`code`**, \ninstall dependencies,\nand create the necessary database + tables.\n\nThe line \n`source .env_sample` \nloads the \n[environment variables](https://github.com/dwyl/learn-environment-variables)\nrequired to run the App.\n\n\n\n\u003c!--\nIf for any reason you have an error while running the setup, try to rebuild/compile\nthe application by deleting the existing `_build` folder and running the `setup` again:\n\n```sh\nrm -r _build\nmix setup\n```\n\n\n## _Single_ Environment Variable: `AUTH_API_KEY`\n\nFollow the instructions in **Step 2** of\n[**`auth_plug`**](https://github.com/dwyl/auth_plug#2-get-your-auth_api_key-)\nto create your \n**`AUTH_API_KEY`**.\n\n--\u003e\n\nOnce the `mix setup` command completes,\nyou can run the app with:\n\n```sh\nmix s\n```\n\nOpen the App in your web browser\n[**`localhost:4000`**](http://localhost:4000/)\nand start your tour! \n\n\u003cbr /\u003e\n\n## _Build_ It! 👷‍♀️\n\nIf you want to understand how to _build_ the MVP,\nplease see:\n[**`BUILDIT.md`**](https://github.com/dwyl/app-mvp/blob/main/BUILDIT.md)\n\n\u003cbr /\u003e\n\n\n## Contributing 👩‍💻\n\nAll contributions \nfrom typo fixes\nto feature requests\nare always welcome! 🙌\n\nPlease start by: \u003cbr /\u003e\na. **Star** the repo on GitHub \n  so you have a \"bookmark\" you can return to. ⭐ \u003cbr /\u003e\nb. **Fork** the repo \n  so you have a copy you can \"hack\" on. 🍴 \u003cbr /\u003e\nc. **Clone** the repo to your `localhost` \n  and run it! (see below) 👩‍💻 \u003cbr /\u003e\n\n\nFor more detail,\nplease see:\n[dwyl/**contributing**](https://github.com/dwyl/contributing)\n\n### More Features? 🔔\n\nPlease note that our goal with this MVP\nis _not_ to have _all_ the features; \nagain, it's _deliberately_  simple.\u003cbr /\u003e\nWe will be adding _lots_ more features\nto the _full_\n[**App**](https://github.com/dwyl/app). \u003cbr /\u003e\nIf you have feature ideas, that's great! 🎉 \u003cbr /\u003e\nPlease _share_ them: \n[**app/issues**](https://github.com/dwyl/app/issues)\n\n","funding_links":[],"categories":["More Tests!"],"sub_categories":["Update the Tests for `GenServer` State"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdwyl%2Fmvp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdwyl%2Fmvp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdwyl%2Fmvp/lists"}