diff --git a/src/openstep_plist/writer.pyx b/src/openstep_plist/writer.pyx
index b0b9034..b6cc262 100644
--- a/src/openstep_plist/writer.pyx
+++ b/src/openstep_plist/writer.pyx
@@ -114,9 +114,14 @@ cdef class Writer:
     cdef int float_precision
     cdef unicode indent
     cdef int current_indent_level
+    cdef bint single_line_tuples
 
     def __cinit__(
-        self, bint unicode_escape=True, int float_precision=6, indent=None
+        self,
+        bint unicode_escape=True,
+        int float_precision=6,
+        indent=None,
+        bint single_line_tuples=False,
     ):
         self.dest = array.clone(unicode_array_template, 0, zero=False)
         self.unicode_escape = unicode_escape
@@ -129,6 +134,7 @@ cdef class Writer:
                 self.indent = ' ' * indent
         else:
             self.indent = None
+        self.single_line_tuples = single_line_tuples
         self.current_indent_level = 0
 
     def getvalue(self):
@@ -433,7 +439,7 @@ cdef class Writer:
         count = 1
 
         indent = self.indent
-        if indent is not None:
+        if indent is not None and not self.single_line_tuples:
             self.current_indent_level += 1
             newline_indent = '\n' + self.current_indent_level * indent
             indent_length = PyUnicode_GET_SIZE(newline_indent)
@@ -450,10 +456,13 @@ cdef class Writer:
                     count += 2
                 else:
                     dest.append(',')
+                    if self.single_line_tuples:
+                        dest.append(' ')
+                        count += 1
                     array.extend_buffer(dest, <char*>indent_chars, indent_length)
                     count += 1 + indent_length
 
-        if indent is not None:
+        if indent is not None and not self.single_line_tuples:
             self.current_indent_level -= 1
             newline_indent = '\n' + self.current_indent_level * indent
             indent_length = PyUnicode_GET_SIZE(newline_indent)
@@ -594,21 +603,25 @@ cdef class Writer:
         return count
 
 
-def dumps(obj, bint unicode_escape=True, int float_precision=6, indent=None):
+def dumps(obj, bint unicode_escape=True, int float_precision=6, indent=None,
+          single_line_tuples=False):
     w = Writer(
         unicode_escape=unicode_escape,
         float_precision=float_precision,
         indent=indent,
+        single_line_tuples=single_line_tuples,
     )
     w.write(obj)
     return w.getvalue()
 
 
-def dump(obj, fp, bint unicode_escape=True, int float_precision=6, indent=None):
+def dump(obj, fp, bint unicode_escape=True, int float_precision=6, indent=None,
+         single_line_tuples=False):
     w = Writer(
         unicode_escape=unicode_escape,
         float_precision=float_precision,
         indent=indent,
+        single_line_tuples=single_line_tuples,
     )
     w.write(obj)
     w.dump(fp)

diff --git a/tests/test_writer.py b/tests/test_writer.py
index aafa043..77deabc 100644
--- a/tests/test_writer.py
+++ b/tests/test_writer.py
@@ -269,3 +269,25 @@ invalid_unquoted_chars = [
 )
 def test_string_needs_quotes(string, expected):
     assert string_needs_quotes(string) is expected
+
+
+def test_single_line_tuples():
+    assert openstep_plist.dumps({"a": 1, "b": (2, 3), "c": "Hello"}, indent=0) == (
+        """{
+a = 1;
+b = (
+2,
+3
+);
+c = Hello;
+}"""
+    )
+    assert openstep_plist.dumps(
+        {"a": 1, "b": (2, 3), "c": "Hello"}, indent=0, single_line_tuples=True
+    ) == (
+        """{
+a = 1;
+b = (2, 3);
+c = Hello;
+}"""
+    )

