The Next Major Version of Grindstone is Under Development

First–especially in light of the challenging times lately–I offer my most humble apologies to the community for being a little out of touch for the past few months. We have been busy laying the foundation for the next major version of your favorite time tracking app! I’m making this post because the project has taken enough shape that discussing it openly here now has the potential to be beneficial. Since we’re not quite sure exactly how it will be branded at this point, we’ll be calling it “Grindstone Next” on this forum until we are sure.

This is the first time we have openly discussed an impending release of a major version of Grindstone prior to its release. So, I apologize in advance for any mistakes I might make while trying to communicate clearly and manage expectations reasonably. But, we’re hoping that giving the community insight into what’s coming will encourage you to give us your insights in turn, which have the potential to make this next version better than it otherwise would have been. So, please, don’t hesitate to ask your questions about Grindstone Next in this category on the forums. I will do my best to answer them promptly, even if the answer is that we don’t know yet.

So, let me lay some juicy deets on ya and we’ll see what comes of it.


A Solid Foundation

Grindstone Next is being built with the very latest release of Microsoft .NET Core. If .NET 5 is made generally available before Grindstone Next ships, we will migrate over to it and refactor as necessary to capitalize on new features and improve performance and stability. Grindstone Next also uses the ultra-resilient SQLite as its local database engine—no more questionably stable SQL CE databases like in Grindstone 3 or comparatively brittle XML or JSON files like in Grindstone 2 or Grindstone 4.

A Change in Hierarchy

In Grindstone 4, assignments and time slices are somewhat independent of each other, since they are both directly related to a person and a work item. In Grindstone Next, only assignments are directly related to a person and a work item. Time slices now relate to an assignment. However, it will be possible to have multiple assignments with the same combination of associated person and work item. And, of course, Grindstone Next will allow you to simply “start timing a work item” (it will create the assignment for you behind the scenes).

Out with Properties, in with Traits

Grindstone 2 was the first to introduce a way for you guys to add your own fields to its tasks. They were freeform text only. Then, Grindstone 4 renamed them to “Properties” and gave you the option to make them either freeform text or a choice between values in a list you provided. Grindstone Next is renaming them once again (and hopefully for the last time) to “Traits” and expanding upon their varieties:

  • Freeform Text has been split into Single Line Text and Multi-Line Text, letting Grindstone know whether text values may contain line breaks.
  • List Values remain as they are now.
  • The new type Number specifies a value that must be a number (either whole or decimal).
  • The new type Instant specifies a value that must be a date and time.
  • The new type Duration specifies a value that must be a length of time.
  • The new type Instant Range specifies a value that must be a starting Instant and an ending Instant, with the former preceding or equal to the latter.

Grindstone Next is also expanding the domain of entities to which traits can be attached to… all of them. You will be able to make traits for work items, people, assignments, and time slices. You will even be able to make traits of list value traits. For example, suppose you made a list value trait of work items called “Project”, and provided Grindstone with your complete list of projects. You could then make a list value trait of the Project trait called “Client”, provide Grindstone with your complete list of clients, and then select the client for each project.

Since traits are now ubiquitous, we have removed all of the hard-coded fields with the exception of the instant range for a time slice. Newly created Grindstone Next databases will still feature many of the fields you know from previous versions of Grindstone, but that will be because default traits will have been created for you. If you don’t want your work items to have names or notes, you will be able to change things like that.

A Winning Formula

Grindstone 4 currently performs a number of common calculations for entities in relation to other entities and makes them available to be shown in views. For example, a work items view can show you the duration of all time slices for each work item or the duration of all your time slices for each work item, etc. We’re tossing all of these hard-coded calculations and replacing them with a robust formula evaluation engine.

In Grindstone Next, columns in views are not selected. They are created. When you add columns, you will supply the formula that will be evaluated to show a value for each entry in the view. These formulas are like the ones you might see in a spreadsheet app, except specialized to deal with Grindstone paradigms. The basic logical and mathematical operations are there (e.g. And, Or, Add, Subtract, Divide, etc.), ways to manipulate trait values (e.g. AddDays, ToLowerCase, ToMinutes, etc.), and ways to aggregate the values of traits (e.g. First, Sum, Min, Max, etc.). Much like a query language, you will be able to provide predicate formulas to test trait values (and the entities to which they are related) for whether they should be included in the sum you’re building, for example.

