Code Monkey home page Code Monkey logo

tickmate-ios's Introduction

Tickmate

1-bit Journal

Download on the App Store

Screenshots

Description

Tickmate allows you to track any daily occurrences. It is a is a 1-bit journal, meaning each day is either ticked or not. You can track anything from habits you wish to build or break to how often you wash your hair.

  • Use a "reversed" track for occurrences you don't want to happen, so they're automatically ticked unless you untick them.
  • You can use the "allow multiple" feature to be able to tick a single day multiple times.
  • With iCloud sync, all your data will be securely synced across all devices.
  • Add customizable widgets for your Home Screen or Today View.

Changelog

Inspiration

Tickmate for iOS was designed after, but not affiliated with, lordi/tickmate for Android.

Build

Just set your developer team in Xcode and build!

Dependencies:

These dependencies will be automatically fetched by Swift Package Manager in Xcode.

License

This project is open-source and licensed under the The 2-Clause BSD License.

tickmate-ios's People

Contributors

skjiisa avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

tjb

tickmate-ios's Issues

Maintain vertical scroll position between groups

Having a single vertical scroll view that the horizontal paging view is behind would allow the scroll position to be the same across all of them. It would also solve the minor annoyance of the scroll position getting pushed up a little but when swiping between groups.

Date doesn't update on startup if already loaded in memory

Because the app uses so little memory, it can stay loaded over night. This means you can mean open the app in the morning to see it still on yesterday. The app should check for a new day upon entering the foreground.

Using the significant time change probably shouldn't be used (or it could be used along side another solution) as it would not work with the day start offset feature.

Add optional dark app icon

Adding optional app icons could be neat. Ideas include

  • Dark background
    • For this, it would make sense to use Apple's dark mode colors too
  • All boxes filled in
  • All boxes blank

Add scroll to bottom button

Button that overlays on the screen after scrolling up. There's already a "scroll to bottom" button at the top of the list.

Allow start date of reversed Tracks to be changed

Since you can only Tick days after the start date on Reversed tracks, there should be an option to change it. This will be a bit complicated as it will required all existing Ticks to have their day offset changed.

Add more presets

I would like there to be more presets with more examples of the kinds of things you could do with Tickmate. Things other than just habits or chores.

Ideas include:

  • Washed hair
  • Changed sheets
  • Shaved
  • Changed towels

Write documentation

  • Basic Readme on GitHub
  • Take screenshots for different devices
  • Write App Store description

Improve edit behavior for TrackView

Hitting the save button while the keyboard is showing does not hide the keyboard.

It should maybe auto save instead of requiring you to tap the save button so users don't accidentally lose their changes.

Create onboarding process

When the user starts the app for the first time, show a screen that explains how the app works and gives them an option to add preset tracks.

Don't save core data store every tick

Every time the user ticks or unticks, the core data context is saved. This should be performed less often to reduce resource impact.

This could either be done when the app closes, or it could be done on a timer a certain number of seconds after the user last tirks or unticks. For example:

  1. The user ticks
  2. A 5-second timer is started
  3. The user ticks another item before the timer runs out
  4. The timer restarts
  5. The user does not perform another action in 5 seconds
  6. The context saves, saving both ticks at once

Add track groups

Allow tracks to be grouped together. This would be useful for when a user has a lot of tracks and the interface gets tight.

Ideally you would be able to swipe left and right between groups with something like a page tab view.

Sort Tracks on widget by sort order

Currently when manually selecting tracks on the widget, they're sorted by the order you select them in rather than the in-app sort order. The order should match the in-app order.

Create Apple Watch app

Being able to tick from an Apple Watch could be useful.

I think the way this could be implemented would be to simply show a list (probably horizontal for consistency) of Tracks and just that day's tick for it.

Add option to choose when a new day starts

The day will roll over when you open the app after midnight, but some users might want to count that as the same day. For example, a user who regularly stays up past midnight might want to set the day rollover time to be 4 AM, so if they are up at 1 AM, it would still show as being the previous day.

