diff --git a/doc/changes.rst b/doc/changes.rst
index 1872af6..c3bd530 100644
--- a/doc/changes.rst
+++ b/doc/changes.rst
@@ -5,7 +5,9 @@ Change Log
 0.3.1 (unreleased)
 ------------------
 
-* No changes yet.
+* Only a ``desi`` file is needed to trigger the pipeline (PR `#5`_).
+
+.. _`#5`: https://github.com/desihub/desitransfer/pull/5
 
 0.3.0 (2019-09-04)
 ------------------
diff --git a/py/desitransfer/data/desi_transfer_daemon.ini b/py/desitransfer/data/desi_transfer_daemon.ini
index ec62e7d..8b46a1b 100644
--- a/py/desitransfer/data/desi_transfer_daemon.ini
+++ b/py/desitransfer/data/desi_transfer_daemon.ini
@@ -11,7 +11,8 @@ destination = ${DESI_SPECTRO_DATA}
 # Directory where HPSS backups will be stored.
 hpss = desi/spectro/data
 # A valid exposure--that the pipeline should be run on--should contain these files.
-expected_files = desi-{exposure}.fits.fz,fibermap-{exposure}.fits,guider-{exposure}.fits.fz
+# expected_files = desi-{exposure}.fits.fz,fibermap-{exposure}.fits,guider-{exposure}.fits.fz
+expected_files = desi-{exposure}.fits.fz
 # Checksum files have this format.
 checksum_file = checksum-{night}-{exposure}.sha256sum
 

Trigger pipeline on only a desi file.
Currently the pipeline is activated when three files are present.  Change this so that only a `desi-{exposure}.fits.fz` file needs to be present.  This requires only changing a configuration file, not any actual code.
diff --git a/py/desitransfer/test/test_daemon.py b/py/desitransfer/test/test_daemon.py
index 4dfb499..33e64d8 100644
--- a/py/desitransfer/test/test_daemon.py
+++ b/py/desitransfer/test/test_daemon.py
@@ -70,8 +70,9 @@ class TestDaemon(unittest.TestCase):
                          os.path.join(os.environ['HOME'], 'bin', 'wrap_desi_night.sh'))
         self.assertEqual(d.conf['pipeline'].getdict('commands'),
                          {'science': 'redshifts'})
-        self.assertEqual(c.getlist('expected_files'),
-                         ['desi-{exposure}.fits.fz', 'fibermap-{exposure}.fits', 'guider-{exposure}.fits.fz'])
+        self.assertEqual(c.getlist('expected_files'), ['desi-{exposure}.fits.fz'])
+        # self.assertEqual(c.getlist('expected_files'),
+        #                  ['desi-{exposure}.fits.fz', 'fibermap-{exposure}.fits', 'guider-{exposure}.fits.fz'])
 
     @patch.object(TransferDaemon, '_configure_log')
     def test_TransferDaemon_alternate_init(self, mock_cl):
@@ -98,8 +99,9 @@ class TestDaemon(unittest.TestCase):
                          os.path.join(os.environ['HOME'], 'bin', 'wrap_desi_night.sh'))
         self.assertEqual(d.conf['pipeline'].getdict('commands'),
                          {'science': 'redshifts'})
-        self.assertEqual(c.getlist('expected_files'),
-                         ['desi-{exposure}.fits.fz', 'fibermap-{exposure}.fits', 'guider-{exposure}.fits.fz'])
+        self.assertEqual(c.getlist('expected_files'), ['desi-{exposure}.fits.fz'])
+        # self.assertEqual(c.getlist('expected_files'),
+        #                  ['desi-{exposure}.fits.fz', 'fibermap-{exposure}.fits', 'guider-{exposure}.fits.fz'])
 
     @patch('desitransfer.daemon.log')
     @patch.object(TransferDaemon, '_configure_log')

pip install -e .
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y texlive-latex-extra dvipng
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/desihub/desitransfer.git@dc5c75fb2a041be77f5d42f43d73d5f2e8fb093e#egg=desitransfer
desiutil @ git+https://github.com/desihub/desiutil.git@fe5df4d31a7b0092b1b7d6f6c40f0bb1a7bfd333
exceptiongroup==1.2.2
iniconfig==2.1.0
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
pytz==2025.2
tomli==2.2.1

name: desitransfer
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - desiutil==1.9.15
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pytz==2025.2
      - tomli==2.2.1
prefix: /opt/conda/envs/desitransfer

py/desitransfer/test/test_daemon.py::TestDaemon::test_TransferDaemon_alternate_init py/desitransfer/test/test_daemon.py::TestDaemon::test_TransferDaemon_init
py/desitransfer/test/test_daemon.py::TestDaemon::test_TransferDaemon_configure_log
py/desitransfer/test/test_daemon.py::TestDaemon::test_TransferDaemon_backup py/desitransfer/test/test_daemon.py::TestDaemon::test_TransferDaemon_catchup py/desitransfer/test/test_daemon.py::TestDaemon::test_TransferDaemon_directory py/desitransfer/test/test_daemon.py::TestDaemon::test_TransferDaemon_exposure py/desitransfer/test/test_daemon.py::TestDaemon::test_TransferDaemon_exposure_real_files py/desitransfer/test/test_daemon.py::TestDaemon::test_TransferDaemon_pipeline py/desitransfer/test/test_daemon.py::TestDaemon::test_TransferDaemon_transfer py/desitransfer/test/test_daemon.py::TestDaemon::test_lock_directory py/desitransfer/test/test_daemon.py::TestDaemon::test_options py/desitransfer/test/test_daemon.py::TestDaemon::test_popen py/desitransfer/test/test_daemon.py::TestDaemon::test_rsync_night py/desitransfer/test/test_daemon.py::TestDaemon::test_unlock_directory py/desitransfer/test/test_daemon.py::TestDaemon::test_verify_checksum py/desitransfer/test/test_daemon.py::test_suite
doc/changes.rst py/desitransfer/data/desi_transfer_daemon.ini
doc/changes.rst py/desitransfer/data/desi_transfer_daemon.ini