# Characters
When in doubt, stick to a-z, A-Z and numbers. To be safe on multiple operating systems, avoid these characters:

Asterisk *
Pipe |
Brackets < >[ ]
Question mark ?
Equal sign =
Plus sign +
Percent sign %
Quotes "
Slashes \ /
Comma, Period, Colon, Semicolon , . : ;

(Currently, we have a lot of + signs in our depot without incident, but it's still worth avoiding.)

Also, there is one period that is required, between the file name and the extension. eg "perfect.maxpat"

# Filename suffixes

Every filename must end with a valid suffix to ensure cross-platform compatibility.

- Max 5 patches: .maxpat
- Max 4 patches: .pat, or .mxt for patches in text format, or .mxb for patches in binary format
- Collections: .txt (If you say "coll foo", Max will load the file "foo.txt" in your search path.)
- Tables: .mxb (If you say "table foo.mxb, Max will load the file "foo.txt" in your search path.) <-- this needs Max 5 verification
- Help patches (max 5): .maxhelp (so that Max's help system will find them)
- Help patches: .help.pat
- Sound files: .aif, .aiff, .wav, .snd, .mp3, etc.
- SDIF files: .sdif
- Java source code: .java
- Javascript source code: .js
- MIDI files: .mid
- PDF files: .pdf
- Text files: .txt
- XML files: .xml
- Image files: .gif, .jpg, .png, etc.

# All filenames must be unique

It must be possible to have "everything from CNMAT" (the MMJ Depot, all CNMAT's externals, our [cnmat:node/2941|recommended third-party externals], etc.) in one's search path with no name conflicts.

Whenever possible avoid name conflicts with other third-party externals, patches, packages, etc.

CNMAT does not have a filename prefix for all the patches in the MMJ Depot. (E.g., our envelope follower is called "envelope-follower~", not "cnmat.envelope-follower~".)

# All filenames should be descriptive

Patches names should say what the patch does clearly and succinctly. It's a bit of an art to find the "sweet spot" between completely descriptive byt annoyingly long and hard to type patch names versus terse and noninformative patch names.

The name of a patch should say what the patch does, not what context the author of the patch originally intended it to be used in. E.g., a GUI wrapper around lookup~ should not be called "phasor-groove~" just because it was written to sit between a phasor~ object and a groove~ object.