This system is quite smart. If you’re building a view of time slices and a formula for one of your columns calls for the trait value of a work item, it will climb up the hierarchy on its own, through the assignment to the work item, to retrieve that value. It’s also monitoring the underlying data for changes, immediately recalculating the results displayed in your views as necessary. Views use formulas not just for columns, but also for filtering. Grindstone 4’s somewhat limited filtering approach has been replaced with this system, whereby you provide a formula that will test each potential entity for whether it should be included.

Don’t worry if the notion of writing formulas seems a little foreboding. Grindstone Next will feature a host of user assistance, including a formula designer and formulas for common tasks, including the formerly hard-coded calculations that were present in previous versions of Grindstone. Our goal is that users with the aptitude and ambition to write formulas highly specialized to their workflow will have the ability to do so, while those more inclined to go with off-the-shelf solutions will have a wide variety of good options available.

A Face Lift

The user interface of Grindstone Next for Windows will be built on either the Windows Presentation Framework (WPF) on .NET Core (or .NET) and using the beautiful, open-source Material Design in XAML library, or on the WinUI library and using the modern, spiffy-looking Fluent Design System by Microsoft. Either way, Grindstone Next will be a lot more appealing to look at than any previous version of Grindstone.


There’s obviously a lot more to Grindstone Next, and it’s still a work in progress. But these, we think, are some of the most impactful and exciting things coming. What do you think? Do you have any questions? Hit reply and share your thoughts!

WOW.

Grindstone Next also uses the ultra-resilient SQLite as its local database engine

Was this a difficult decision to make? I think it is really wise. I have been pulling for its use since Grindstone 2. SQLite is really well designed for this purpose, and is really portable. And because the db is a file (and not a server), it will be easy to do whatever it is I want to do…so long as I don’t f’ it up. (Albeit, being a sqlite file, I can just copy the file and do whatever it is I want.)

expanding the domain of entities to which traits can be attached to… all of them

Excellent! Numerous times I have been wanting to hang a property on something that properties are not accepted. This will help develop my own custom dashboards.


At this point, no. When we were developing Grindstone 4 for mobile, we saw that all the mobile developers had nothing but nice things to say about SQLite and learned it was for good reason.


Yeah, it’s kinda funny how much this new pattern is dominating everything. You may have also noticed this:

That’s so serious that the first thing we do when we’re setting up a new database is to create a single line text trait of traits themselves so that they can be named:

var traitMetadata = EntityBase.Metadata[typeof(ITrait)];
var traitEntityTypeId = traitMetadata.EntityTypeId;
var traitEntityTypeIdTraitId = traitMetadata.Traits[nameof(ITrait.EntityTypeId)].Id;
var traitTypeTraitId = traitMetadata.Traits[nameof(ITrait.Type)].Id;
var traitNameTraitId = Guid.NewGuid();

var engine = container.Resolve<IEngine>();
engine.ApplyChanges
(
    new CreateEntity
    (
        // the kind of entity being created (a trait)
        traitEntityTypeId,
        // an ID for the entity
        traitNameTraitId,
        // trait values for the entity
        (
            // what type of entity is this trait for?
            traitEntityTypeIdTraitId,
            Guid.NewGuid(),

            // traits themselves
            traitEntityTypeId
        ),
        (
            // what type of value does this trait hold?
            traitTypeTraitId,
            Guid.NewGuid(),

            // single lines of text
            TraitType.SingleLineText
        ),
        (
            // what is the name of this trait?
            // (yes, a trait is now providing an instance of itself for itself)
            traitNameTraitId,
            Guid.NewGuid(),

            // the name of this trait of traits is "Name"
            "Name"
        )
    )
);

Great job bud :clap: :clap: :clap:. Really looking forward to the next release. We’re big fans.

Welcome to the forums, @ImmanuelKantSociety. I’m glad you like the app!

Thank you! We know time exists. However, because human sensibility is merely receptive, it is not itself sensible and must therefore remain otherwise unknowable to us. Then we got Grindstone and time tracking is much easier now.

Haha, thanks @ImmanuelKantSociety. I more than welcome your clever philosophy jokes. But perhaps they’d be better placed in their own thread. :wink:

At the request of some users, we are including Boolean traits as another type.