Swiping between group pages can be a bit laggy with lots of tracks

It feels a bit laggy swiping between groups when the "All Tracks" group is enabled and there are a large number of tracks (more than 10 total tracks, with over 30 displayed total among all of the groups).

Using a LazyHStack in PageView instead of the regular HStack didn't seem to make a difference.

Add launch screen

Currently the launch screen is completely blank. This should be replaced by either an empty inline navigation bar, or the app logo.

Add optional today lock

Add a lock feature that would restrict editing to the current day. This way the user doesn't accidentally tick or untick days in the past.

Add option to have today at top

Currently today is at the bottom and you scroll up to see the past. Adding an option to invert that so today is at the top and scrolling down shows the past could be nice.

Update app icon

The app icon should be shortened horizontally to make the margins the same on all sides.

Replace Persistence.processUpdate with FRC in TrackController

Persistence.processUpdate doesn't currently work as the notification object needs to be the coordinator, not the container. Instead of fixing this, this function should be replaced with a Fetched Results Controller in TrackController. This FRC would observe changes and run a function to update the indices whenever a Track is created or deleted. TracksView would then read from this FRC instead of a SwiftUI Fetch Request.

This would likely have much better performance as NSPersistentStoreRemoteChange is run very often, even when there are changes that don't require indices to be updated, and because changes wouldn't require a full fetch request every time.

Create home screen widget

The point of Tickmate is to help you track your engagement in specific activities, so having a home screen widget would be a great feature to help you have a constant reminder of your progress.

Newly added widgets are blank

I had a bad network connection and the widget showed every track as having no ticks except for one which was displayed normally.

Edit: I think I actually was misinterpreting the data when this happened and it isn't an issue. Repurposing this issue for other widget performance related issue:

Newly added widgets can be blank for a while while fetching data from CloudKit, especially with a bad network connection. I can think of two possible solutions:

  1. Only perform a CloudKit fetch if the network connection is strong
  2. In getSnapshot(for:in:completion:), reset the last update time so that new widgets don't try to fetch new data

As far as I can see, the second solution would be much better. The first could potentially also be used alongside it for rare cases where widgets are loaded without a previous timeline entry and without a recent snapshot (maybe on device boot or enabling a home screen).

Ticks sometimes don't show on correct date

The current system for storing a tick's timestamp and day offset doesn't always display ticks correctly. The way Date objects are stored and timezones are likely the cause. A new system for storing Ticks would probably fix this.

One solution would be to store a start date for each Track, then simply store a date offset from that start date in each Tick. Using this solution, you could probably also just have an integer value on each Tick for the count for that day, rather than having a separate Tick item for every tick on one day.

This could also allow reversed tracks to only start tracking after the day it starts.

Ticking days is laggy

The whole process of a new Tick being created, the FRC recognizing it, updating the appropriate TickController, and then that being rendered takes a long time and feels unresponsive. This should probably instead be done on a background thread with a separate simple boolean state variable on Tick views that changes immediately when tapped.

Replace PageView with PageTabViewStyle

iOS 14.5 seems to have fixed the issues with PageTabViewStyle, so PageView can be replaced with that. I don't know if there's any specific benefit to it, but it could be done. Low priority issue.

Recursive save on Track reorder

When Tracks are reordered, there is sometimes a warning in the console that the view context's save function is being called recursively. This doesn't always happen, however.

Add undo feature

If you accidentally tick or untick a day, there should be an option to under changes.

There could either be a button or it could be listening for device shakes.

Add notifications

It would be nice to be able to set a time to give a notification if a track isn't ticked that day.

Unfortunately, I don't know how to do this with iCloud sync. The app could set and update local notifications on launch, but if you tick a day on one device, I don't know how to make it so other devices delete their local notification.

This might be possible with CloudKit push notifications, but if it is, I don't know how.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.