diff --git a/src/auacm/competition.py b/src/auacm/competition.py
index f2d9561..794f8a4 100644
--- a/src/auacm/competition.py
+++ b/src/auacm/competition.py
@@ -1,6 +1,6 @@
 """Subcommands related to competitions"""
 
-import auacm, requests, textwrap
+import auacm, requests, textwrap, argparse
 from datetime import datetime
 from auacm.utils import subcommand
 from auacm.exceptions import CompetitionNotFoundError
@@ -10,7 +10,7 @@ from auacm.exceptions import CompetitionNotFoundError
 def get_comps(args=None):
     """Retrieve one or more competitions from the server"""
     if args:
-        return _get_one_comp(args)
+        return get_one_comp(args)
 
     response = requests.get(auacm.BASE_URL + 'competitions')
 
@@ -35,13 +35,30 @@ def get_comps(args=None):
         {}
         ''').format(current, upcoming, past).strip()
 
-def _get_one_comp(args):
+def get_one_comp(args):
     """Retrieve info on one specific competition"""
-    response = requests.get(auacm.BASE_URL + 'competitions/' + str(args[0]))
+    parser = argparse.ArgumentParser(
+        add_help=False,
+        usage='competition [-i/--id] <competition>'
+    )
+    parser.add_argument('-i', '--id', action='store_true')
+    parser.add_argument('competition')
+    args = parser.parse_args(args)
+
+    if not args.id:
+        cid = _cid_from_name(args.competition)
+        if cid == -1:
+            raise CompetitionNotFoundError(
+                'Could not find a competition with the name ' +
+                args.competition)
+    else:
+        cid = args.competition
+
+    response = requests.get(auacm.BASE_URL + 'competitions/' + str(cid))
 
     if not response.ok or response.status_code == 404:
         raise CompetitionNotFoundError(
-            'Could not find competition with id: ' + str(args[0]))
+            'Could not find competition with id: ' + str(args.competition))
 
     comp = response.json()['data']
 
@@ -62,6 +79,21 @@ def _get_one_comp(args):
         {}
         ''').format(comp_str, teams, problems)
 
+def _cid_from_name(comp_name):
+    """Return the competition of an id based on it's name"""
+    comps = requests.get(auacm.BASE_URL + 'competitions').json()['data']
+    for comp in comps['upcoming']:
+        if comp_name.lower() in comp['name'].lower():
+            return int(comp['cid'])
+    for comp in comps['ongoing']:
+        if comp_name.lower() in comp['name'].lower():
+            return int(comp['cid'])
+    for comp in comps['past']:
+        if comp_name.lower() in comp['name'].lower():
+            return int(comp['cid'])
+
+    return -1
+
 def _format_comps(comps):
     """Return a formatted string for a list of competitions"""
     result = list()
@@ -85,7 +117,7 @@ def _format_teams(teams):
 def _format_problems(probs):
     """Return a formatted string of the problems passed in"""
     result = ''
-    for label, prob in probs.items():
+    for label, prob in sorted(probs.items()):
         result += '{}\t{} ({})\n'.format(label, prob['name'], prob['pid'])
     return result.strip()
 
diff --git a/src/auacm/main.py b/src/auacm/main.py
index 32d55e0..35e463b 100644
--- a/src/auacm/main.py
+++ b/src/auacm/main.py
@@ -7,7 +7,7 @@ The central entry point of the auacm app.
 import requests, sys, textwrap
 import auacm
 import auacm.utils as utils
-from auacm.exceptions import ConnectionError, ProblemNotFoundError, UnauthorizedException, InvalidSubmission
+from auacm.exceptions import ConnectionError, ProblemNotFoundError, UnauthorizedException, InvalidSubmission, CompetitionNotFoundError
 
 def main(args):
     """
@@ -44,7 +44,8 @@ def main(args):
             print(utils.callbacks[args[0]](args[1:]) or '')
         except (ProblemNotFoundError,
                 UnauthorizedException,
-                InvalidSubmission) as exp:
+                InvalidSubmission,
+                CompetitionNotFoundError) as exp:
             print(exp.message)
             exit(1)
         except (requests.exceptions.ConnectionError, ConnectionError):

List recent and ongoing competitions
A `comp[etition]` command that will simply list (chronologically) the recent and ongoing competitions.
diff --git a/tests/competition_tests.py b/tests/competition_tests.py
index 7f7c381..b89e62e 100644
--- a/tests/competition_tests.py
+++ b/tests/competition_tests.py
@@ -21,16 +21,38 @@ class CompetitionTests(unittest.TestCase):
         self.assertTrue('past fake mock' in result.lower())
 
     @patch('requests.get')
-    def testGetOneCompetition(self, mock_get):
-        """Successfully get one competition by it's id"""
+    def testGetOneCompetitionById(self, mock_get):
+        """Successfully get one competition by its id"""
         mock_get.return_value = MockResponse(json=COMPETITION_DETAIL)
 
