since is used to emulate older versions of nim stdlib with useVersion, see tuse_version.nim.
If a symbol foo is added in version (1,3,5), use {.since: (1.3.5).}, not {.since: (1.4).}, so that it works in devel in between releases.
The emulation cannot be 100% faithful and to avoid adding too much complexity, since is not needed in those cases:
 if a new module is added
 if an overload is added
 if an extra parameter to an existing routine is added
Templates
template since(version: (int, int); body: untyped) {.dirty.}

Evaluates body if the (NimMajor, NimMinor) is greater than or equal to version. Usage:
proc fun*() {.since: (1, 3).} since (1, 3): fun()
Source Edit template since(version: (int, int, int); body: untyped) {.dirty.}

Evaluates body if (NimMajor, NimMinor, NimPatch) is greater than or equal to version. Usage:
proc fun*() {.since: (1, 3, 1).} since (1, 3, 1): fun()
Source Edit