Support Glyphs-style "tuples"
Glyphs 3 plist files have "tuples" which appear on a single line even when other lines are separated/indented. The easiest way to support this would be to remove the `if indent is not None...` blocks from `write_array_from_tuple`. However, this may have Unintended Consequences.
tests/test_writer.py::test_string_needs_quotes[/-True]
tests/test_writer.py::TestWriter::test_simple tests/test_writer.py::TestWriter::test_None tests/test_writer.py::TestWriter::test_unquoted_string tests/test_writer.py::TestWriter::test_quoted_string[-""] tests/test_writer.py::TestWriter::test_quoted_string[\t-"\t"] tests/test_writer.py::TestWriter::test_quoted_string[\n\x07\x08\x0b\x0c\r-"\\n\\a\\b\\v\\f\\r"] tests/test_writer.py::TestWriter::test_quoted_string[\\-"\\\\"] tests/test_writer.py::TestWriter::test_quoted_string["-"\\""] tests/test_writer.py::TestWriter::test_quoted_string[\x00\x01\x02\x03\x04\x05\x06-"\\000\\001\\002\\003\\004\\005\\006"] tests/test_writer.py::TestWriter::test_quoted_string[\x0e\x0f\x10\x11\x12\x13-"\\016\\017\\020\\021\\022\\023"] tests/test_writer.py::TestWriter::test_quoted_string[\x14\x15\x16\x17\x18\x19-"\\024\\025\\026\\027\\030\\031"] tests/test_writer.py::TestWriter::test_quoted_string[\x1a\x1b\x1c\x1d\x1e\x1f\x7f-"\\032\\033\\034\\035\\036\\037\\177"] tests/test_writer.py::TestWriter::test_quoted_string[\x80\x81\x9e\x9f\xa0-"\\U0080\\U0081\\U009E\\U009F\\U00A0"] tests/test_writer.py::TestWriter::test_quoted_string[\U0001f4a9-"\\UD83D\\UDCA9"] tests/test_writer.py::TestWriter::test_quoted_string[1-"1"] tests/test_writer.py::TestWriter::test_quoted_string[1.1-"1.1"] tests/test_writer.py::TestWriter::test_quoted_string[-23-"-23"] tests/test_writer.py::TestWriter::test_quoted_string[-23yyy-"-23yyy"] tests/test_writer.py::TestWriter::test_quoted_string[--"-"] tests/test_writer.py::TestWriter::test_quoted_string[-a--"-a-"] tests/test_writer.py::TestWriter::test_quoted_string_no_unicode_escape tests/test_writer.py::TestWriter::test_int[0-0] tests/test_writer.py::TestWriter::test_int[1-1] tests/test_writer.py::TestWriter::test_int[123-123] tests/test_writer.py::TestWriter::test_int[9223372036854775807-9223372036854775807] tests/test_writer.py::TestWriter::test_int[9223372036854775808-9223372036854775808] tests/test_writer.py::TestWriter::test_float[0.0-0] tests/test_writer.py::TestWriter::test_float[1.0-1] tests/test_writer.py::TestWriter::test_float[123.456-123.456] tests/test_writer.py::TestWriter::test_float[0.01-0.01] tests/test_writer.py::TestWriter::test_float[0.001-0.001] tests/test_writer.py::TestWriter::test_float[0.0001-0.0001] tests/test_writer.py::TestWriter::test_float[1e-05-0.00001] tests/test_writer.py::TestWriter::test_float[1e-06-0.000001] tests/test_writer.py::TestWriter::test_float[1e-07-0] tests/test_writer.py::TestWriter::test_float_precision tests/test_writer.py::TestWriter::test_data[\x00-<00>] tests/test_writer.py::TestWriter::test_data[\x00\x01-<0001>] tests/test_writer.py::TestWriter::test_data[\x00\x01\x02-<000102>] tests/test_writer.py::TestWriter::test_data[\x00\x01\x02\x03-<00010203>] tests/test_writer.py::TestWriter::test_data[\x00\x01\x02\x03\x04-<00010203 tests/test_writer.py::TestWriter::test_data[\x00\x01\x02\x03\x04\x05-<00010203 tests/test_writer.py::TestWriter::test_data[\x00\x01\x02\x03\x04\x05\x06-<00010203 tests/test_writer.py::TestWriter::test_data[\x00\x01\x02\x03\x04\x05\x06\x07-<00010203 tests/test_writer.py::TestWriter::test_data[\x00\x01\x02\x03\x04\x05\x06\x07\x08-<00010203 tests/test_writer.py::TestWriter::test_data[\t\n\x0b\x0c\r\x0e\x0f\x10\x11-<090A0B0C tests/test_writer.py::TestWriter::test_bool tests/test_writer.py::TestWriter::test_array[array0-()-()] tests/test_writer.py::TestWriter::test_array[array1-()-()] tests/test_writer.py::TestWriter::test_array[array2-(1)-(\n tests/test_writer.py::TestWriter::test_array[array3-(1, tests/test_writer.py::TestWriter::test_array[array4-(1.2, tests/test_writer.py::TestWriter::test_array[array5-(1, tests/test_writer.py::TestWriter::test_array[array6-(<61>, tests/test_writer.py::TestWriter::test_array[array7-({a tests/test_writer.py::TestWriter::test_dictionary[dictionary0-{}-{}] tests/test_writer.py::TestWriter::test_dictionary[dictionary1-{}-{}] tests/test_writer.py::TestWriter::test_dictionary[dictionary2-{a tests/test_writer.py::TestWriter::test_dictionary[dictionary3-{"1" tests/test_writer.py::TestWriter::test_dictionary[dictionary4-{abc tests/test_writer.py::TestWriter::test_dictionary[dictionary5-{z tests/test_writer.py::TestWriter::test_type_error tests/test_writer.py::test_dumps tests/test_writer.py::test_dump tests/test_writer.py::test_string_needs_quotes[ABCDEFGHIJKLMNOPQRSTUVWXYZ-False] tests/test_writer.py::test_string_needs_quotes[abcdefghijklmnopqrstuvwxyz-False] tests/test_writer.py::test_string_needs_quotes[a0123456789-False] tests/test_writer.py::test_string_needs_quotes[.appVersion-False] tests/test_writer.py::test_string_needs_quotes[_private-False] tests/test_writer.py::test_string_needs_quotes[$PWD-False] tests/test_writer.py::test_string_needs_quotes[1zzz-False] tests/test_writer.py::test_string_needs_quotes[192.168.1.1-False] tests/test_writer.py::test_string_needs_quotes[0-True] tests/test_writer.py::test_string_needs_quotes[1-True] tests/test_writer.py::test_string_needs_quotes[2-True] tests/test_writer.py::test_string_needs_quotes[3-True] tests/test_writer.py::test_string_needs_quotes[4-True] tests/test_writer.py::test_string_needs_quotes[5-True] tests/test_writer.py::test_string_needs_quotes[6-True] tests/test_writer.py::test_string_needs_quotes[7-True] tests/test_writer.py::test_string_needs_quotes[8-True] tests/test_writer.py::test_string_needs_quotes[9-True] tests/test_writer.py::test_string_needs_quotes[-True] tests/test_writer.py::test_string_needs_quotes[--True] tests/test_writer.py::test_string_needs_quotes[A-Z-True] tests/test_writer.py::test_string_needs_quotes[hello tests/test_writer.py::test_string_needs_quotes[\\backslash-True] tests/test_writer.py::test_string_needs_quotes[http://github.com-True]