-        result = auacm.competition.get_comps(['2'])
+        result = auacm.competition.get_comps(['-i', '2'])
 
         self.assertTrue('ongoing fake mock' in result.lower())
         self.assertTrue('fake problem a' in result.lower())
         self.assertTrue('brando the mando' in result.lower())
 
+    @patch('requests.get')
+    def testGetOneCompetitionByName(self, mock_get):
+        """Successfully get one competition by its name"""
+        mock_get.side_effect = [
+            MockResponse(json=COMPETITIONS_RESPONSE),
+            MockResponse(json=COMPETITION_DETAIL)]
+
+        result = auacm.competition.get_comps(['ongoing'])
+
+        self.assertTrue('ongoing fake mock' in result.lower())
+        self.assertTrue('fake problem a' in result.lower())
+        self.assertTrue('brando the mando' in result.lower())
+
+    @patch('requests.get')
+    def testGetOneCompetitionBadName(self, mock_get):
+        """Attempt to get a competition that doesn't exist by name"""
+        mock_get.side_effect = [
+            MockResponse(json=COMPETITIONS_RESPONSE)]
+
+        self.assertRaises(
+            auacm.exceptions.CompetitionNotFoundError,
+            auacm.competition.get_comps, ['not real'])
 
     @patch('requests.get')
     def testGetOneCompetitionBad(self, mock_get):
@@ -39,7 +61,7 @@ class CompetitionTests(unittest.TestCase):
 
         self.assertRaises(
             auacm.exceptions.CompetitionNotFoundError,
-            auacm.competition.get_comps, ['99999999'])
+            auacm.competition.get_comps, ['-i', '99999999'])
 
 
 if __name__ == '__main__':

pip install -e .
parse_log_pytest
requests
pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/BrandonLMorris/auacm-cli.git@5c13a4843e281aa1470d2bd28fe39c07f4e39e92#egg=auacm
Brotli @ file:///croot/brotli-split_1736182456865/work
certifi @ file:///croot/certifi_1738623731865/work/certifi
charset-normalizer @ file:///croot/charset-normalizer_1721748349566/work
exceptiongroup==1.2.2
idna @ file:///croot/idna_1714398848350/work
iniconfig==2.1.0
packaging==24.2
pluggy==1.5.0
PySocks @ file:///tmp/build/80754af9/pysocks_1605305812635/work
pytest==8.3.5
requests @ file:///croot/requests_1730999120400/work
tomli==2.2.1
urllib3 @ file:///croot/urllib3_1737133630106/work

name: auacm-cli
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
  - brotli-python=1.0.9=py39h6a678d5_9
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2025.1.31=py39h06a4308_0
  - charset-normalizer=3.3.2=pyhd3eb1b0_0
  - idna=3.7=py39h06a4308_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
  - pysocks=1.7.1=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - requests=2.32.3=py39h06a4308_1
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - urllib3=2.3.0=py39h06a4308_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - tomli==2.2.1
prefix: /opt/conda/envs/auacm-cli

tests/competition_tests.py::CompetitionTests::testGetOneCompetitionBadName tests/competition_tests.py::CompetitionTests::testGetOneCompetitionByName
tests/competition_tests.py::CompetitionTests::testGetAllCompetitons tests/competition_tests.py::CompetitionTests::testGetOneCompetitionBad tests/competition_tests.py::CompetitionTests::testGetOneCompetitionById
src/auacm/competition.py src/auacm/main.py
src/auacm/competition.py src/auacm/main.py