Pomodoro timer in Go
Your NewPomodoro function should simply be called New (the fact that you're creating a Pomodoro thing is inherent in &quot;you're calling pomodoro.New&quot; and &quot;there's only one New&quot;, if there were more, it would make sense to have, say, NewTimer and NewManager).
I don't see what the PomodoroService is actually useful for, it seems to be abstraction for the sake of abstraction. I would simply put the StartBreak, StartLongBreak, and StartWorking methods directly on the timer/manager, as long as this is essentially all there is.
I would probably have called PomodoroManager something else. Probably Pomodoro, PomodoroTimer or (most probably) just Timer (the fact that it's a Pomodoro timer is inherent from being in the pomodoro package).
I am ambivalent about having the various timers and channels in sub-structs. There's few enough that I am not 100% sure not doing so makes the code mode readable. However, since the members are not exported, their types do not need to be exported, since they can't be accessed from outside the package anyway. I would also name the structs in plural, since they clearly contain &quot;channelS&quot;, &quot;durationS&quot; and &quot;intervalS&quot;.
Since you're never seemingly using the values passed across your channels, you might as well make then chan struct{} instead of chan bool.
I would consider making your intervals to be of type time.Duration instead of int.
I would consider wrapping all the exec.Command(&quot;say&quot;, ...).Output()&quot; calls in a non-exported utility function (called, say, say).