mirror of
https://github.com/hamaluik/timecop.git
synced 2025-05-17 16:56:05 +08:00
cleaned up README
This commit is contained in:
281
README.md
281
README.md
@ -1,277 +1,48 @@
|
||||
<h1 align="center">
|
||||
Time Cop
|
||||
<br>
|
||||
<img alt="icon" width="128" height="128" src="icon.no-bg.pink.svg">
|
||||
</h1>
|
||||
<div align="center">
|
||||
A time tracking app that respects your privacy and gets the job done without being fancy.
|
||||
A time tracking app that respects your privacy and gets the job done without getting too fancy.
|
||||
</div>
|
||||
<br />
|
||||
<div align="center">
|
||||
<img alt="GitHub" src="https://img.shields.io/github/license/hamaluik/timecop?style=flat-square">
|
||||
</div>
|
||||
|
||||
## User Stories
|
||||
## Motivation
|
||||
|
||||
- [ ] App must be fully offline
|
||||
- [ ] Record time by starting a timer with a button
|
||||
- [ ] Timers may (or may not) have descriptions
|
||||
- [ ] Timers may (or may not) have a project
|
||||
- [ ] Timers may be started with a missing description and/or project
|
||||
- [ ] Timers may be started with a description and/or project pre-applied
|
||||
- [ ] Timers must be manually stopped with a button
|
||||
- [ ] Timers may be "resumed" by effectively cloning the project and description and starting from the current time
|
||||
- [ ] Multiple timers may be active at once
|
||||
- [ ] The user may specify a default project to pre-populate all new timers with
|
||||
- [ ] Timers can be created manually by specifying a start time
|
||||
- [ ] Optionally, an end time may be specified to prevent the timer from running
|
||||
- [ ] Optionally, a length of time may be specified to prevent the timer from running and also automatically calculate the end time
|
||||
- [ ] A “dashboard” screen will display:
|
||||
- [ ] a list of the latest completed timers,
|
||||
- [ ] the current running timers,
|
||||
- [ ] an interface to start or create new timers
|
||||
- [ ] Timers may be edited (whether running or not). All data related to each timer may be changed:
|
||||
- [ ] Start time
|
||||
- [ ] End time
|
||||
- [ ] Description
|
||||
- [ ] Project
|
||||
- [ ] Timers may be deleted (whether running or not)
|
||||
- [ ] A confirmation should be presented to the user to confirm the deletion
|
||||
- [ ] Projects can be created with a project name and a colour
|
||||
- [ ] The colour will be pre-populated by the system, chosen to not intersect with any other project colours
|
||||
- [ ] The colour can be set by the user before creating the project
|
||||
- [ ] The project name must never be empty
|
||||
- [ ] Each project can be edited:
|
||||
- [ ] The project name
|
||||
- [ ] The project colour
|
||||
- [ ] Export database using native OS sharing
|
||||
- [ ] Export data as `csv` (or `xlsx`?) using native OS sharing
|
||||
- [ ] Optionally filtered by:
|
||||
1. Date
|
||||
2. Project
|
||||
- [ ] Optionally grouped by timer descriptions on a daily basis
|
||||
- [ ] Export format should be able to include:
|
||||
- [ ] Timer description
|
||||
- [ ] Timer project
|
||||
- [ ] Timer start time (RFC 3339)
|
||||
- [ ] Timer end time (RFC 3339)
|
||||
- [ ] Timer length in hours
|
||||
- [ ] Timer length in minutes
|
||||
- [ ] Export settings should be persisted and re-used as defaults
|
||||
- [ ] The list of open-source software should be included
|
||||
- [ ] Starting / stopping timers should be located at the bottom of the screen to facilitate one-handed operation
|
||||
I'd rather not do time-tracking at all, but since its a necessity for my work, it's either use an app or keep track of things manually (which I'm terrible at). There are many time tracking apps on the app stores (and I have tried several of them), but each of them has at least one pain point that eventually drives me off—some cost more money than I think they should,
|
||||
others have (what I consider) poorly designed interfaces, some are way too complicated, some don't export data easily, most require an internet connection, I have privacy concerns with a large number of them, etc, etc.
|
||||
|
||||
### In Consideration
|
||||
Time tracking in and of itself is rather straightforward (hence all the apps on the app stores), so I figured “why not use this as an opportunity to practice mobile development and learn some new things?”. This app is the result of that question—its a useful tool that I use every day for work, but also a sample project to work off of and share with others.
|
||||
|
||||
* An in-app-purchase should be available as a donation towards the development of the app.
|
||||
* Perhaps tied to the ability to export data (either reports or the database)?
|
||||
* A reporting screen which gives you the same filtering options as exporting data in a spreadsheet but displays the results locally
|
||||
* As charts
|
||||
* As tables
|
||||
## Features
|
||||
|
||||
## Mockups
|
||||
* Offline-only, mobile-only (iOS / Android)
|
||||
* Fully private—there is no tracking / spying / advertising / etc
|
||||
* Keep track of tasks with multiple parallel timers that can be started with the tap of a button
|
||||
* Associate timers with projects to group your work (or don't)
|
||||
* Start, stop, edit, and delete timers whenever with no fuss
|
||||
* Export data as a `.csv` file, filtered by timespans and projects
|
||||
* Export the app's database for full access to all of its data
|
||||
* Open source ([licensed under Apache-2.0](LICENSE))—fork away!
|
||||
|
||||
(crudely drawn with http://asciiflow.com/)
|
||||
## Contributing
|
||||
|
||||
### Dashboard
|
||||
I'm happy to take bug reports and pull requests if you want to help improve _Time Cop_, but I fundamentally want to keep this app relatively small and simple. If that's not for you, there's [plenty](https://toggl.com/) of [other](https://clockify.me/) [options](https://www.workpuls.com/) [out](https://www.manictime.com/) [there](https://trackabi.com/).
|
||||
|
||||
```
|
||||
+-----------------------------------------------+
|
||||
+-----------------------------------------------|
|
||||
| Time Cop || : ||
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| Monday, Feb. 26 |
|
||||
| |
|
||||
| Do the thing My Project 01h38m29s |
|
||||
| |
|
||||
| Some other thing 16h19m02s |
|
||||
| |
|
||||
| Today |
|
||||
| |
|
||||
| Get coffee with Joe 16m00s |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
| Running timers: |
|
||||
| |
|
||||
| Refactor the whatsit 05h38m01s |
|
||||
| |
|
||||
| Debug the whatsit proced... 00h16m27s |
|
||||
| |
|
||||
+--------------------------------------------+--+
|
||||
|| Enter task description || Project || > ||
|
||||
|-----------------------------------------------|
|
||||
+-----------------------------------------------+
|
||||
```
|
||||
The app is created pretty much entirely in [Dart](https://dart.dev/) using [Flutter](https://flutter.dev/), and I tried to make heavy use of the [Bloc](https://bloclibrary.dev/#/) pattern.
|
||||
|
||||
### Timer Editor
|
||||
Here are a few resources to get you started if this is your first Flutter project:
|
||||
|
||||
```
|
||||
+-----------------------------------------------+
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| < Edit Timer |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +-----------------------------------------+ |
|
||||
| |
|
||||
| Description |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +-----------------------------------------+ |
|
||||
| |
|
||||
| Project |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +-----------------------------------------+ |
|
||||
| |
|
||||
| Start Time |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +-----------------------------------------+ |
|
||||
| |
|
||||
| End Time |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +---+ +---+ |
|
||||
| | | | | |
|
||||
| | X | | /| |
|
||||
| | | | v | |
|
||||
| +---+ +---+ |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
```
|
||||
- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
|
||||
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
|
||||
|
||||
### Projects List
|
||||
For help getting started with Flutter, view its [online documentation](https://flutter.dev/docs), which offers tutorials,
|
||||
samples, guidance on mobile development, and a full API reference.
|
||||
|
||||
```
|
||||
+-----------------------------------------------+
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| < Projects |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| ▓ My Cool Project > |
|
||||
| |
|
||||
| |
|
||||
| ▒ That big corp that always pays late > |
|
||||
| |
|
||||
| |
|
||||
| ░ Myself > |
|
||||
| |
|
||||
| |
|
||||
| * note: swipe to delete, but with |
|
||||
| confirmation dialogue |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +---+ |
|
||||
| | | |
|
||||
| | + | |
|
||||
| | | |
|
||||
| +---+ |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
## Todo
|
||||
|
||||
```
|
||||
|
||||
### Project Editor
|
||||
|
||||
```
|
||||
+-----------------------------------------------+
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| < New Project / Edit Project |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +----------------------------------------+ |
|
||||
| |
|
||||
| Name |
|
||||
| |
|
||||
| |
|
||||
| +-----+ |
|
||||
| |░░░░░| |
|
||||
| |░░░░░| Colour |
|
||||
| |░░░░░| |
|
||||
| +-----+ |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +---+ +---+ |
|
||||
| | | | | |
|
||||
| | X | | /| |
|
||||
| | | | v | |
|
||||
| +---+ +---+ |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
```
|
||||
A list of “user stories” (and I use that term very loosely) guiding the development of this app is available in [design/user-stories.md](design/user-stories.md); any unchecked boxes are outstanding items on the todo list!
|
||||
|
224
design/mockups.md
Normal file
224
design/mockups.md
Normal file
@ -0,0 +1,224 @@
|
||||
<!--
|
||||
Copyright 2020 Kenton Hamaluik
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
## Mockups
|
||||
|
||||
Crudely drawn with http://asciiflow.com/, these are mockups that were created to explore what the interface of _Time Cop_ should look like. It hasn't ended up looking exactly like these mockups imply, but for the most part its fairly close.
|
||||
|
||||
### Dashboard
|
||||
|
||||
```
|
||||
+-----------------------------------------------+
|
||||
+-----------------------------------------------|
|
||||
| Time Cop || : ||
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| Monday, Feb. 26 |
|
||||
| |
|
||||
| Do the thing My Project 01h38m29s |
|
||||
| |
|
||||
| Some other thing 16h19m02s |
|
||||
| |
|
||||
| Today |
|
||||
| |
|
||||
| Get coffee with Joe 16m00s |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
| Running timers: |
|
||||
| |
|
||||
| Refactor the whatsit 05h38m01s |
|
||||
| |
|
||||
| Debug the whatsit proced... 00h16m27s |
|
||||
| |
|
||||
+--------------------------------------------+--+
|
||||
|| Enter task description || Project || > ||
|
||||
|-----------------------------------------------|
|
||||
+-----------------------------------------------+
|
||||
```
|
||||
|
||||
### Timer Editor
|
||||
|
||||
```
|
||||
+-----------------------------------------------+
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| < Edit Timer |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +-----------------------------------------+ |
|
||||
| |
|
||||
| Description |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +-----------------------------------------+ |
|
||||
| |
|
||||
| Project |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +-----------------------------------------+ |
|
||||
| |
|
||||
| Start Time |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +-----------------------------------------+ |
|
||||
| |
|
||||
| End Time |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +---+ +---+ |
|
||||
| | | | | |
|
||||
| | X | | /| |
|
||||
| | | | v | |
|
||||
| +---+ +---+ |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
```
|
||||
|
||||
### Projects List
|
||||
|
||||
```
|
||||
+-----------------------------------------------+
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| < Projects |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| ▓ My Cool Project > |
|
||||
| |
|
||||
| |
|
||||
| ▒ That big corp that always pays late > |
|
||||
| |
|
||||
| |
|
||||
| ░ Myself > |
|
||||
| |
|
||||
| |
|
||||
| * note: swipe to delete, but with |
|
||||
| confirmation dialogue |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +---+ |
|
||||
| | | |
|
||||
| | + | |
|
||||
| | | |
|
||||
| +---+ |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
|
||||
```
|
||||
|
||||
### Project Editor
|
||||
|
||||
```
|
||||
+-----------------------------------------------+
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| < New Project / Edit Project |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +----------------------------------------+ |
|
||||
| |
|
||||
| Name |
|
||||
| |
|
||||
| |
|
||||
| +-----+ |
|
||||
| |░░░░░| |
|
||||
| |░░░░░| Colour |
|
||||
| |░░░░░| |
|
||||
| +-----+ |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| +---+ +---+ |
|
||||
| | | | | |
|
||||
| | X | | /| |
|
||||
| | | | v | |
|
||||
| +---+ +---+ |
|
||||
| |
|
||||
+-----------------------------------------------+
|
||||
```
|
71
design/user-stories.md
Normal file
71
design/user-stories.md
Normal file
@ -0,0 +1,71 @@
|
||||
<!--
|
||||
Copyright 2020 Kenton Hamaluik
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
## User Stories
|
||||
|
||||
- [x] App must be fully offline
|
||||
- [x] Record time by starting a timer with a button
|
||||
- [x] Timers may (or may not) have descriptions
|
||||
- [x] Timers may (or may not) have a project
|
||||
- [x] Timers may be started with a missing description and/or project
|
||||
- [x] Timers may be started with a description and/or project pre-applied
|
||||
- [x] Timers must be manually stopped with a button
|
||||
- [x] Timers may be "resumed" by effectively cloning the project and description and starting from the current time
|
||||
- [x] Multiple timers may be active at once
|
||||
- [ ] The user may specify a default project to pre-populate all new timers with
|
||||
- [x] A “dashboard” screen will display:
|
||||
- [x] a list of the latest completed timers,
|
||||
- [x] the current running timers,
|
||||
- [x] an interface to start or create new timers
|
||||
- [x] Timers may be edited (whether running or not). All data related to each timer may be changed:
|
||||
- [x] Start time
|
||||
- [x] End time
|
||||
- [x] Description
|
||||
- [x] Project
|
||||
- [x] Timers may be deleted (whether running or not)
|
||||
- [x] A confirmation should be presented to the user to confirm the deletion
|
||||
- [x] Projects can be created with a project name and a colour
|
||||
- [x] The colour will be pre-populated by the system
|
||||
- [x] The colour can be set by the user before creating the project
|
||||
- [x] The project name must never be empty
|
||||
- [x] Each project can be edited:
|
||||
- [x] The project name
|
||||
- [x] The project colour
|
||||
- [x] Export database using native OS sharing
|
||||
- [x] Export data as `csv` (or `xlsx`?) using native OS sharing
|
||||
- [x] Optionally filtered by:
|
||||
1. Date
|
||||
2. Project
|
||||
- [ ] Optionally grouped by timer descriptions on a daily basis
|
||||
- [ ] Export format should be able to include:
|
||||
- [x] Timer description
|
||||
- [x] Timer project
|
||||
- [ ] Timer start time (RFC 3339)
|
||||
- [ ] Timer end time (RFC 3339)
|
||||
- [x] Timer length in hours
|
||||
- [ ] Timer length in minutes
|
||||
- [ ] Export settings should be persisted and re-used as defaults
|
||||
- [x] The list of open-source software should be included
|
||||
- [x] Starting / stopping timers should be located at the bottom of the screen to facilitate one-handed operation
|
||||
- [ ] Ability to import a previously exported database, overwriting what we currently have?
|
||||
|
||||
### In Consideration
|
||||
|
||||
* An in-app-purchase should be available as a donation towards the development of the app.
|
||||
* Perhaps tied to the ability to export data (either reports or the database)?
|
||||
* A reporting screen which gives you the same filtering options as exporting data in a spreadsheet but displays the results locally
|
||||
* As charts
|
||||
* As tables
|
Reference in New Issue
Block a user