Linetime
Line Time was a text-based pomodoro app I wrote. Write out your plan, fire off the timer, and get to work! Linetime automatically clears tasks off of your todo list, and sends you notifications reminding you to take a break or go to the next task.
We all know that to optimize our days, we need to plan them out ahead of time.
Calendars are great for appointments. But if you want to plan out deep work, like writing, programming, design, or editing a video, you don’t care about when things happen. You care about how much time you spend on each task, the order of those tasks, and how far you’ve gotten in your agenda.
First, I want to solve the basic problem of notes and schedules being disconnected. Then, I want to go further and help people feel a sense of progress.
Example:
[25 minutes] デザインの編集 🖋️
Email to everyone else
Make sure current date is in filename
[5 minutes] 休み😅
walk around for a little bit
[25 minutes] 昼ごはん、ストレッチ 🍲
[5 minutes] 休み
[25 minutes] 仕事、メール返事 ✉️
[30 minutes] Take a long break☕️☕️☕️
Architecture:
Redux + React
Components:
Hierarchy:
Note Container:
Editor
Header
Chunks
TimeChunk
Interval
TimePoint
Task
containers/CurrentNote
components/Note
components/ChunkList
containers/ActiveChunk
containers/Chunk
components/Interval
containers/TimeManager
components/TimeController
components/PlayPauseButton
components/CountdownDisplay
components/CountdownTime
Data
State: {
currentNote: NoteId,
Notes: {
[id] : {
chunks: [array of chunk Ids]
}
},
Chunks: {
[id] : {
editorState: [draftjs EditorState],
intervalContent: String,
intervalSeconds: Float,
}
},
currentChunk: [chunk id],
timerSeconds: float,
timerActive: boolean
}
Flow:
When you first open the app, there will be one note Inside of that note there will be one chunk. Every note has at least one chunk.
When you write an interval at the beginning of a line, with a space at the end, then a new chunk is created. If the current chunk is the first chunk then it simply gets an interval. If the current chunk is not the base chunk, a new chunk is created. The new chunk receives the interval and creates a new editor.
The first chunk with an interval in a new document is the active chunk. It has a “time controller” floating to its left(structurally, the modal is inside). The time-controller receives the current interval as input.
Notes
- when using an SVG created from Figma, delete the width and height from the xml.
- is it expected behavior for the chunk to merge up after you press backspace? I think if the line has no interval content
- Sidebar + note system
- need to wrap the note in a container, inside of that container will be one column for the intervals and another for the text
- Because my state transformations were set up correctly, I could compose endTimer() and startTimer() to create a skip function, with almost zero effort.