NMT: is what is sent to kick it all off? ID of 0
SYNC: which I assume I send every so often from ID 128 (function code 1 of address 0)
Time: slightly new on me, I guess the master sends this every so often with the time in the data?
Are you implementing a NMT master or slave node ?
NMT includes a "state machine" (stopped, pre-op, operational) and the messages (sent by the master) to make each node transition to a given state. Some messages (e.g. PDO) are only allowed in the Operational state. This can be kept pretty simple depending on what you want to be compatible with.
SYNC : unidirectional, sent by master, slaves may ignore. Depends what you're doing.
heartbeat protocol : may be optional, also depends what you want to be compatible with.
A "full" stack (I looked mainly at
Lely, well-maintained and appears quite thorough, and
CANopenNode, also maintained and the main dev was responsive but at the time (2020) it was difficult to get to compile, I think it was around a fairly large set of breaking changes. Those were going to use way to much ROM on my puny stm32f0xx (IIRC a minimal stack was at least 12-16k flash), so I decided to implement a skeleton canopen implementation. If you plan on needing many SDO features, LSS, etc. I strongly recommend using a stack. Reinventing that wheel gets old fast; I was at the point where I needed multi-segment SDOs but project was binned just in time.
To summarize : take a good look at what you really *need* to implement, and if it's a long list, or not clear in your mind how to implement the whole thing, think hard about using a full stack, and make sure your target has enough rom+ram.