Use aptitude instead of apt-get.
And make sure only directly chosen packages are marked as such (type "M"
at libraries and such)

Then this gives a list of directly chosen packages:

  $ aptitude search '~i!~M' | sed 's/^... \([\.a-z0-9-]\+\) .*$/\1/'



If needed besides official packages, use only carefully versioned
unofficial/backported packages:

Official Debian version strings are either x.y.z-a.b.c or (in case of
Debian-native packages) a.b.c. Make sure for all unofficial packages
(wether derived from official ones or not) to include a local tag in the
Debian-part of the version string - as in x.y.z-a.b.yourtag.d and
a.b.yourtag.d (where d is your local revision).

Set your local revision as close as possible to the official package.
  * Simple backport of x.y.z-1.0 is done as x.y.z-0.99.yourtag.1.
  * Tweaked variant of x.y.z-1.0 is done as x.y.z-1.0.yourtag.1.
  * New package is done as x.y.z-0.0.yourtag.1.

Then this gives a list of unofficial packages currently installed:

  $ aptitude search '~i!~Vyourtag' | sed 's/^... \([\.a-z0-9-]\+\) .*$/\1/'