diff --git a/BUILTIN_TEXTOBJECTS.md b/BUILTIN_TEXTOBJECTS.md
index 64ccfaa4..09efaf02 100644
--- a/BUILTIN_TEXTOBJECTS.md
+++ b/BUILTIN_TEXTOBJECTS.md
@@ -75,6 +75,8 @@
| git_config | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | 🟩 | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ |
+| gleam | 🟩 | 🟩 | 🟩 | 🟩 | ⬜ | ⬜ | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | ⬜ | 🟩 | 🟩 | 🟩 | ⬜ | ⬜ | 🟩 | 🟩 | ⬜ | ⬜ | 🟩 | 🟩 | 🟩 | ⬜ | ⬜ | 🟩 | 🟩 | ⬜ | 🟩 |
+
| glimmer | ⬜ | ⬜ | ⬜ | ⬜ | 🟩 | 🟩 | 🟩 | 🟩 | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | 🟩 | ⬜ | ⬜ | ⬜ | ⬜ | 🟩 | 🟩 | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ |
| glsl | 🟩 | 🟩 | 🟩 | 🟩 | ⬜ | ⬜ | ⬜ | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | ⬜ | 🟩 | 🟩 | 🟩 | ⬜ | ⬜ | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | ⬜ | ⬜ | 🟩 | 🟩 | ⬜ | 🟩 |
diff --git a/queries/gleam/textobjects.scm b/queries/gleam/textobjects.scm
new file mode 100644
index 00000000..5f86f47d
--- /dev/null
+++ b/queries/gleam/textobjects.scm
@@ -0,0 +1,212 @@
+; assignments
+(let
+ pattern: (_) @assignment.lhs @assignment.inner
+ value: (_) @assignment.rhs @assignment.inner) @assignment.outer
+
+(let_assert
+ pattern: (_) @assignment.lhs @assignment.inner
+ value: (_) @assignment.rhs @assignment.inner) @assignment.outer
+
+(use
+ assignments: (use_assignments) @assignment.lhs @assignment.inner
+ value: (_) @assignment.rhs @assignment.inner) @assignment.outer
+
+; block
+(block
+ "{"
+ .
+ _+ @block.inner
+ .
+ "}") @block.outer
+
+; calls
+(function_call
+ arguments: (arguments
+ .
+ "("
+ _+ @call.inner
+ ")")) @call.outer
+
+(record
+ arguments: (arguments
+ .
+ "("
+ _+ @call.inner
+ ")")) @call.outer
+
+(record_update
+ ".." @call.inner
+ .
+ spread: (_) @call.inner
+ .
+ "," @call.inner
+ arguments: (record_update_arguments) @call.inner) @call.outer
+
+; class
+(type_definition
+ (data_constructors) @class.inner) @class.outer
+
+; comment
+(comment) @comment.outer
+
+; conditionals
+(case
+ clauses: (case_clauses
+ (case_clause) @conditional.inner)) @conditional.outer
+
+; numbers
+[
+ (integer)
+ (float)
+] @number.inner
+
+; parameters
+(function_parameters
+ "," @parameter.outer
+ .
+ (function_parameter) @parameter.inner @parameter.outer)
+
+(function_parameters
+ .
+ (function_parameter) @parameter.inner @parameter.outer
+ .
+ ","? @parameter.outer)
+
+; parameters in calls
+(arguments
+ "," @parameter.outer
+ .
+ (argument) @parameter.inner @parameter.outer)
+
+(arguments
+ .
+ (argument) @parameter.inner @parameter.outer
+ .
+ ","? @parameter.outer)
+
+; parameters for types and records
+(data_constructor_arguments
+ "," @parameter.outer
+ .
+ (data_constructor_argument) @parameter.inner @parameter.outer)
+
+(data_constructor_arguments
+ .
+ (data_constructor_argument) @parameter.inner @parameter.outer
+ .
+ ","? @parameter.outer)
+
+(type_parameters
+ "," @parameter.outer
+ .
+ (type_parameter) @parameter.inner @parameter.outer)
+
+(type_parameters
+ .
+ (type_parameter) @parameter.inner @parameter.outer
+ .
+ ","? @parameter.outer)
+
+(type_arguments
+ "," @parameter.outer
+ .
+ (type_argument) @parameter.inner @parameter.outer)
+
+(type_arguments
+ .
+ (type_argument) @parameter.inner @parameter.outer
+ .
+ ","? @parameter.outer)
+
+(record_pattern_arguments
+ "," @parameter.outer
+ .
+ (record_pattern_argument) @parameter.inner @parameter.outer)
+
+(record_pattern_arguments
+ .
+ (record_pattern_argument) @parameter.inner @parameter.outer
+ .
+ ","? @parameter.outer)
+
+(record_update
+ "," @parameter.outer
+ arguments: (record_update_arguments
+ .
+ (record_update_argument) @parameter.inner @parameter.outer))
+
+(record_update
+ arguments: (record_update_arguments
+ "," @parameter.outer
+ .
+ (record_update_argument) @parameter.inner @parameter.outer))
+
+(record_update
+ ".." @parameter.inner @parameter.outer
+ .
+ spread: (_) @parameter.inner @parameter.outer
+ .
+ ","? @parameter.outer)
+
+; parameters in lists
+(list
+ "," @parameter.outer
+ (_) @parameter.inner @parameter.outer)
+
+(list
+ .
+ (_) @parameter.inner @parameter.outer
+ .
+ ","? @parameter.outer)
+
+(list_pattern
+ "," @parameter.outer
+ (_) @parameter.inner @parameter.outer)
+
+(list_pattern
+ .
+ (_) @parameter.inner @parameter.outer
+ .
+ ","? @parameter.outer)
+
+; parameters in tuples
+(tuple
+ "," @parameter.outer
+ (_) @parameter.inner @parameter.outer)
+
+(tuple
+ .
+ (_) @parameter.inner @parameter.outer
+ .
+ ","? @parameter.outer)
+
+; parameters in bit strings
+(bit_array
+ "," @parameter.outer
+ (_) @parameter.inner @parameter.outer)
+
+(bit_array
+ .
+ (_) @parameter.inner @parameter.outer
+ .
+ ","? @parameter.outer)
+
+; functions
+(function
+ body: (block) @function.inner) @function.outer
+
+(anonymous_function
+ body: (block) @function.inner) @function.outer
+
+; returns
+(function
+ body: (block
+ (_) @return.inner @return.outer .))
+
+(anonymous_function
+ body: (block
+ (_) @return.inner @return.outer .))
+
+; statements
+(block
+ (_) @statement.outer)