diff --git a/Makefile b/Makefile
index 18afff34c..fb7733832 100644
--- a/Makefile
+++ b/Makefile
@@ -21,23 +21,23 @@
 #   make -j8 -O MODE=tiny
 #
 #   # build individual target
-#   make -j8 -O o//examples/hello.com
-#   o//examples/hello.com
+#   make -j8 -O o//examples/hello
+#   o//examples/hello
 #
 #   # view source
 #   less examples/hello.c
 #
 #   # view binary
-#   o//tool/viz/bing.com o//examples/hello.com |
-#     o//tool/viz/fold.com
+#   o//tool/viz/bing o//examples/hello |
+#     o//tool/viz/fold
 #
 #   # view transitive closure of legalese
-#   o//tool/viz/bing.com -n o//examples/hello.com |
-#     o//tool/viz/fold.com
+#   o//tool/viz/bing -n o//examples/hello |
+#     o//tool/viz/fold
 #
 #   # basic debugging
-#   make -j8 -O MODE=dbg o/dbg/examples/crashreport.com
-#   o/examples/crashreport.com
+#   make -j8 -O MODE=dbg o/dbg/examples/crashreport
+#   o/examples/crashreport
 #   less examples/crashreport.c
 #
 #   # extremely tiny binaries
@@ -51,7 +51,7 @@
 #
 # TROUBLESHOOTING
 #
-#   make -j8 -O V=1 o//examples/hello.com
+#   make -j8 -O V=1 o//examples/hello
 #   make o//examples/life.elf -pn |& less
 #   etc.
 #
@@ -59,7 +59,7 @@
 #
 #   build/config.mk
 
-SHELL      = build/bootstrap/cocmd.com
+SHELL      = build/bootstrap/cocmd
 MAKEFLAGS += --no-builtin-rules
 
 .SUFFIXES:
@@ -77,8 +77,8 @@ COMMA := ,
 PWD := $(shell pwd)
 
 # detect wsl2 running cosmopolitan binaries on the host by checking whether:
-# - user ran build/bootstrap/make.com, in which case make's working directory is in wsl
-# - user ran make, in which case cocmd.com's working directory is in wsl
+# - user ran build/bootstrap/make, in which case make's working directory is in wsl
+# - user ran make, in which case cocmd's working directory is in wsl
 ifneq ($(findstring //wsl.localhost/,$(CURDIR) $(PWD)),)
 $(warning wsl2 interop is enabled)
 $(error you need to run sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop')
@@ -89,7 +89,7 @@ UNAME_S := $(shell uname -s)
 
 # apple still distributes a 17 year old version of gnu make
 ifeq ($(MAKE_VERSION), 3.81)
-$(error please use build/bootstrap/make.com)
+$(error please use build/bootstrap/make)
 endif
 
 LC_ALL = C
@@ -101,21 +101,21 @@ XARGS ?= xargs -P4 -rs8000
 DOT ?= dot
 CLANG = clang
 TMPDIR = o/tmp
-AR = build/bootstrap/ar.com
-CP = build/bootstrap/cp.com
-RM = build/bootstrap/rm.com -f
-GZIP = build/bootstrap/gzip.com
-ECHO = build/bootstrap/echo.com
-CHMOD = build/bootstrap/chmod.com
-TOUCH = build/bootstrap/touch.com
-PKG = build/bootstrap/package.com
-MKDEPS = build/bootstrap/mkdeps.com
-ZIPOBJ = build/bootstrap/zipobj.com
-ZIPCOPY = build/bootstrap/zipcopy.com
-PECHECK = build/bootstrap/pecheck.com
-FIXUPOBJ = build/bootstrap/fixupobj.com
-MKDIR = build/bootstrap/mkdir.com -p
-COMPILE = build/bootstrap/compile.com -V9 -M2048m -P8192 $(QUOTA)
+AR = build/bootstrap/ar
+CP = build/bootstrap/cp
+RM = build/bootstrap/rm -f
+GZIP = build/bootstrap/gzip
+ECHO = build/bootstrap/echo
+CHMOD = build/bootstrap/chmod
+TOUCH = build/bootstrap/touch
+PKG = build/bootstrap/package
+MKDEPS = build/bootstrap/mkdeps
+ZIPOBJ = build/bootstrap/zipobj
+ZIPCOPY = build/bootstrap/zipcopy
+PECHECK = build/bootstrap/pecheck
+FIXUPOBJ = build/bootstrap/fixupobj
+MKDIR = build/bootstrap/mkdir -p
+COMPILE = build/bootstrap/compile -V9 -M2048m -P8192 $(QUOTA)
 
 IGNORE := $(shell $(MKDIR) $(TMPDIR))
 
@@ -187,7 +187,7 @@ o/$(MODE):			\
 o/$(MODE)/: o/$(MODE)
 o/$(MODE)/.: o/$(MODE)
 
-# check if we're using o//third_party/make/make.com
+# check if we're using o//third_party/make/make
 # we added sandboxing to guarantee cosmo's makefile is hermetic
 # it also shaves away 200ms of startup latency with native $(uniq)
 ifneq ($(LANDLOCKMAKE_VERSION),)
@@ -415,17 +415,17 @@ o/$(MODE)/hdrs-old.txt: o/$(MODE)/.x $(MAKEFILES) $(call uniq,$(foreach x,$(HDRS
 	$(file >$@) $(foreach x,$(HDRS) $(INCS),$(file >>$@,$(x)))
 
 TAGS: private .UNSANDBOXED = 1
-TAGS:	o/$(MODE)/srcs-old.txt $(SRCS) #o/$(MODE)/third_party/ctags/ctags.com
+TAGS:	o/$(MODE)/srcs-old.txt $(SRCS) #o/$(MODE)/third_party/ctags/ctags
 	@$(RM) $@
-	@o/$(MODE)/third_party/ctags/ctags.com $(TAGSFLAGS) -L $< -o $@
+	@o/$(MODE)/third_party/ctags/ctags $(TAGSFLAGS) -L $< -o $@
 
 HTAGS: private .UNSANDBOXED = 1
-HTAGS:	o/$(MODE)/hdrs-old.txt $(filter-out third_party/libcxx/%,$(HDRS)) #o/$(MODE)/third_party/ctags/ctags.com
+HTAGS:	o/$(MODE)/hdrs-old.txt $(filter-out third_party/libcxx/%,$(HDRS)) #o/$(MODE)/third_party/ctags/ctags
 	@$(RM) $@
-	@build/htags o/$(MODE)/third_party/ctags/ctags.com -L $< -o $@
+	@build/htags o/$(MODE)/third_party/ctags/ctags -L $< -o $@
 
 loc: private .UNSANDBOXED = 1
-loc: o/$(MODE)/tool/build/summy.com
+loc: o/$(MODE)/tool/build/summy
 	find -name \*.h -or -name \*.c -or -name \*.S | \
 	$(XARGS) wc -l | grep total | awk '{print $$1}' | $<
 
@@ -550,16 +550,16 @@ o/cosmopolitan.h: o/cosmopolitan.h.txt					\
 		$(wildcard libc/integral/*)				\
 		$(foreach x,$(COSMOPOLITAN_H_PKGS),$($(x)_HDRS))	\
 		$(foreach x,$(COSMOPOLITAN_H_PKGS),$($(x)_INCS))
-	@$(COMPILE) -AROLLUP -T$@ build/bootstrap/rollup.com @$< >>$@
+	@$(COMPILE) -AROLLUP -T$@ build/bootstrap/rollup @$< >>$@
 
 o/cosmopolitan.html: private .UNSANDBOXED = 1
 o/cosmopolitan.html:							\
-		o/$(MODE)/third_party/chibicc/chibicc.com.dbg		\
+		o/$(MODE)/third_party/chibicc/chibicc.dbg		\
 		$(filter-out %.s,$(foreach x,$(COSMOPOLITAN_OBJECTS),$($(x)_SRCS)))	\
 		$(filter-out %.cpp,$(filter-out %.cc,$(SRCS)))				\
 		$(HDRS)
 	$(file >$(TMPDIR)/$(subst /,_,$@),$(filter-out %.cpp,$(filter-out %.cc,$(filter-out %.s,$(foreach x,$(COSMOPOLITAN_OBJECTS),$($(x)_SRCS))))))
-	o/$(MODE)/third_party/chibicc/chibicc.com.dbg -J		\
+	o/$(MODE)/third_party/chibicc/chibicc.dbg -J		\
 		-fno-common -include libc/integral/normalize.inc -o $@	\
 		-DCOSMO @$(TMPDIR)/$(subst /,_,$@)
 
@@ -582,13 +582,13 @@ TOOLCHAIN_ARTIFACTS =				\
 	o/$(MODE)/ape/ape-no-modify-self.o	\
 	o/$(MODE)/cosmopolitan.a		\
 	o/$(MODE)/third_party/libcxx/libcxx.a	\
-	o/$(MODE)/tool/build/march-native.com	\
-	o/$(MODE)/tool/build/ar.com		\
-	o/$(MODE)/tool/build/mktemper.com	\
-	o/$(MODE)/tool/build/fixupobj.com	\
-	o/$(MODE)/tool/build/zipcopy.com	\
-	o/$(MODE)/tool/build/apelink.com	\
-	o/$(MODE)/tool/build/pecheck.com
+	o/$(MODE)/tool/build/march-native	\
+	o/$(MODE)/tool/build/ar			\
+	o/$(MODE)/tool/build/mktemper		\
+	o/$(MODE)/tool/build/fixupobj		\
+	o/$(MODE)/tool/build/zipcopy		\
+	o/$(MODE)/tool/build/apelink		\
+	o/$(MODE)/tool/build/pecheck
 else
 TOOLCHAIN_ARTIFACTS =				\
 	o/$(MODE)/ape/ape.elf			\
@@ -596,9 +596,9 @@ TOOLCHAIN_ARTIFACTS =				\
 	o/$(MODE)/libc/crt/crt.o		\
 	o/$(MODE)/cosmopolitan.a		\
 	o/$(MODE)/third_party/libcxx/libcxx.a	\
-	o/$(MODE)/tool/build/march-native.com	\
-	o/$(MODE)/tool/build/fixupobj.com	\
-	o/$(MODE)/tool/build/zipcopy.com
+	o/$(MODE)/tool/build/march-native	\
+	o/$(MODE)/tool/build/fixupobj		\
+	o/$(MODE)/tool/build/zipcopy
 endif
 
 .PHONY: toolchain
diff --git a/ape/BUILD.mk b/ape/BUILD.mk
index afddd13b6..02c2a7e1d 100644
--- a/ape/BUILD.mk
+++ b/ape/BUILD.mk
@@ -220,10 +220,10 @@ o/$(MODE)/ape/loader-xnu-clang.asm: ape/loader.c
 	@$(COMPILE) -AOBJECTIFY.c $(CLANG) -DSUPPORT_VECTOR=8 -S -g0 $(APE_LOADER_FLAGS)
 
 o/$(MODE)/ape/ape.elf: o/$(MODE)/ape/ape.elf.dbg
-	@$(COMPILE) -AOBJBINCOPY -w build/bootstrap/objbincopy.com -f -o $@ $<
+	@$(COMPILE) -AOBJBINCOPY -w build/bootstrap/objbincopy -f -o $@ $<
 
 o/$(MODE)/ape/ape.macho: o/$(MODE)/ape/ape.elf.dbg
-	@$(COMPILE) -AOBJBINCOPY -w build/bootstrap/objbincopy.com -fm -o $@ $<
+	@$(COMPILE) -AOBJBINCOPY -w build/bootstrap/objbincopy -fm -o $@ $<
 
 APE_LOADER_LDFLAGS =				\
 	-static					\
diff --git a/ape/loader-macho.S b/ape/loader-macho.S
index fd9fd55f8..bcecf9dac 100644
--- a/ape/loader-macho.S
+++ b/ape/loader-macho.S
@@ -22,7 +22,7 @@
 #include "libc/macros.internal.h"
 
 //	Apple Mach-O Executable Headers
-//	Fixups are applied by objbincopy.com
+//	Fixups are applied by objbincopy
 //	There must exist a MAC_LC_SEGMENT_64 for every PT_LOAD
 
 	.section .macho,"a",@progbits
diff --git a/build/bootstrap/ar.com b/build/bootstrap/ar
similarity index 100%
rename from build/bootstrap/ar.com
rename to build/bootstrap/ar
diff --git a/build/bootstrap/chmod.com b/build/bootstrap/chmod
similarity index 100%
rename from build/bootstrap/chmod.com
rename to build/bootstrap/chmod
diff --git a/build/bootstrap/cocmd.com b/build/bootstrap/cocmd
similarity index 100%
rename from build/bootstrap/cocmd.com
rename to build/bootstrap/cocmd
diff --git a/build/bootstrap/compile.com b/build/bootstrap/compile
similarity index 100%
rename from build/bootstrap/compile.com
rename to build/bootstrap/compile
diff --git a/build/bootstrap/cp.com b/build/bootstrap/cp
similarity index 100%
rename from build/bootstrap/cp.com
rename to build/bootstrap/cp
diff --git a/build/bootstrap/echo.com b/build/bootstrap/echo
similarity index 100%
rename from build/bootstrap/echo.com
rename to build/bootstrap/echo
diff --git a/build/bootstrap/fixupobj.com b/build/bootstrap/fixupobj
similarity index 100%
rename from build/bootstrap/fixupobj.com
rename to build/bootstrap/fixupobj
diff --git a/build/bootstrap/gzip.com b/build/bootstrap/gzip
similarity index 100%
rename from build/bootstrap/gzip.com
rename to build/bootstrap/gzip
diff --git a/build/bootstrap/make.com b/build/bootstrap/make
similarity index 100%
rename from build/bootstrap/make.com
rename to build/bootstrap/make
diff --git a/build/bootstrap/mkdeps.com b/build/bootstrap/mkdeps
similarity index 100%
rename from build/bootstrap/mkdeps.com
rename to build/bootstrap/mkdeps
diff --git a/build/bootstrap/mkdir.com b/build/bootstrap/mkdir
similarity index 100%
rename from build/bootstrap/mkdir.com
rename to build/bootstrap/mkdir
diff --git a/build/bootstrap/objbincopy.com b/build/bootstrap/objbincopy
similarity index 100%
rename from build/bootstrap/objbincopy.com
rename to build/bootstrap/objbincopy
diff --git a/build/bootstrap/package.com b/build/bootstrap/package
similarity index 100%
rename from build/bootstrap/package.com
rename to build/bootstrap/package
diff --git a/build/bootstrap/pecheck.com b/build/bootstrap/pecheck
similarity index 100%
rename from build/bootstrap/pecheck.com
rename to build/bootstrap/pecheck
diff --git a/build/bootstrap/rm.com b/build/bootstrap/rm
similarity index 100%
rename from build/bootstrap/rm.com
rename to build/bootstrap/rm
diff --git a/build/bootstrap/rollup.com b/build/bootstrap/rollup
similarity index 100%
rename from build/bootstrap/rollup.com
rename to build/bootstrap/rollup
diff --git a/build/bootstrap/touch.com b/build/bootstrap/touch
similarity index 100%
rename from build/bootstrap/touch.com
rename to build/bootstrap/touch
diff --git a/build/bootstrap/zipcopy.com b/build/bootstrap/zipcopy
similarity index 100%
rename from build/bootstrap/zipcopy.com
rename to build/bootstrap/zipcopy
diff --git a/build/bootstrap/zipobj.com b/build/bootstrap/zipobj
similarity index 100%
rename from build/bootstrap/zipobj.com
rename to build/bootstrap/zipobj
diff --git a/build/rules.mk b/build/rules.mk
index e8ca02541..180a4514e 100644
--- a/build/rules.mk
+++ b/build/rules.mk
@@ -79,17 +79,17 @@ o/$(MODE)/%.pkg:
 	$(file >$(TMPSAFE).args,$(filter %.o,$^))
 	@$(COMPILE) -APACKAGE -wT$@ $(PKG) $(OUTPUT_OPTION) $(addprefix -d,$(filter %.pkg,$^)) @$(TMPSAFE).args
 
-o/$(MODE)/%.o: %.py o/$(MODE)/third_party/python/pyobj.com
-	@$(COMPILE) -wAPYOBJ o/$(MODE)/third_party/python/pyobj.com $(PYFLAGS) -o $@ $<
+o/$(MODE)/%.o: %.py o/$(MODE)/third_party/python/pyobj
+	@$(COMPILE) -wAPYOBJ o/$(MODE)/third_party/python/pyobj $(PYFLAGS) -o $@ $<
 
-o/$(MODE)/%.pyc: %.py o/$(MODE)/third_party/python/pycomp.com
-	@$(COMPILE) -wAPYCOMP o/$(MODE)/third_party/python/pycomp.com $(PYCFLAGS) -o $@ $<
+o/$(MODE)/%.pyc: %.py o/$(MODE)/third_party/python/pycomp
+	@$(COMPILE) -wAPYCOMP o/$(MODE)/third_party/python/pycomp $(PYCFLAGS) -o $@ $<
 
-o/$(MODE)/%.lua: %.lua o/$(MODE)/third_party/lua/luac.com
-	@$(COMPILE) -wALUAC o/$(MODE)/third_party/lua/luac.com -s -o $@ $<
+o/$(MODE)/%.lua: %.lua o/$(MODE)/third_party/lua/luac
+	@$(COMPILE) -wALUAC o/$(MODE)/third_party/lua/luac -s -o $@ $<
 
-o/$(MODE)/%.lua.runs: %.lua o/$(MODE)/tool/net/redbean.com
-	@$(COMPILE) -wALUA -tT$@ o/$(MODE)/tool/net/redbean.com $(LUAFLAGS) -i $<
+o/$(MODE)/%.lua.runs: %.lua o/$(MODE)/tool/net/redbean
+	@$(COMPILE) -wALUA -tT$@ o/$(MODE)/tool/net/redbean $(LUAFLAGS) -i $<
 
 ################################################################################
 # LOCAL UNIT TESTS
@@ -108,22 +108,22 @@ o/$(MODE)/%.lua.runs: %.lua o/$(MODE)/tool/net/redbean.com
 #
 # You could then run a command like:
 #
-#     make -j8 o//test/libc/calls/openbsd_test.com.runs
+#     make -j8 o//test/libc/calls/openbsd_test.runs
 #
 # You need PROT_EXEC permission since ftrace morphs the binary. It's
-# also worth mentioning that the pledge.com command can simulate what
+# also worth mentioning that the pledge command can simulate what
 # Landlock Make does:
 #
-#     o//tool/build/pledge.com \
+#     o//tool/build/pledge \
 #       -v. -p 'stdio rpath wpath cpath tty prot_exec' \
-#       o//test/libc/calls/openbsd_test.com \
+#       o//test/libc/calls/openbsd_test \
 #       ----ftrace
 #
 # This is useful in the event a test binary should run by itself, but
 # fails to run beneath Landlock Make. It's also useful sometimes to
 # override the verbosity when running tests:
 #
-#     make V=5 TESTARGS=-b o//test/libc/calls/openbsd_test.com.runs
+#     make V=5 TESTARGS=-b o//test/libc/calls/openbsd_test.runs
 #
 # This way, if for some reason a test should fail but calls exit(0),
 # then the stdout/stderr output, which would normally be suppressed,
@@ -135,7 +135,7 @@ o/$(MODE)/%.runs: o/$(MODE)/%
 ################################################################################
 # ELF ZIP FILES
 #
-# zipobj.com lets us do fast incremental linking of compressed data.
+# zipobj lets us do fast incremental linking of compressed data.
 # it's nice because if we link a hundred binaries that use the time zone
 # database, then that database only needs to be DEFLATE'd once.
 
@@ -183,23 +183,6 @@ o/$(MODE)/%.okk: private .UNSANDBOXED = 1
 o/$(MODE)/%.okk: %
 	@$(COMPILE) -ACHECK.h $(COMPILE.cxx) -xc++ -g0 -o $@ $<
 
-################################################################################
-# EXECUTABLE HELPERS
-
-MAKE_SYMTAB_CREATE =				\
-	$(COMPILE) -wASYMTAB			\
-	o/$(MODE)/tool/build/symtab.com		\
-	-o $(TMPSAFE)/.symtab			\
-	$<
-
-MAKE_SYMTAB_ZIP =				\
-	$(COMPILE) -AZIP -T$@			\
-	o/$(MODE)/third_party/zip/zip.com	\
-	-b$(TMPDIR)				\
-	-9qj					\
-	$@					\
-	$(TMPSAFE)/.symtab
-
 ################################################################################
 # EMACS ASSEMBLY GENERATION
 
diff --git a/examples/BUILD.mk b/examples/BUILD.mk
index 5b8a75156..46faa0d95 100644
--- a/examples/BUILD.mk
+++ b/examples/BUILD.mk
@@ -14,130 +14,130 @@ EXAMPLES_MAINS_S = $(filter %.S,$(EXAMPLES_FILES))
 EXAMPLES_MAINS_C = $(filter %.c,$(EXAMPLES_FILES))
 EXAMPLES_MAINS_CC = $(filter %.cc,$(EXAMPLES_FILES))
 
-EXAMPLES_SRCS =									\
-	$(EXAMPLES_MAINS_S)							\
-	$(EXAMPLES_MAINS_C)							\
+EXAMPLES_SRCS =							\
+	$(EXAMPLES_MAINS_S)					\
+	$(EXAMPLES_MAINS_C)					\
 	$(EXAMPLES_MAINS_CC)
 
-EXAMPLES_MAINS =								\
-	$(EXAMPLES_MAINS_S)							\
-	$(EXAMPLES_MAINS_C)							\
+EXAMPLES_MAINS =						\
+	$(EXAMPLES_MAINS_S)					\
+	$(EXAMPLES_MAINS_C)					\
 	$(EXAMPLES_MAINS_CC)
 
-EXAMPLES_OBJS =									\
-	$(EXAMPLES_MAINS_S:%.S=o/$(MODE)/%.o)					\
-	$(EXAMPLES_MAINS_C:%.c=o/$(MODE)/%.o)					\
+EXAMPLES_OBJS =							\
+	$(EXAMPLES_MAINS_S:%.S=o/$(MODE)/%.o)			\
+	$(EXAMPLES_MAINS_C:%.c=o/$(MODE)/%.o)			\
 	$(EXAMPLES_MAINS_CC:%.cc=o/$(MODE)/%.o)
 
-EXAMPLES_COMS =									\
-	$(EXAMPLES_MAINS_S:%.S=o/$(MODE)/%.com)					\
-	$(EXAMPLES_MAINS_C:%.c=o/$(MODE)/%.com)					\
-	$(EXAMPLES_MAINS_CC:%.cc=o/$(MODE)/%.com)
+EXAMPLES_COMS =							\
+	$(EXAMPLES_MAINS_S:%.S=o/$(MODE)/%)			\
+	$(EXAMPLES_MAINS_C:%.c=o/$(MODE)/%)			\
+	$(EXAMPLES_MAINS_CC:%.cc=o/$(MODE)/%)
 
-EXAMPLES_BINS =									\
-	$(EXAMPLES_COMS)							\
+EXAMPLES_BINS =							\
+	$(EXAMPLES_COMS)					\
 	$(EXAMPLES_COMS:%=%.dbg)
 
-EXAMPLES_DIRECTDEPS =								\
-	DSP_CORE								\
-	DSP_SCALE								\
-	DSP_TTY									\
-	LIBC_CALLS								\
-	LIBC_DLOPEN								\
-	LIBC_FMT								\
-	LIBC_INTRIN								\
-	LIBC_IRQ								\
-	LIBC_LOG								\
-	LIBC_MEM								\
-	LIBC_NEXGEN32E								\
-	LIBC_NT_ADVAPI32							\
-	LIBC_NT_IPHLPAPI							\
-	LIBC_NT_KERNEL32							\
-	LIBC_NT_NTDLL								\
-	LIBC_NT_USER32								\
-	LIBC_NT_WS2_32								\
-	LIBC_PROC								\
-	LIBC_RUNTIME								\
-	LIBC_SOCK								\
-	LIBC_STDIO								\
-	LIBC_STR								\
-	LIBC_SYSV								\
-	LIBC_SYSV_CALLS								\
-	LIBC_TESTLIB								\
-	LIBC_THREAD								\
-	LIBC_TIME								\
-	LIBC_TINYMATH								\
-	LIBC_VGA								\
-	LIBC_X									\
-	NET_HTTP								\
-	NET_HTTPS								\
-	THIRD_PARTY_AWK								\
-	THIRD_PARTY_COMPILER_RT							\
-	THIRD_PARTY_DLMALLOC							\
-	THIRD_PARTY_DOUBLECONVERSION						\
-	THIRD_PARTY_GDTOA							\
-	THIRD_PARTY_GETOPT							\
-	THIRD_PARTY_HIREDIS							\
-	THIRD_PARTY_LIBCXX							\
-	THIRD_PARTY_LINENOISE							\
-	THIRD_PARTY_LUA								\
-	THIRD_PARTY_MBEDTLS							\
-	THIRD_PARTY_MUSL							\
-	THIRD_PARTY_NSYNC							\
-	THIRD_PARTY_NSYNC_MEM							\
-	THIRD_PARTY_OPENMP							\
-	THIRD_PARTY_SED								\
-	THIRD_PARTY_STB								\
-	THIRD_PARTY_TR								\
-	THIRD_PARTY_VQSORT							\
-	THIRD_PARTY_XED								\
-	THIRD_PARTY_ZLIB							\
-	TOOL_ARGS								\
-	TOOL_BUILD_LIB								\
+EXAMPLES_DIRECTDEPS =						\
+	DSP_CORE						\
+	DSP_SCALE						\
+	DSP_TTY							\
+	LIBC_CALLS						\
+	LIBC_DLOPEN						\
+	LIBC_FMT						\
+	LIBC_INTRIN						\
+	LIBC_IRQ						\
+	LIBC_LOG						\
+	LIBC_MEM						\
+	LIBC_NEXGEN32E						\
+	LIBC_NT_ADVAPI32					\
+	LIBC_NT_IPHLPAPI					\
+	LIBC_NT_KERNEL32					\
+	LIBC_NT_NTDLL						\
+	LIBC_NT_USER32						\
+	LIBC_NT_WS2_32						\
+	LIBC_PROC						\
+	LIBC_RUNTIME						\
+	LIBC_SOCK						\
+	LIBC_STDIO						\
+	LIBC_STR						\
+	LIBC_SYSV						\
+	LIBC_SYSV_CALLS						\
+	LIBC_TESTLIB						\
+	LIBC_THREAD						\
+	LIBC_TIME						\
+	LIBC_TINYMATH						\
+	LIBC_VGA						\
+	LIBC_X							\
+	NET_HTTP						\
+	NET_HTTPS						\
+	THIRD_PARTY_AWK						\
+	THIRD_PARTY_COMPILER_RT					\
+	THIRD_PARTY_DLMALLOC					\
+	THIRD_PARTY_DOUBLECONVERSION				\
+	THIRD_PARTY_GDTOA					\
+	THIRD_PARTY_GETOPT					\
+	THIRD_PARTY_HIREDIS					\
+	THIRD_PARTY_LIBCXX					\
+	THIRD_PARTY_LINENOISE					\
+	THIRD_PARTY_LUA						\
+	THIRD_PARTY_MBEDTLS					\
+	THIRD_PARTY_MUSL					\
+	THIRD_PARTY_NSYNC					\
+	THIRD_PARTY_NSYNC_MEM					\
+	THIRD_PARTY_OPENMP					\
+	THIRD_PARTY_SED						\
+	THIRD_PARTY_STB						\
+	THIRD_PARTY_TR						\
+	THIRD_PARTY_VQSORT					\
+	THIRD_PARTY_XED						\
+	THIRD_PARTY_ZLIB					\
+	TOOL_ARGS						\
+	TOOL_BUILD_LIB						\
 	TOOL_VIZ_LIB
 
-EXAMPLES_DEPS :=								\
+EXAMPLES_DEPS :=						\
 	$(call uniq,$(foreach x,$(EXAMPLES_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/examples/examples.pkg:						\
-		$(EXAMPLES_OBJS)						\
+o/$(MODE)/examples/examples.pkg:				\
+		$(EXAMPLES_OBJS)				\
 		$(foreach x,$(EXAMPLES_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/examples/unbourne.o: private						\
-		CPPFLAGS +=							\
-			-DSTACK_FRAME_UNLIMITED					\
+o/$(MODE)/examples/unbourne.o: private				\
+		CPPFLAGS +=					\
+			-DSTACK_FRAME_UNLIMITED			\
 			-fpie
 
-o/$(MODE)/examples/%.com.dbg:							\
-		$(EXAMPLES_DEPS)						\
-		o/$(MODE)/examples/%.o						\
-		o/$(MODE)/examples/examples.pkg					\
+o/$(MODE)/examples/%.dbg:					\
+		$(EXAMPLES_DEPS)				\
+		o/$(MODE)/examples/%.o				\
+		o/$(MODE)/examples/examples.pkg			\
 		$(EXAMPLES_BOOTLOADER)
 	@$(APELINK)
 
-o/$(MODE)/examples/hellolua.com.dbg:						\
-		$(EXAMPLES_DEPS)						\
-		o/$(MODE)/examples/hellolua.o					\
-		o/$(MODE)/examples/hellolua.lua.zip.o				\
-		o/$(MODE)/examples/examples.pkg					\
+o/$(MODE)/examples/hellolua.dbg:				\
+		$(EXAMPLES_DEPS)				\
+		o/$(MODE)/examples/hellolua.o			\
+		o/$(MODE)/examples/hellolua.lua.zip.o		\
+		o/$(MODE)/examples/examples.pkg			\
 		$(EXAMPLES_BOOTLOADER)
 	@$(APELINK)
 
-o/$(MODE)/examples/ispell.com.dbg:						\
-		$(EXAMPLES_DEPS)						\
-		o/$(MODE)/examples/ispell.o					\
-		o/$(MODE)/usr/share/dict/words.zip.o				\
-		o/$(MODE)/examples/examples.pkg					\
+o/$(MODE)/examples/ispell.dbg:					\
+		$(EXAMPLES_DEPS)				\
+		o/$(MODE)/examples/ispell.o			\
+		o/$(MODE)/usr/share/dict/words.zip.o		\
+		o/$(MODE)/examples/examples.pkg			\
 		$(EXAMPLES_BOOTLOADER)
 	@$(APELINK)
 
-o/$(MODE)/examples/nesemu1.com.dbg:						\
-		$(EXAMPLES_DEPS)						\
-		o/$(MODE)/examples/nesemu1.o					\
-		o/$(MODE)/usr/share/rom/mario.nes.zip.o				\
-		o/$(MODE)/usr/share/rom/zelda.nes.zip.o				\
-		o/$(MODE)/usr/share/rom/tetris.nes.zip.o			\
-		o/$(MODE)/examples/examples.pkg					\
+o/$(MODE)/examples/nesemu1.dbg:					\
+		$(EXAMPLES_DEPS)				\
+		o/$(MODE)/examples/nesemu1.o			\
+		o/$(MODE)/usr/share/rom/mario.nes.zip.o		\
+		o/$(MODE)/usr/share/rom/zelda.nes.zip.o		\
+		o/$(MODE)/usr/share/rom/tetris.nes.zip.o	\
+		o/$(MODE)/examples/examples.pkg			\
 		$(EXAMPLES_BOOTLOADER)
 	@$(APELINK)
 
@@ -145,7 +145,7 @@ o/$(MODE)/examples/picol.o: private				\
 		CPPFLAGS +=					\
 			-DSTACK_FRAME_UNLIMITED
 
-o/$(MODE)/examples/picol.com.dbg:				\
+o/$(MODE)/examples/picol.dbg:					\
 		$(EXAMPLES_DEPS)				\
 		o/$(MODE)/examples/picol.o			\
 		o/$(MODE)/examples/examples.pkg			\
@@ -166,8 +166,8 @@ o/$(MODE)/usr/share/dict/words:					\
 ################################################################################
 
 .PHONY: o/$(MODE)/examples
-o/$(MODE)/examples:								\
-		o/$(MODE)/examples/package					\
-		o/$(MODE)/examples/pylife					\
-		o/$(MODE)/examples/pyapp					\
+o/$(MODE)/examples:						\
+		o/$(MODE)/examples/package			\
+		o/$(MODE)/examples/pylife			\
+		o/$(MODE)/examples/pyapp			\
 		$(EXAMPLES_BINS)
diff --git a/examples/pyapp/BUILD.mk b/examples/pyapp/BUILD.mk
index 2207b2945..3bab71aa4 100644
--- a/examples/pyapp/BUILD.mk
+++ b/examples/pyapp/BUILD.mk
@@ -14,13 +14,13 @@
 # GETTING STARTED
 #
 #   # run these commands after cloning the cosmo repo on linux
-#   $ make -j8 o//examples/pyapp/pyapp.com
-#   $ o//examples/pyapp/pyapp.com
+#   $ make -j8 o//examples/pyapp/pyapp
+#   $ o//examples/pyapp/pyapp
 #   cosmopolitan is cool!
 #
 # HOW IT WORKS
 #
-#   $ pyobj.com -m -o pyapp.o pyapp.py
+#   $ pyobj -m -o pyapp.o pyapp.py
 #   $ ld -static -nostdlib -T o//ape/ape.lds ape.o crt.o \
 #       pyapp.o \
 #       cosmopolitan-python-stage2.a \
@@ -29,19 +29,19 @@
 #       cosmopolitan-bzip2.a \
 #       cosmopolitan-python-stage1.a \
 #       cosmopolitan.a
-#   $ ./pyapp.com
+#   $ ./pyapp
 #   cosmopolitan is cool!
 #
 # NOTES
 #
-#   If you enjoy this tutorial, let us know jtunney@gmail.com. If
+#   If you enjoy this tutorial, let us know jtunney@gmail. If
 #   you're building something cool, then we can we can add you to
 #   our .gitowners file which grants you commit access so you can
 #   indepnedently maintain your package, as part of the mono-repo
 
 PKGS      += PYAPP
 PYAPP      = $(PYAPP_DEPS) o/$(MODE)/examples/pyapp/pyapp.a
-PYAPP_COMS = o/$(MODE)/examples/pyapp/pyapp.com
+PYAPP_COMS = o/$(MODE)/examples/pyapp/pyapp
 PYAPP_BINS = $(PYAPP_COMS) $(PYAPP_COMS:%=%.dbg)
 
 # Specify our Cosmopolitan library dependencies
@@ -58,7 +58,7 @@ PYAPP_DIRECTDEPS = \
 # them all out and arranges them in the correct order.
 PYAPP_DEPS := $(call uniq,$(foreach x,$(PYAPP_DIRECTDEPS),$($(x))))
 
-# # Asks PYOBJ.COM to turn our Python source into an ELF object which
+# # Asks PYOBJ to turn our Python source into an ELF object which
 # # contains (a) embedded zip file artifacts of our .py file and .pyc
 # # which it it compiled; and (b) statically analyzed listings of our
 # # python namespaces and imports that GNU ld will use for tree shake
@@ -71,18 +71,18 @@ PYAPP_DEPS := $(call uniq,$(foreach x,$(PYAPP_DIRECTDEPS),$($(x))))
 # in `.python/` (which is accessible via open() system calls, using
 # the synthetic path `"/zip/.python/"`) which means that if we want
 # to turn `pyapp/pyapp.py` into `.python/pyapp.py` so it's imported
-# using `import pyapp` then we can simply append to PYOBJ.COM flags
+# using `import pyapp` then we can simply append to PYOBJ flags
 # flags above asking it to strip one directory component and prefix
 # Lastly be sure that whenever you use this variable override trick
 # you only do it to .o files, since otherwise it'll ruin everything
-# Passing -m to PYOBJ.COM causes a C main() function to get yoinked
+# Passing -m to PYOBJ causes a C main() function to get yoinked
 # and it means our Python module can no longer be used as a library
 o/$(MODE)/examples/pyapp/pyapp.o: PYFLAGS += -m -C2 -P.python
 
-# Asks PACKAGE.COM to sanity check our DIRECTDEPS and symbol graph.
+# Asks PACKAGE to sanity check our DIRECTDEPS and symbol graph.
 # This program functions as an incremental linker. It also provides
 # enhancements to the object code that GCC generated similar to LTO
-# so be certain that your .com.dbg rule depends on the .pkg output!
+# so be certain that your .dbg rule depends on the .pkg output!
 o/$(MODE)/examples/pyapp/pyapp.pkg: \
 		o/$(MODE)/examples/pyapp/pyapp.o \
 		$(foreach x,$(PYAPP_DIRECTDEPS),$($(x)_A).pkg)
@@ -90,7 +90,7 @@ o/$(MODE)/examples/pyapp/pyapp.pkg: \
 # Ask GNU LD to link our APE executable within an ELF binary shell.
 # The CRT and APE dependencies are special dependencies that define
 # your _start() / WinMain() entrpoints as well as APE linker script
-o/$(MODE)/examples/pyapp/pyapp.com.dbg: \
+o/$(MODE)/examples/pyapp/pyapp.dbg: \
 		$(PYAPP_DEPS) \
 		o/$(MODE)/examples/pyapp/pyapp.pkg \
 		o/$(MODE)/examples/pyapp/pyapp.o \
@@ -98,10 +98,10 @@ o/$(MODE)/examples/pyapp/pyapp.com.dbg: \
 		$(APE_NO_MODIFY_SELF)
 	@$(COMPILE) -ALINK.ape $(LINK) $(LINKARGS) -o $@
 
-# # Unwrap the APE .COM binary, that's embedded within the linked file
+# # Unwrap the APE  binary, that's embedded within the linked file
 # # NOTE: This line can be commented out, since it's in build/rules.mk
-# o/$(MODE)/examples/pyapp/pyapp.com: \
-# 		o/$(MODE)/examples/pyapp/pyapp.com.dbg
+# o/$(MODE)/examples/pyapp/pyapp: \
+# 		o/$(MODE)/examples/pyapp/pyapp.dbg
 # 	$(OBJCOPY) -S -O binary $< $@
 
 # Ensure that build config changes will invalidate build artifacts.
@@ -112,5 +112,5 @@ o/$(MODE)/examples/pyapp/pyapp.o: \
 # and have it build all targets the package defines.
 .PHONY: o/$(MODE)/examples/pyapp
 o/$(MODE)/examples/pyapp: \
-		o/$(MODE)/examples/pyapp/pyapp.com \
-		o/$(MODE)/examples/pyapp/pyapp.com.dbg
+		o/$(MODE)/examples/pyapp/pyapp \
+		o/$(MODE)/examples/pyapp/pyapp.dbg
diff --git a/examples/pylife/BUILD.mk b/examples/pylife/BUILD.mk
index 4152b7890..e2f4588aa 100644
--- a/examples/pylife/BUILD.mk
+++ b/examples/pylife/BUILD.mk
@@ -14,13 +14,13 @@
 # GETTING STARTED
 #
 #   # run these commands after cloning the cosmo repo on linux
-#   $ make -j8 o//examples/pylife/pylife.com
-#   $ o//examples/pylife/pylife.com
+#   $ make -j8 o//examples/pylife/pylife
+#   $ o//examples/pylife/pylife
 #   cosmopolitan is cool!
 #
 # HOW IT WORKS
 #
-#   $ pyobj.com -m -o pylife.o pylife.py
+#   $ pyobj -m -o pylife.o pylife.py
 #   $ ld -static -nostdlib -T o//ape/ape.lds ape.o crt.o \
 #       pylife.o \
 #       cosmopolitan-python-stage2.a \
@@ -29,19 +29,19 @@
 #       cosmopolitan-bzip2.a \
 #       cosmopolitan-python-stage1.a \
 #       cosmopolitan.a
-#   $ ./pylife.com
+#   $ ./pylife
 #   cosmopolitan is cool!
 #
 # NOTES
 #
-#   If you enjoy this tutorial, let us know jtunney@gmail.com. If
+#   If you enjoy this tutorial, let us know jtunney@gmail. If
 #   you're building something cool, then we can we can add you to
 #   our .gitowners file which grants you commit access so you can
 #   indepnedently maintain your package, as part of the mono-repo
 
 PKGS      += PYLIFE
 PYLIFE      = $(PYLIFE_DEPS) o/$(MODE)/examples/pylife/pylife.a
-PYLIFE_COMS = o/$(MODE)/examples/pylife/pylife.com
+PYLIFE_COMS = o/$(MODE)/examples/pylife/pylife
 PYLIFE_BINS = $(PYLIFE_COMS) $(PYLIFE_COMS:%=%.dbg)
 
 # Specify our Cosmopolitan library dependencies
@@ -58,7 +58,7 @@ PYLIFE_DIRECTDEPS = \
 # them all out and arranges them in the correct order.
 PYLIFE_DEPS := $(call uniq,$(foreach x,$(PYLIFE_DIRECTDEPS),$($(x))))
 
-# # Asks PYOBJ.COM to turn our Python source into an ELF object which
+# # Asks PYOBJ to turn our Python source into an ELF object which
 # # contains (a) embedded zip file artifacts of our .py file and .pyc
 # # which it it compiled; and (b) statically analyzed listings of our
 # # python namespaces and imports that GNU ld will use for tree shake
@@ -71,18 +71,18 @@ PYLIFE_DEPS := $(call uniq,$(foreach x,$(PYLIFE_DIRECTDEPS),$($(x))))
 # in `.python/` (which is accessible via open() system calls, using
 # the synthetic path `"/zip/.python/"`) which means that if we want
 # to turn `pylife/pylife.py` into `.python/pylife.py` so it's imported
-# using `import pylife` then we can simply append to PYOBJ.COM flags
+# using `import pylife` then we can simply append to PYOBJ flags
 # flags above asking it to strip one directory component and prefix
 # Lastly be sure that whenever you use this variable override trick
 # you only do it to .o files, since otherwise it'll ruin everything
-# Passing -m to PYOBJ.COM causes a C main() function to get yoinked
+# Passing -m to PYOBJ causes a C main() function to get yoinked
 # and it means our Python module can no longer be used as a library
 o/$(MODE)/examples/pylife/pylife.o: PYFLAGS += -m -C2 -P.python
 
-# Asks PACKAGE.COM to sanity check our DIRECTDEPS and symbol graph.
+# Asks PACKAGE to sanity check our DIRECTDEPS and symbol graph.
 # This program functions as an incremental linker. It also provides
 # enhancements to the object code that GCC generated similar to LTO
-# so be certain that your .com.dbg rule depends on the .pkg output!
+# so be certain that your .dbg rule depends on the .pkg output!
 o/$(MODE)/examples/pylife/pylife.pkg: \
 		o/$(MODE)/examples/pylife/pylife.o \
 		$(foreach x,$(PYLIFE_DIRECTDEPS),$($(x)_A).pkg)
@@ -90,7 +90,7 @@ o/$(MODE)/examples/pylife/pylife.pkg: \
 # Ask GNU LD to link our APE executable within an ELF binary shell.
 # The CRT and APE dependencies are special dependencies that define
 # your _start() / WinMain() entrpoints as well as APE linker script
-o/$(MODE)/examples/pylife/pylife.com.dbg: \
+o/$(MODE)/examples/pylife/pylife.dbg: \
 		$(PYLIFE_DEPS) \
 		o/$(MODE)/examples/pylife/pylife.pkg \
 		o/$(MODE)/examples/pylife/pylife.o \
@@ -98,10 +98,10 @@ o/$(MODE)/examples/pylife/pylife.com.dbg: \
 		$(APE_NO_MODIFY_SELF)
 	@$(COMPILE) -ALINK.ape $(LINK) $(LINKARGS) -o $@
 
-# # Unwrap the APE .COM binary, that's embedded within the linked file
+# # Unwrap the APE  binary, that's embedded within the linked file
 # # NOTE: This line can be commented out, since it's in build/rules.mk
-# o/$(MODE)/examples/pylife/pylife.com: \
-# 		o/$(MODE)/examples/pylife/pylife.com.dbg
+# o/$(MODE)/examples/pylife/pylife: \
+# 		o/$(MODE)/examples/pylife/pylife.dbg
 # 	$(OBJCOPY) -S -O binary $< $@
 
 # Ensure that build config changes will invalidate build artifacts.
@@ -112,5 +112,5 @@ o/$(MODE)/examples/pylife/pylife.o: \
 # and have it build all targets the package defines.
 .PHONY: o/$(MODE)/examples/pylife
 o/$(MODE)/examples/pylife: \
-		o/$(MODE)/examples/pylife/pylife.com \
-		o/$(MODE)/examples/pylife/pylife.com.dbg
+		o/$(MODE)/examples/pylife/pylife \
+		o/$(MODE)/examples/pylife/pylife.dbg
diff --git a/libc/calls/chmod.c b/libc/calls/chmod.c
index aa5f9f88e..f9253240e 100644
--- a/libc/calls/chmod.c
+++ b/libc/calls/chmod.c
@@ -23,7 +23,7 @@
  * Changes permissions on file, e.g.:
  *
  *     CHECK_NE(-1, chmod("foo/bar.txt", 0644));
- *     CHECK_NE(-1, chmod("o/default/program.com", 0755));
+ *     CHECK_NE(-1, chmod("o/default/program", 0755));
  *     CHECK_NE(-1, chmod("privatefolder/", 0700));
  *
  * The esoteric bits generally available on System Five are:
diff --git a/libc/calls/fchmodat.c b/libc/calls/fchmodat.c
index db228ccb8..6c5dd007c 100644
--- a/libc/calls/fchmodat.c
+++ b/libc/calls/fchmodat.c
@@ -36,7 +36,7 @@ int sys_fchmodat2(int, const char *, unsigned, int);
  * Changes permissions on file, e.g.:
  *
  *     CHECK_NE(-1, fchmodat(AT_FDCWD, "foo/bar.txt", 0644));
- *     CHECK_NE(-1, fchmodat(AT_FDCWD, "o/default/program.com", 0755));
+ *     CHECK_NE(-1, fchmodat(AT_FDCWD, "o/default/program", 0755));
  *     CHECK_NE(-1, fchmodat(AT_FDCWD, "privatefolder/", 0700));
  *
  * @param path must exist
diff --git a/libc/calls/getprogramexecutablename.greg.c b/libc/calls/getprogramexecutablename.greg.c
index 89cb8aa77..96fe671d8 100644
--- a/libc/calls/getprogramexecutablename.greg.c
+++ b/libc/calls/getprogramexecutablename.greg.c
@@ -118,6 +118,8 @@ static char *CopyWithCwd(const char *q, char *p, char *e) {
 
 // if q exists then turn it into an absolute path. we also try adding
 // a .com suffix since the ape auto-appends it when resolving
+//
+// TODO(jart): is this still relevant?
 static int TryPath(const char *q, int com) {
   char *p;
   if (!(p = CopyWithCwd(q, g_prog.u.buf,
diff --git a/libc/calls/pledge-linux.c b/libc/calls/pledge-linux.c
index df16d5637..d170ec770 100644
--- a/libc/calls/pledge-linux.c
+++ b/libc/calls/pledge-linux.c
@@ -950,14 +950,14 @@ static const uint16_t kPledgeUnveil[] = {
 
 // placeholder group
 //
-// pledge.com checks this to do auto-unveiling
+// pledge checks this to do auto-unveiling
 static const uint16_t kPledgeVminfo[] = {
     __NR_linux_sched_yield,  //
 };
 
 // placeholder group
 //
-// pledge.com uses this to auto-unveil /tmp and $TMPPATH with rwc
+// pledge uses this to auto-unveil /tmp and $TMPPATH with rwc
 // permissions. pledge() alone (without unveil() too) offers very
 // little security here. consider using them together.
 static const uint16_t kPledgeTmppath[] = {
diff --git a/libc/calls/pledge.c b/libc/calls/pledge.c
index 429f085b1..964b77fbd 100644
--- a/libc/calls/pledge.c
+++ b/libc/calls/pledge.c
@@ -163,7 +163,7 @@
  *   interpreted, and ape binaries, you'll usually want `rpath` and
  *   `prot_exec` too. With APE it's possible to work around this
  *   requirement, by "assimilating" your binaries beforehand. See the
- *   assimilate.com program and `--assimilate` flag which can be used to
+ *   assimilate program and `--assimilate` flag which can be used to
  *   turn APE binaries into static native binaries.
  *
  * - "prot_exec" allows mmap(PROT_EXEC) and mprotect(PROT_EXEC). This is
@@ -176,13 +176,13 @@
  *   calls on Linux.
  *
  * - "vminfo" OpenBSD defines this for programs like `top`. On Linux,
- *   this is a placeholder group that lets tools like pledge.com check
+ *   this is a placeholder group that lets tools like pledge check
  *   `__promises` and automatically unveil() a subset of files top would
  *   need, e.g. /proc/stat, /proc/meminfo.
  *
  * - "tmppath" allows unlink, unlinkat, and lstat. This is mostly a
- *   placeholder group for pledge.com, which reads the `__promises`
- *   global to determine if /tmp and $TMPPATH should be unveiled.
+ *   placeholder group for pledge, which reads the `__promises` global
+ *   to determine if /tmp and $TMPPATH should be unveiled.
  *
  * `execpromises` only matters if "exec" is specified in `promises`. In
  * that case, this specifies the promises that'll apply once execve()
diff --git a/libc/calls/read-nt.c b/libc/calls/read-nt.c
index 540855355..2d76062da 100644
--- a/libc/calls/read-nt.c
+++ b/libc/calls/read-nt.c
@@ -368,7 +368,7 @@ static textwindows int ProcessKeyEvent(const struct NtInputRecord *r, char *p) {
 // To use the tty mouse events feature:
 //   - write(1, "\e[?1000;1002;1015;1006h") to enable
 //   - write(1, "\e[?1000;1002;1015;1006l") to disable
-// See o//examples/ttyinfo.com and o//tool/viz/life.com
+// See o//examples/ttyinfo and o//tool/viz/life
 static textwindows int ProcessMouseEvent(const struct NtInputRecord *r,
                                          char *b) {
   char *p = b;
diff --git a/libc/crt/crt.S b/libc/crt/crt.S
index 69c38493e..e2917b2ec 100644
--- a/libc/crt/crt.S
+++ b/libc/crt/crt.S
@@ -116,7 +116,6 @@ _start:
 9:	.unreachable
 
 //	strongly link main() function (discarded by linker)
-//	libc_runtime had to weakly link, due to package.com
 	.section .yoink
 	call	main
 	.previous
@@ -154,7 +153,6 @@ _start:
 	.unreachable
 
 //	strongly link main() function (discarded by linker)
-//	libc_runtime had to weakly link, due to package.com
 	.section .yoink
 	bl	main
 	.previous
diff --git a/libc/intrin/asan.c b/libc/intrin/asan.c
index 464abe8fe..dc28ff4aa 100644
--- a/libc/intrin/asan.c
+++ b/libc/intrin/asan.c
@@ -24,7 +24,6 @@
 #include "libc/errno.h"
 #include "libc/intrin/asan.internal.h"
 #include "libc/intrin/atomic.h"
-#include "libc/serialize.h"
 #include "libc/intrin/cmpxchg.h"
 #include "libc/intrin/describebacktrace.internal.h"
 #include "libc/intrin/directmap.internal.h"
@@ -45,6 +44,7 @@
 #include "libc/runtime/runtime.h"
 #include "libc/runtime/stack.h"
 #include "libc/runtime/symbols.internal.h"
+#include "libc/serialize.h"
 #include "libc/stdckdint.h"
 #include "libc/str/str.h"
 #include "libc/str/tab.internal.h"
@@ -767,7 +767,7 @@ static void __asan_report_memory_origin_image(intptr_t a, int z) {
         }
       }
     } else {
-      kprintf("\tunknown please supply .com.dbg symbols or set COMDBG\n");
+      kprintf("\tunknown please supply .dbg symbols or set COMDBG\n");
     }
   } else {
     kprintf("\tunknown please __static_yoink(\"GetSymbolTable\");\n");
diff --git a/libc/intrin/interrupts.S b/libc/intrin/interrupts.S
index 58eb48fd2..837973a18 100644
--- a/libc/intrin/interrupts.S
+++ b/libc/intrin/interrupts.S
@@ -97,7 +97,7 @@ __excep0_isr:
 	xor	%eax,%eax		# kprintf is variadic, remember to
 					# pass no. of vector regs. used (= 0)
 	.weak	kprintf			# weakly link kprintf() because we
-	ezlea	kprintf,bx		# want to keep life.com tiny
+	ezlea	kprintf,bx		# want to keep examples/life tiny
 	test	%ebx,%ebx
 	jz	8f
 	call	*%rbx			# print error message
diff --git a/libc/log/checkfail_ndebug.c b/libc/log/checkfail_ndebug.c
index a15b95868..a55fc29e4 100644
--- a/libc/log/checkfail_ndebug.c
+++ b/libc/log/checkfail_ndebug.c
@@ -28,8 +28,8 @@
  *
  * This handler (1) makes binaries smaller by not embedding source code;
  * and therefore (2) less likely to leak sensitive information. This can
- * still print backtraces with function names if the .com.dbg file is in
- * the same folder.
+ * still print backtraces with function names if the .dbg file is in the
+ * same folder.
  *
  * @see libc/log/thunks/__check_fail_ndebug.S
  */
diff --git a/libc/log/memlog.c b/libc/log/memlog.c
index 62304ea7a..c12bc1aa6 100644
--- a/libc/log/memlog.c
+++ b/libc/log/memlog.c
@@ -44,12 +44,12 @@
  *
  * delimited by spaces. For example, to see peak malloc usage:
  *
- *     ./myprog.com 2>log
+ *     ./myprog 2>log
  *     grep ^MEM log | sort -nk4 | tail -n10
  *
  * To see the largest allocations:
  *
- *     ./myprog.com 2>log
+ *     ./myprog 2>log
  *     grep ^MEM log | grep -v free | sort -nk7 | tail -n10
  */
 
diff --git a/libc/proc/cocmd.c b/libc/proc/cocmd.c
index 5723eccc6..fe0297460 100644
--- a/libc/proc/cocmd.c
+++ b/libc/proc/cocmd.c
@@ -25,12 +25,12 @@
 #include "libc/fmt/conv.h"
 #include "libc/fmt/itoa.h"
 #include "libc/fmt/magnumstrs.internal.h"
-#include "libc/serialize.h"
 #include "libc/intrin/getenv.internal.h"
 #include "libc/intrin/weaken.h"
 #include "libc/limits.h"
 #include "libc/macros.internal.h"
 #include "libc/runtime/runtime.h"
+#include "libc/serialize.h"
 #include "libc/stdio/stdio.h"
 #include "libc/str/str.h"
 #include "libc/sysv/consts/lock.h"
@@ -986,7 +986,7 @@ int _cocmd(int argc, char **argv, char **envp) {
   size_t globCount = 0;
   int globFlags = 0;
   glob_t globTheBuilder;
-  prog = argc > 0 ? argv[0] : "cocmd.com";
+  prog = argc > 0 ? argv[0] : "cocmd";
 
   for (i = 1; i < 32; ++i) {
     unsupported[i] = true;
diff --git a/libc/proc/execve-sysv.c b/libc/proc/execve-sysv.c
index aa638aac6..618b5c295 100644
--- a/libc/proc/execve-sysv.c
+++ b/libc/proc/execve-sysv.c
@@ -53,23 +53,19 @@ static struct {
 } g_execve;
 
 static bool IsApeFile(const char *path) {
-  if (endswith(path, ".com")) {
-    return true;
-  } else {
-    bool res = false;
-    BLOCK_SIGNALS;
-    BLOCK_CANCELATION;
-    int fd;
-    char buf[8];
-    int flags = O_RDONLY | O_NOCTTY | O_NONBLOCK | O_CLOEXEC;
-    if ((fd = sys_openat(AT_FDCWD, path, flags, 0)) != -1) {
-      res = sys_pread(fd, buf, 8, 0, 0) == 8 && IsApeLoadable(buf);
-      sys_close(fd);
-    }
-    ALLOW_CANCELATION;
-    ALLOW_SIGNALS;
-    return res;
+  bool res = false;
+  BLOCK_SIGNALS;
+  BLOCK_CANCELATION;
+  int fd;
+  char buf[8];
+  int flags = O_RDONLY | O_NOCTTY | O_NONBLOCK | O_CLOEXEC;
+  if ((fd = sys_openat(AT_FDCWD, path, flags, 0)) != -1) {
+    res = sys_pread(fd, buf, 8, 0, 0) == 8 && IsApeLoadable(buf);
+    sys_close(fd);
   }
+  ALLOW_CANCELATION;
+  ALLOW_SIGNALS;
+  return res;
 }
 
 static const char *Join(const char *a, const char *b, char buf[PATH_MAX]) {
diff --git a/libc/runtime/efimain.greg.c b/libc/runtime/efimain.greg.c
index 7861ef0bc..5b15f73d6 100644
--- a/libc/runtime/efimain.greg.c
+++ b/libc/runtime/efimain.greg.c
@@ -160,7 +160,7 @@ static void EfiInitAcpi(struct mman *mm, EFI_SYSTEM_TABLE *SystemTable) {
  *       -net none        \
  *       -drive format=raw,file=fat:rw:o/tool/viz
  *     FS0:
- *     deathstar.com
+ *     deathstar
  *
  * @see libc/dce.h
  */
diff --git a/libc/runtime/getsymboltable.c b/libc/runtime/getsymboltable.c
index e2af49d18..fff3282f9 100644
--- a/libc/runtime/getsymboltable.c
+++ b/libc/runtime/getsymboltable.c
@@ -88,7 +88,7 @@ static struct SymbolTable *GetSymbolTableFromZip(struct Zipos *zipos) {
 }
 
 /**
- * Reads symbol table from .com.dbg file.
+ * Reads symbol table from .dbg file.
  * @note This code can't depend on dlmalloc()
  */
 static struct SymbolTable *GetSymbolTableFromElf(void) {
@@ -109,11 +109,11 @@ static struct SymbolTable *GetSymbolTableFromElf(void) {
  *     __static_yoink("__zipos_get");
  *
  * In that case, the symbol table may be read from `/zip/.symtab` which
- * is generated by `o//tool/build/symtab.com`. The second strategy is to
- * look for the concomitant `.com.dbg` executable, which may very well
- * be the one currently executing, or it could be placed in the same
- * folder as your `.com` binary, or lastly, it could be explicitly
- * specified via the `COMDBG` environment variable.
+ * is generated by `o//tool/build/symtab`. The second strategy is to
+ * look for the concomitant `.dbg` executable, which may very well be
+ * the one currently executing, or it could be placed in the same folder
+ * as your binary, or lastly, it could be explicitly specified via the
+ * `COMDBG` environment variable.
  *
  * Function tracing is disabled throughout the duration of this call.
  * Backtraces and other core runtime functionality depend on this.
diff --git a/libc/str/update.sh b/libc/str/update.sh
index 5dbec103a..559970b18 100755
--- a/libc/str/update.sh
+++ b/libc/str/update.sh
@@ -1,11 +1,11 @@
 #!/bin/sh
 [ -d libc/str ] || exit
-[ -x o//examples/curl.com ] || make -j8 o//examples/curl.com || exit
+[ -x o//tool/curl/curl ] || make -j8 o//tool/curl/curl || exit
 mkdir -p o/tmp/ || exit
 
 shineget() {
   echo $2
-  o//examples/curl.com $2 >o/tmp/$$ || exit
+  o//tool/curl/curl $2 >o/tmp/$$ || exit
   mv o/tmp/$$ $1 || exit
 }
 
diff --git a/libc/testlib/testlib.h b/libc/testlib/testlib.h
index 50a0df919..07654b13d 100644
--- a/libc/testlib/testlib.h
+++ b/libc/testlib/testlib.h
@@ -32,8 +32,8 @@ COSMOPOLITAN_C_START_
 /**
  * Declares benchmark function.
  *
- * These only run if (1) the -b flag is passed to the FOO_test.com; and
- * (2) the unit tests passed. It's just an ordinary function, that gets
+ * These only run if (1) the -b flag is passed to the FOO_test; and (2)
+ * the unit tests passed. It's just an ordinary function, that gets
  * registered with the linker. It should print things to stdout.
  *
  * @see EZBENCH()
diff --git a/libc/testlib/testmain.c b/libc/testlib/testmain.c
index 1997d96f0..da218f162 100644
--- a/libc/testlib/testmain.c
+++ b/libc/testlib/testmain.c
@@ -162,7 +162,7 @@ dontasan int main(int argc, char *argv[]) {
   // we're done!
   int status = MIN(255, g_testlib_failed);
   if (!status && IsRunningUnderMake()) {
-    return 254;  // compile.com considers this 0 and propagates output
+    return 254;  // compile considers this 0 and propagates output
   } else if (!status && _weaken(pthread_exit)) {
     _weaken(pthread_exit)(0);
   } else {
diff --git a/libc/testlib/testrunner.c b/libc/testlib/testrunner.c
index 491e73860..6f432253b 100644
--- a/libc/testlib/testrunner.c
+++ b/libc/testlib/testrunner.c
@@ -81,10 +81,10 @@ void testlib_runtestcases(const testfn_t *start, const testfn_t *end,
   // getpid() calls are inserted to help visually see tests in traces
   // which can be performed on Linux, FreeBSD, OpenBSD, and XNU:
   //
-  //     strace -f o/default/test.com |& less
-  //     truss o/default/test.com |& less
-  //     ktrace -f trace o/default/test.com </dev/null; kdump -f trace | less
-  //     dtruss o/default/test.com |& less
+  //     strace -f o/default/test |& less
+  //     truss o/default/test |& less
+  //     ktrace -f trace o/default/test </dev/null; kdump -f trace | less
+  //     dtruss o/default/test |& less
   //
   // Test cases are iterable via a decentralized section. Your TEST()
   // macro inserts .testcase.SUITENAME sections into the binary which
diff --git a/net/turfwar/BUILD.mk b/net/turfwar/BUILD.mk
index 8350502cd..9dc216b9b 100644
--- a/net/turfwar/BUILD.mk
+++ b/net/turfwar/BUILD.mk
@@ -68,14 +68,6 @@ o/$(MODE)/net/turfwar/turfbean.com.dbg:			\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/net/turfwar/turfbean.com:			\
-		o/$(MODE)/net/turfwar/turfbean.com.dbg	\
-		o/$(MODE)/third_party/zip/zip.com	\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
 o/$(MODE)/net/turfwar/.init.lua.zip.o: private		\
 		ZIPOBJ_FLAGS +=				\
 			-B
diff --git a/test/dsp/core/BUILD.mk b/test/dsp/core/BUILD.mk
index d3b063480..0fb903e37 100644
--- a/test/dsp/core/BUILD.mk
+++ b/test/dsp/core/BUILD.mk
@@ -11,13 +11,13 @@ TEST_DSP_CORE_OBJS =						\
 	$(TEST_DSP_CORE_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_DSP_CORE_COMS =						\
-	$(TEST_DSP_CORE_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_DSP_CORE_SRCS:%.c=o/$(MODE)/%)
 
 TEST_DSP_CORE_TESTS =						\
-	$(TEST_DSP_CORE_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_DSP_CORE_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_DSP_CORE_CHECKS =						\
-	$(TEST_DSP_CORE_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_DSP_CORE_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_DSP_CORE_DIRECTDEPS =					\
 	DSP_CORE						\
@@ -37,7 +37,7 @@ o/$(MODE)/test/dsp/core/core.pkg:				\
 		$(TEST_DSP_CORE_OBJS)				\
 		$(foreach x,$(TEST_DSP_CORE_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/dsp/core/%.com.dbg:				\
+o/$(MODE)/test/dsp/core/%.dbg:					\
 		$(TEST_DSP_CORE_DEPS)				\
 		o/$(MODE)/test/dsp/core/%.o			\
 		$(LIBC_TESTMAIN)				\
diff --git a/test/dsp/scale/BUILD.mk b/test/dsp/scale/BUILD.mk
index 5395a894f..26eb45281 100644
--- a/test/dsp/scale/BUILD.mk
+++ b/test/dsp/scale/BUILD.mk
@@ -11,13 +11,13 @@ TEST_DSP_SCALE_OBJS =					\
 	$(TEST_DSP_SCALE_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_DSP_SCALE_COMS =					\
-	$(TEST_DSP_SCALE_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_DSP_SCALE_SRCS:%.c=o/$(MODE)/%)
 
 TEST_DSP_SCALE_TESTS =					\
-	$(TEST_DSP_SCALE_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_DSP_SCALE_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_DSP_SCALE_CHECKS =					\
-	$(TEST_DSP_SCALE_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_DSP_SCALE_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_DSP_SCALE_DIRECTDEPS =				\
 	DSP_CORE					\
@@ -42,7 +42,7 @@ o/$(MODE)/test/dsp/scale/scale.pkg:			\
 		$(TEST_DSP_SCALE_OBJS)			\
 		$(foreach x,$(TEST_DSP_SCALE_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/dsp/scale/%.com.dbg:			\
+o/$(MODE)/test/dsp/scale/%.dbg:				\
 		$(TEST_DSP_SCALE_DEPS)			\
 		o/$(MODE)/test/dsp/scale/%.o		\
 		o/$(MODE)/test/dsp/scale/scale.pkg	\
diff --git a/test/dsp/tty/BUILD.mk b/test/dsp/tty/BUILD.mk
index f2030ee21..e0e2de3f1 100644
--- a/test/dsp/tty/BUILD.mk
+++ b/test/dsp/tty/BUILD.mk
@@ -11,13 +11,13 @@ TEST_DSP_TTY_OBJS =					\
 	$(TEST_DSP_TTY_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_DSP_TTY_COMS =					\
-	$(TEST_DSP_TTY_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_DSP_TTY_SRCS:%.c=o/$(MODE)/%)
 
 TEST_DSP_TTY_TESTS =					\
-	$(TEST_DSP_TTY_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_DSP_TTY_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_DSP_TTY_CHECKS =					\
-	$(TEST_DSP_TTY_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_DSP_TTY_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_DSP_TTY_DIRECTDEPS =				\
 	DSP_TTY						\
@@ -38,7 +38,7 @@ o/$(MODE)/test/dsp/tty/tty.pkg:				\
 		$(TEST_DSP_TTY_OBJS)			\
 		$(foreach x,$(TEST_DSP_TTY_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/dsp/tty/%.com.dbg:			\
+o/$(MODE)/test/dsp/tty/%.dbg:				\
 		$(TEST_DSP_TTY_DEPS)			\
 		o/$(MODE)/test/dsp/tty/%.o		\
 		o/$(MODE)/test/dsp/tty/tty.pkg		\
diff --git a/test/libc/calls/BUILD.mk b/test/libc/calls/BUILD.mk
index 9f2e6ea9c..63da426d7 100644
--- a/test/libc/calls/BUILD.mk
+++ b/test/libc/calls/BUILD.mk
@@ -13,21 +13,21 @@ TEST_LIBC_CALLS_OBJS =							\
 	$(TEST_LIBC_CALLS_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_LIBC_CALLS_COMS =							\
-	$(TEST_LIBC_CALLS_SRCS_TEST:%.c=o/$(MODE)/%.com)
+	$(TEST_LIBC_CALLS_SRCS_TEST:%.c=o/$(MODE)/%)
 
 TEST_LIBC_CALLS_BINS =							\
 	$(TEST_LIBC_CALLS_COMS)						\
 	$(TEST_LIBC_CALLS_COMS:%=%.dbg)					\
-	o/$(MODE)/test/libc/calls/life-nomod.com			\
-	o/$(MODE)/test/libc/calls/life-classic.com			\
-	o/$(MODE)/test/libc/calls/zipread.com.dbg			\
-	o/$(MODE)/test/libc/calls/zipread.com
+	o/$(MODE)/test/libc/calls/life-nomod				\
+	o/$(MODE)/test/libc/calls/life-classic				\
+	o/$(MODE)/test/libc/calls/zipread.dbg				\
+	o/$(MODE)/test/libc/calls/zipread
 
 TEST_LIBC_CALLS_TESTS =							\
-	$(TEST_LIBC_CALLS_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_LIBC_CALLS_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_LIBC_CALLS_CHECKS =						\
-	$(TEST_LIBC_CALLS_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_LIBC_CALLS_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_LIBC_CALLS_DIRECTDEPS =						\
 	DSP_CORE							\
@@ -61,7 +61,7 @@ o/$(MODE)/test/libc/calls/calls.pkg:					\
 		$(TEST_LIBC_CALLS_OBJS)					\
 		$(foreach x,$(TEST_LIBC_CALLS_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/calls/%.com.dbg:					\
+o/$(MODE)/test/libc/calls/%.dbg:					\
 		$(TEST_LIBC_CALLS_DEPS)					\
 		o/$(MODE)/test/libc/calls/%.o				\
 		o/$(MODE)/test/libc/calls/calls.pkg			\
@@ -70,7 +70,7 @@ o/$(MODE)/test/libc/calls/%.com.dbg:					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/calls/stat_test.com.dbg:				\
+o/$(MODE)/test/libc/calls/stat_test.dbg:				\
 		$(TEST_LIBC_CALLS_DEPS)					\
 		o/$(MODE)/test/libc/calls/stat_test.o			\
 		o/$(MODE)/third_party/python/Lib/test/tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt.zip.o	\
@@ -80,7 +80,7 @@ o/$(MODE)/test/libc/calls/stat_test.com.dbg:				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/calls/unveil_test.com.dbg:				\
+o/$(MODE)/test/libc/calls/unveil_test.dbg:				\
 		$(TEST_LIBC_CALLS_DEPS)					\
 		o/$(MODE)/test/libc/calls/unveil_test.o			\
 		o/$(MODE)/test/libc/mem/prog/life.elf.zip.o		\
@@ -91,7 +91,7 @@ o/$(MODE)/test/libc/calls/unveil_test.com.dbg:				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/calls/pledge_test.com.dbg:				\
+o/$(MODE)/test/libc/calls/pledge_test.dbg:				\
 		$(TEST_LIBC_CALLS_DEPS)					\
 		o/$(MODE)/test/libc/calls/pledge_test.o			\
 		o/$(MODE)/test/libc/mem/prog/life.elf.zip.o		\
@@ -102,14 +102,14 @@ o/$(MODE)/test/libc/calls/pledge_test.com.dbg:				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/calls/life-classic.com.dbg:				\
+o/$(MODE)/test/libc/calls/life-classic.dbg:				\
 		$(LIBC_RUNTIME)						\
 		o/$(MODE)/test/libc/calls/life.o			\
 		$(CRT)							\
 		$(APE)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/calls/life-nomod.com.dbg:				\
+o/$(MODE)/test/libc/calls/life-nomod.dbg:				\
 		$(LIBC_RUNTIME)						\
 		o/$(MODE)/test/libc/calls/life.o			\
 		$(CRT)							\
@@ -117,43 +117,43 @@ o/$(MODE)/test/libc/calls/life-nomod.com.dbg:				\
 	@$(APELINK)
 
 o/$(MODE)/test/libc/calls/tiny64.elf.zip.o				\
-o/$(MODE)/test/libc/calls/life-nomod.com.zip.o				\
-o/$(MODE)/test/libc/calls/life-classic.com.zip.o			\
-o/$(MODE)/test/libc/calls/zipread.com.zip.o: private			\
+o/$(MODE)/test/libc/calls/life-nomod.zip.o				\
+o/$(MODE)/test/libc/calls/life-classic.zip.o				\
+o/$(MODE)/test/libc/calls/zipread.zip.o: private			\
 		ZIPOBJ_FLAGS +=						\
 			-B
 
 # TODO(jart): Have pledge() support SIOCGIFCONF
-o/$(MODE)/test/libc/calls/ioctl_test.com.runs:				\
+o/$(MODE)/test/libc/calls/ioctl_test.runs:				\
 		private .PLEDGE =
 
-o/$(MODE)/test/libc/calls/lseek_test.com.runs				\
-o/$(MODE)/test/libc/calls/poll_test.com.runs:				\
+o/$(MODE)/test/libc/calls/lseek_test.runs				\
+o/$(MODE)/test/libc/calls/poll_test.runs:				\
 		private .PLEDGE = stdio rpath wpath cpath fattr proc inet
 
-o/$(MODE)/test/libc/calls/fcntl_test.com.runs				\
-o/$(MODE)/test/libc/calls/lock_test.com.runs				\
-o/$(MODE)/test/libc/calls/lock2_test.com.runs				\
-o/$(MODE)/test/libc/calls/lock_ofd_test.com.runs:			\
+o/$(MODE)/test/libc/calls/fcntl_test.runs				\
+o/$(MODE)/test/libc/calls/lock_test.runs				\
+o/$(MODE)/test/libc/calls/lock2_test.runs				\
+o/$(MODE)/test/libc/calls/lock_ofd_test.runs:				\
 		private .PLEDGE = stdio rpath wpath cpath fattr proc flock
 
-o/$(MODE)/test/libc/calls/unveil_test.com.runs				\
-o/$(MODE)/test/libc/calls/openbsd_test.com.runs:			\
+o/$(MODE)/test/libc/calls/unveil_test.runs				\
+o/$(MODE)/test/libc/calls/openbsd_test.runs:				\
 		private .PLEDGE = stdio rpath wpath cpath fattr proc unveil
 
-o/$(MODE)/test/libc/calls/fexecve_test.com.runs:			\
+o/$(MODE)/test/libc/calls/fexecve_test.runs:				\
 		private .UNSANDBOXED = 1  # for memfd_create()
 
-o/$(MODE)/test/libc/calls/execve_test.com.runs:				\
+o/$(MODE)/test/libc/calls/execve_test.runs:				\
 		private .UNSANDBOXED = 1  # for memfd_create()
 
-o/$(MODE)/test/libc/calls/read_test.com.runs:				\
+o/$(MODE)/test/libc/calls/read_test.runs:				\
 		private .UNVEIL += /dev/zero
 
 # TODO(jart): Update nointernet() to allow AF_INET6
-o/$(MODE)/test/libc/calls/pledge_test.com.runs:				\
+o/$(MODE)/test/libc/calls/pledge_test.runs:				\
 		private .INTERNET = 1
-o/$(MODE)/test/libc/calls/pledge_test.com.runs:				\
+o/$(MODE)/test/libc/calls/pledge_test.runs:				\
 		private .PLEDGE =
 
 .PHONY: o/$(MODE)/test/libc/calls
diff --git a/test/libc/calls/commandv_test.c b/test/libc/calls/commandv_test.c
index 043d03245..0014315d3 100644
--- a/test/libc/calls/commandv_test.c
+++ b/test/libc/calls/commandv_test.c
@@ -55,35 +55,34 @@ TEST(commandv, testPathSearch) {
 }
 
 TEST(commandv, testSlashes_wontSearchPath_butChecksAccess) {
-  EXPECT_SYS(0, 3, creat("home/sh.com", 0755));
+  EXPECT_SYS(0, 3, creat("home/sh", 0755));
   EXPECT_SYS(0, 2, write(3, "MZ", 2));
   EXPECT_SYS(0, 0, close(3));
-  EXPECT_STREQ("home/sh.com",
-               commandv("home/sh.com", pathbuf, sizeof(pathbuf)));
+  EXPECT_STREQ("home/sh", commandv("home/sh", pathbuf, sizeof(pathbuf)));
 }
 
 TEST(commandv, testSameDir_doesntHappenByDefaultUnlessItsWindows) {
-  EXPECT_SYS(0, 3, creat("bog.com", 0755));
+  EXPECT_SYS(0, 3, creat("bog", 0755));
   EXPECT_SYS(0, 2, write(3, "MZ", 2));
   EXPECT_SYS(0, 0, close(3));
-  EXPECT_STREQ(NULL, commandv("bog.com", pathbuf, sizeof(pathbuf)));
+  EXPECT_STREQ(NULL, commandv("bog", pathbuf, sizeof(pathbuf)));
   EXPECT_EQ(ENOENT, errno);
 }
 
 TEST(commandv, testSameDir_willHappenWithColonBlank) {
   ASSERT_NE(-1, setenv("PATH", "bin:", true));
-  EXPECT_SYS(0, 3, creat("bog.com", 0755));
+  EXPECT_SYS(0, 3, creat("bog", 0755));
   EXPECT_SYS(0, 2, write(3, "MZ", 2));
   EXPECT_SYS(0, 0, close(3));
-  EXPECT_STREQ("bog.com", commandv("bog.com", pathbuf, sizeof(pathbuf)));
+  EXPECT_STREQ("bog", commandv("bog", pathbuf, sizeof(pathbuf)));
 }
 
 TEST(commandv, testSameDir_willHappenWithColonBlank2) {
   ASSERT_NE(-1, setenv("PATH", ":bin", true));
-  EXPECT_SYS(0, 3, creat("bog.com", 0755));
+  EXPECT_SYS(0, 3, creat("bog", 0755));
   EXPECT_SYS(0, 2, write(3, "MZ", 2));
   EXPECT_SYS(0, 0, close(3));
-  EXPECT_STREQ("bog.com", commandv("bog.com", pathbuf, sizeof(pathbuf)));
+  EXPECT_STREQ("bog", commandv("bog", pathbuf, sizeof(pathbuf)));
 }
 
 TEST(commandv, test_DirPaths_wontConsiderDirectoriesExecutable) {
@@ -95,9 +94,8 @@ TEST(commandv, test_DirPaths_wontConsiderDirectoriesExecutable) {
 
 TEST(commandv, test_DirPaths_wontConsiderDirectoriesExecutable2) {
   ASSERT_NE(-1, setenv("PATH", ":bin", true));
-  EXPECT_SYS(0, 0, mkdir("this_is_a_directory.com", 0755));
-  EXPECT_STREQ(NULL,
-               commandv("this_is_a_directory.com", pathbuf, sizeof(pathbuf)));
+  EXPECT_SYS(0, 0, mkdir("this_is_a_directory", 0755));
+  EXPECT_STREQ(NULL, commandv("this_is_a_directory", pathbuf, sizeof(pathbuf)));
   EXPECT_EQ(ENOENT, errno);
 }
 
diff --git a/test/libc/calls/getprogramexecutablename_test.c b/test/libc/calls/getprogramexecutablename_test.c
index efe28fb5b..671ca1add 100644
--- a/test/libc/calls/getprogramexecutablename_test.c
+++ b/test/libc/calls/getprogramexecutablename_test.c
@@ -124,7 +124,7 @@ TEST(GetProgramExecutableName, movedSelf) {
   if (skiptests) return;
   if (IsAarch64() && IsQemuUser()) {
     // clang-format off
-    // TODO(mrdomino): fix: make -j8 m=aarch64 o/aarch64/test/libc/calls/getprogramexecutablename_test.com.ok
+    // TODO(mrdomino): fix: make -j8 m=aarch64 o/aarch64/test/libc/calls/getprogramexecutablename_test.ok
     //                 possibly related to the intersection of binfmt_misc and qemu-aarch64
     // clang-format on
     return;
diff --git a/test/libc/calls/mkntcmdline_test.c b/test/libc/calls/mkntcmdline_test.c
index f4830ce44..3a645ed3a 100644
--- a/test/libc/calls/mkntcmdline_test.c
+++ b/test/libc/calls/mkntcmdline_test.c
@@ -85,9 +85,9 @@ TEST(mkntcmdline, fixit) {
 }
 
 TEST(mkntcmdline, testWut) {
-  char *argv[] = {"C:\\Users\\jart\\π‘Ÿπ‘’π‘‘π‘π‘’π‘Žπ‘›.com", "--strace", NULL};
+  char *argv[] = {"C:\\Users\\jart\\π‘Ÿπ‘’π‘‘π‘π‘’π‘Žπ‘›", "--strace", NULL};
   EXPECT_NE(-1, mkntcmdline(cmdline, argv));
-  EXPECT_STREQ(u"C:\\Users\\jart\\π‘Ÿπ‘’π‘‘π‘π‘’π‘Žπ‘›.com --strace", cmdline);
+  EXPECT_STREQ(u"C:\\Users\\jart\\π‘Ÿπ‘’π‘‘π‘π‘’π‘Žπ‘› --strace", cmdline);
 }
 
 BENCH(mkntcmdline, lotsOfArgs) {
diff --git a/test/libc/calls/mkntpath_test.c b/test/libc/calls/mkntpath_test.c
index 96f4c5e7a..88f538e7c 100644
--- a/test/libc/calls/mkntpath_test.c
+++ b/test/libc/calls/mkntpath_test.c
@@ -37,8 +37,8 @@ TEST(mkntpath, testSlashes) {
    * all it takes to make the feature entirely useless to us, similar to
    * the law of noncontradiction. We address the issue as follows:
    */
-  EXPECT_EQ(9, __mkntpath("o/foo.com", p));
-  EXPECT_STREQ(u"o\\foo.com", p);
+  EXPECT_EQ(5, __mkntpath("o/foo", p));
+  EXPECT_STREQ(u"o\\foo", p);
 }
 
 TEST(mkntpath, testUnicode) {
diff --git a/test/libc/fmt/BUILD.mk b/test/libc/fmt/BUILD.mk
index 0118c60b7..0c18db769 100644
--- a/test/libc/fmt/BUILD.mk
+++ b/test/libc/fmt/BUILD.mk
@@ -6,58 +6,58 @@ PKGS += TEST_LIBC_FMT
 TEST_LIBC_FMT_SRCS := $(wildcard test/libc/fmt/*.c)
 TEST_LIBC_FMT_SRCS_TEST = $(filter %_test.c,$(TEST_LIBC_FMT_SRCS))
 TEST_LIBC_FMT_BINS = $(TEST_LIBC_FMT_COMS) $(TEST_LIBC_FMT_COMS:%=%.dbg)
-TEST_LIBC_FMT_TESTS = $(TEST_LIBC_FMT_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+TEST_LIBC_FMT_TESTS = $(TEST_LIBC_FMT_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
-TEST_LIBC_FMT_OBJS =					\
+TEST_LIBC_FMT_OBJS =				\
 	$(TEST_LIBC_FMT_SRCS:%.c=o/$(MODE)/%.o)
 
-TEST_LIBC_FMT_COMS =					\
-	$(TEST_LIBC_FMT_SRCS:%.c=o/$(MODE)/%.com)
+TEST_LIBC_FMT_COMS =				\
+	$(TEST_LIBC_FMT_SRCS:%.c=o/$(MODE)/%)
 
-TEST_LIBC_FMT_CHECKS =					\
-	$(TEST_LIBC_FMT_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+TEST_LIBC_FMT_CHECKS =				\
+	$(TEST_LIBC_FMT_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
-TEST_LIBC_FMT_DIRECTDEPS =				\
-	LIBC_FMT					\
-	LIBC_INTRIN					\
-	LIBC_LOG					\
-	LIBC_MEM					\
-	LIBC_NEXGEN32E					\
-	LIBC_RUNTIME					\
-	LIBC_STDIO					\
-	LIBC_STR					\
-	LIBC_SYSV					\
-	LIBC_TESTLIB					\
-	LIBC_TINYMATH					\
-	LIBC_X						\
+TEST_LIBC_FMT_DIRECTDEPS =			\
+	LIBC_FMT				\
+	LIBC_INTRIN				\
+	LIBC_LOG				\
+	LIBC_MEM				\
+	LIBC_NEXGEN32E				\
+	LIBC_RUNTIME				\
+	LIBC_STDIO				\
+	LIBC_STR				\
+	LIBC_SYSV				\
+	LIBC_TESTLIB				\
+	LIBC_TINYMATH				\
+	LIBC_X					\
 	THIRD_PARTY_GDTOA
 
-TEST_LIBC_FMT_DEPS :=					\
+TEST_LIBC_FMT_DEPS :=				\
 	$(call uniq,$(foreach x,$(TEST_LIBC_FMT_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/test/libc/fmt/fmt.pkg:			\
-		$(TEST_LIBC_FMT_OBJS)			\
+o/$(MODE)/test/libc/fmt/fmt.pkg:		\
+		$(TEST_LIBC_FMT_OBJS)		\
 		$(foreach x,$(TEST_LIBC_FMT_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/fmt/%.com.dbg:			\
-		$(TEST_LIBC_FMT_DEPS)			\
-		o/$(MODE)/test/libc/fmt/%.o		\
-		o/$(MODE)/test/libc/fmt/fmt.pkg		\
-		$(LIBC_TESTMAIN)			\
-		$(CRT)					\
+o/$(MODE)/test/libc/fmt/%.dbg:			\
+		$(TEST_LIBC_FMT_DEPS)		\
+		o/$(MODE)/test/libc/fmt/%.o	\
+		o/$(MODE)/test/libc/fmt/fmt.pkg	\
+		$(LIBC_TESTMAIN)		\
+		$(CRT)				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
 $(TEST_LIBC_FMT_OBJS): test/libc/fmt/BUILD.mk
 
-$(TEST_LIBC_FMT_OBJS): private				\
-	DEFAULT_CCFLAGS +=				\
+$(TEST_LIBC_FMT_OBJS): private			\
+	DEFAULT_CCFLAGS +=			\
 		-fno-builtin
 
-o/$(MODE)/test/libc/fmt/fprintf_test.com.runs:		\
+o/$(MODE)/test/libc/fmt/fprintf_test.runs:	\
 	private .UNVEIL += w:/dev/full
 
 .PHONY: o/$(MODE)/test/libc/fmt
-o/$(MODE)/test/libc/fmt:				\
-		$(TEST_LIBC_FMT_BINS)			\
+o/$(MODE)/test/libc/fmt:			\
+		$(TEST_LIBC_FMT_BINS)		\
 		$(TEST_LIBC_FMT_CHECKS)
diff --git a/test/libc/fmt/stripexts_test.c b/test/libc/fmt/stripexts_test.c
index 3ecdb26d2..1189aa1ed 100644
--- a/test/libc/fmt/stripexts_test.c
+++ b/test/libc/fmt/stripexts_test.c
@@ -23,19 +23,19 @@
 #include "libc/x/x.h"
 
 TEST(stripexts, test) {
-  char s[] = "foo/bar.com.dbg";
+  char s[] = "foo/bar.dbg";
   EXPECT_STREQ("foo/bar", stripexts(s));
 }
 
 TEST(stripexts, test2) {
-  char s[] = "foo/bar.com.dbg";
+  char s[] = "foo/bar.dbg";
   EXPECT_STREQ("bar", stripexts(basename(s)));
 }
 
 TEST(xstripexts, test) {
-  EXPECT_STREQ("foo/bar", gc(xstripexts("foo/bar.com.dbg")));
+  EXPECT_STREQ("foo/bar", gc(xstripexts("foo/bar.dbg")));
 }
 
 TEST(xstripexts, test2) {
-  EXPECT_STREQ("bar", gc(xstripexts(basename("foo/bar.com.dbg"))));
+  EXPECT_STREQ("bar", gc(xstripexts(basename("foo/bar.dbg"))));
 }
diff --git a/test/libc/intrin/BUILD.mk b/test/libc/intrin/BUILD.mk
index 2ff713b43..a81ea4d76 100644
--- a/test/libc/intrin/BUILD.mk
+++ b/test/libc/intrin/BUILD.mk
@@ -10,17 +10,17 @@ TEST_LIBC_INTRIN_OBJS =					\
 	$(TEST_LIBC_INTRIN_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_LIBC_INTRIN_COMS =					\
-	$(TEST_LIBC_INTRIN_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_LIBC_INTRIN_SRCS:%.c=o/$(MODE)/%)
 
 TEST_LIBC_INTRIN_BINS =					\
 	$(TEST_LIBC_INTRIN_COMS)			\
 	$(TEST_LIBC_INTRIN_COMS:%=%.dbg)
 
 TEST_LIBC_INTRIN_TESTS =				\
-	$(TEST_LIBC_INTRIN_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_LIBC_INTRIN_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_LIBC_INTRIN_CHECKS =				\
-	$(TEST_LIBC_INTRIN_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_LIBC_INTRIN_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_LIBC_INTRIN_DIRECTDEPS =				\
 	LIBC_CALLS					\
@@ -50,7 +50,7 @@ o/$(MODE)/test/libc/intrin/intrin.pkg:			\
 		$(TEST_LIBC_INTRIN_OBJS)		\
 		$(foreach x,$(TEST_LIBC_INTRIN_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/intrin/%.com.dbg:			\
+o/$(MODE)/test/libc/intrin/%.dbg:			\
 		$(TEST_LIBC_INTRIN_DEPS)		\
 		o/$(MODE)/test/libc/intrin/%.o		\
 		o/$(MODE)/test/libc/intrin/intrin.pkg	\
@@ -60,7 +60,7 @@ o/$(MODE)/test/libc/intrin/%.com.dbg:			\
 	@$(APELINK)
 
 # Test what happens when *NSYNC isn't linked.
-o/$(MODE)/test/libc/intrin/lock_test.com.dbg:		\
+o/$(MODE)/test/libc/intrin/lock_test.dbg:		\
 		$(TEST_LIBC_INTRIN_DEPS)		\
 		o/$(MODE)/test/libc/intrin/lock_test.o	\
 		o/$(MODE)/test/libc/intrin/intrin.pkg	\
diff --git a/test/libc/intrin/lockscale_test.c b/test/libc/intrin/lockscale_test.c
index c55fa23ec..be97158d5 100644
--- a/test/libc/intrin/lockscale_test.c
+++ b/test/libc/intrin/lockscale_test.c
@@ -31,7 +31,7 @@
  *
  * This test can be run as follows:
  *
- *     make o//test/libc/intrin/lockscale_test.com.runs V=5 TESTARGS=-b
+ *     make o//test/libc/intrin/lockscale_test.runs V=5 TESTARGS=-b
  *
  * It's intended to demonstrate the importance of futexes. On systems
  * that don't have them, this test consumes orders of a magnitude more
diff --git a/test/libc/log/BUILD.mk b/test/libc/log/BUILD.mk
index 1c50379b4..5850736bf 100644
--- a/test/libc/log/BUILD.mk
+++ b/test/libc/log/BUILD.mk
@@ -8,21 +8,21 @@ TEST_LIBC_LOG_SRCS_TEST = $(filter %_test.c,$(TEST_LIBC_LOG_SRCS))
 
 TEST_LIBC_LOG_OBJS =						\
 	$(TEST_LIBC_LOG_SRCS:%.c=o/$(MODE)/%.o)			\
-	o/$(MODE)/test/libc/log/backtrace.com.zip.o		\
-	o/$(MODE)/test/libc/log/backtrace.com.dbg.zip.o
+	o/$(MODE)/test/libc/log/backtrace.zip.o			\
+	o/$(MODE)/test/libc/log/backtrace.dbg.zip.o
 
 TEST_LIBC_LOG_COMS =						\
-	$(TEST_LIBC_LOG_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_LIBC_LOG_SRCS:%.c=o/$(MODE)/%)
 
 TEST_LIBC_LOG_BINS =						\
 	$(TEST_LIBC_LOG_COMS)					\
 	$(TEST_LIBC_LOG_COMS:%=%.dbg)
 
 TEST_LIBC_LOG_TESTS =						\
-	$(TEST_LIBC_LOG_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_LIBC_LOG_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_LIBC_LOG_CHECKS =						\
-	$(TEST_LIBC_LOG_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_LIBC_LOG_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_LIBC_LOG_DIRECTDEPS =					\
 	LIBC_CALLS						\
@@ -47,7 +47,7 @@ o/$(MODE)/test/libc/log/log.pkg:				\
 		$(TEST_LIBC_LOG_OBJS)				\
 		$(foreach x,$(TEST_LIBC_LOG_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/log/%.com.dbg:				\
+o/$(MODE)/test/libc/log/%.dbg:					\
 		$(TEST_LIBC_LOG_DEPS)				\
 		o/$(MODE)/test/libc/log/%.o			\
 		o/$(MODE)/test/libc/log/log.pkg			\
@@ -56,10 +56,10 @@ o/$(MODE)/test/libc/log/%.com.dbg:				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/log/backtrace_test.com.dbg:			\
+o/$(MODE)/test/libc/log/backtrace_test.dbg:			\
 		$(TEST_LIBC_LOG_DEPS)				\
-		o/$(MODE)/test/libc/log/backtrace.com.zip.o	\
-		o/$(MODE)/test/libc/log/backtrace.com.dbg.zip.o	\
+		o/$(MODE)/test/libc/log/backtrace.zip.o		\
+		o/$(MODE)/test/libc/log/backtrace.dbg.zip.o	\
 		o/$(MODE)/test/libc/log/backtrace_test.o	\
 		o/$(MODE)/test/libc/log/log.pkg			\
 		$(LIBC_TESTMAIN)				\
@@ -67,15 +67,15 @@ o/$(MODE)/test/libc/log/backtrace_test.com.dbg:			\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/log/backtrace.com.dbg:			\
+o/$(MODE)/test/libc/log/backtrace.dbg:				\
 		$(TEST_LIBC_LOG_DEPS)				\
 		o/$(MODE)/test/libc/log/backtrace.o		\
 		$(CRT)						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/log/backtrace.com.zip.o			\
-o/$(MODE)/test/libc/log/backtrace.com.dbg.zip.o: private	\
+o/$(MODE)/test/libc/log/backtrace.zip.o				\
+o/$(MODE)/test/libc/log/backtrace.dbg.zip.o: private		\
 		ZIPOBJ_FLAGS +=					\
 			-B
 
diff --git a/test/libc/log/backtrace_test.c b/test/libc/log/backtrace_test.c
index 22ee61e97..409876f45 100644
--- a/test/libc/log/backtrace_test.c
+++ b/test/libc/log/backtrace_test.c
@@ -41,14 +41,14 @@
 #ifdef __x86_64__
 
 #if 0
-__static_yoink("backtrace.com");
-__static_yoink("backtrace.com.dbg");
+__static_yoink("backtrace");
+__static_yoink("backtrace.dbg");
 
 void SetUpOnce(void) {
   testlib_enable_tmp_setup_teardown_once();
   ASSERT_NE(-1, mkdir("bin", 0755));
-  testlib_extract("/zip/backtrace.com", "bin/backtrace.com", 0755);
-  testlib_extract("/zip/backtrace.com.dbg", "bin/backtrace.com.dbg", 0755);
+  testlib_extract("/zip/backtrace", "bin/backtrace", 0755);
+  testlib_extract("/zip/backtrace.dbg", "bin/backtrace.dbg", 0755);
 }
 
 static bool OutputHasSymbol(const char *output, const char *s) {
@@ -56,7 +56,7 @@ static bool OutputHasSymbol(const char *output, const char *s) {
 }
 
 // UNFREED MEMORY
-// o/dbg/test/libc/log/backtrace_test.com
+// o/dbg/test/libc/log/backtrace_test
 // max allocated space            655,360
 // total allocated space               80
 // total free space               327,600
@@ -95,7 +95,7 @@ TEST(ShowCrashReports, testMemoryLeakCrash) {
   if (!pid) {
     dup2(fds[1], 1);
     dup2(fds[1], 2);
-    execv("bin/backtrace.com", (char *const[]){"bin/backtrace.com", "6", 0});
+    execv("bin/backtrace", (char *const[]){"bin/backtrace", "6", 0});
     _Exit(127);
   }
   close(fds[1]);
@@ -126,7 +126,7 @@ TEST(ShowCrashReports, testMemoryLeakCrash) {
 }
 
 // error: Uncaught SIGFPE (FPE_INTDIV) on nightmare pid 11724
-//   /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.com.tmp.11721
+//   /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.tmp.11721
 //   ENOTTY[25]
 //   Linux nightmare SMP Thu, 12 Aug 2021 06:16:45 UTC
 //
@@ -164,9 +164,9 @@ TEST(ShowCrashReports, testMemoryLeakCrash) {
 // /* 22 frames mapped w/ 1,879,015,395 frames gapped */
 //
 // 00400000-0045b000 r-xp 00000000 08:03 4587526
-// /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.com.tmp.11721
+// /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.tmp.11721
 // 0045b000-00461000 rw-p 0005b000 08:03 4587526
-// /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.com.tmp.11721
+// /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.tmp.11721
 // 00461000-004a0000 rw-p 00000000 00:00 0
 // 80070000-80090000 rw-p 00000000 00:00 0
 // e007ffd0000-e0080000000 rw-p 00000000 00:00 0
@@ -176,7 +176,7 @@ TEST(ShowCrashReports, testMemoryLeakCrash) {
 // 7ffe075a8000-7ffe075ab000 r--p 00000000 00:00 0 [vvar]
 // 7ffe075ab000-7ffe075ac000 r-xp 00000000 00:00 0 [vdso]
 //
-// /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.com.tmp.11721 1
+// /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.tmp.11721 1
 TEST(ShowCrashReports, testDivideByZero) {
   size_t got;
   ssize_t rc;
@@ -187,7 +187,7 @@ TEST(ShowCrashReports, testDivideByZero) {
   if (!pid) {
     dup2(fds[1], 1);
     dup2(fds[1], 2);
-    execv("bin/backtrace.com", (char *const[]){"bin/backtrace.com", "1", 0});
+    execv("bin/backtrace", (char *const[]){"bin/backtrace", "1", 0});
     _Exit(127);
   }
   close(fds[1]);
@@ -312,7 +312,7 @@ TEST(ShowCrashReports, testBssOverrunCrash) {
   if (!pid) {
     dup2(fds[1], 1);
     dup2(fds[1], 2);
-    execv("bin/backtrace.com", (char *const[]){"bin/backtrace.com", "2", 0});
+    execv("bin/backtrace", (char *const[]){"bin/backtrace", "2", 0});
     _Exit(127);
   }
   close(fds[1]);
@@ -387,7 +387,7 @@ TEST(ShowCrashReports, testNpeCrash) {
   if (!pid) {
     dup2(fds[1], 1);
     dup2(fds[1], 2);
-    execv("bin/backtrace.com", (char *const[]){"bin/backtrace.com", "7", 0});
+    execv("bin/backtrace", (char *const[]){"bin/backtrace", "7", 0});
     _Exit(127);
   }
   close(fds[1]);
@@ -431,7 +431,7 @@ TEST(ShowCrashReports, testDataOverrunCrash) {
   if (!pid) {
     dup2(fds[1], 1);
     dup2(fds[1], 2);
-    execv("bin/backtrace.com", (char *const[]){"bin/backtrace.com", "4", 0});
+    execv("bin/backtrace", (char *const[]){"bin/backtrace", "4", 0});
     _Exit(127);
   }
   close(fds[1]);
@@ -479,7 +479,7 @@ TEST(ShowCrashReports, testNpeCrashAfterFinalize) {
   if (!pid) {
     dup2(fds[1], 1);
     dup2(fds[1], 2);
-    execv("bin/backtrace.com", (char *const[]){"bin/backtrace.com", "8", 0});
+    execv("bin/backtrace", (char *const[]){"bin/backtrace", "8", 0});
     _Exit(127);
   }
   close(fds[1]);
diff --git a/test/libc/mem/BUILD.mk b/test/libc/mem/BUILD.mk
index 7a746c041..44385da00 100644
--- a/test/libc/mem/BUILD.mk
+++ b/test/libc/mem/BUILD.mk
@@ -13,20 +13,20 @@ TEST_LIBC_MEM_OBJS =						\
 	$(TEST_LIBC_MEM_SRCS_CC:%.cc=o/$(MODE)/%.o)
 
 TEST_LIBC_MEM_COMS =						\
-	$(TEST_LIBC_MEM_SRCS_C:%.c=o/$(MODE)/%.com)		\
-	$(TEST_LIBC_MEM_SRCS_CC:%.cc=o/$(MODE)/%.com)
+	$(TEST_LIBC_MEM_SRCS_C:%.c=o/$(MODE)/%)			\
+	$(TEST_LIBC_MEM_SRCS_CC:%.cc=o/$(MODE)/%)
 
 TEST_LIBC_MEM_BINS =						\
 	$(TEST_LIBC_MEM_COMS)					\
 	$(TEST_LIBC_MEM_COMS:%=%.dbg)
 
 TEST_LIBC_MEM_TESTS =						\
-	$(TEST_LIBC_MEM_SRCS_C:%.c=o/$(MODE)/%.com.ok)		\
-	$(TEST_LIBC_MEM_SRCS_CC:%.cc=o/$(MODE)/%.com.ok)
+	$(TEST_LIBC_MEM_SRCS_C:%.c=o/$(MODE)/%.ok)		\
+	$(TEST_LIBC_MEM_SRCS_CC:%.cc=o/$(MODE)/%.ok)
 
 TEST_LIBC_MEM_CHECKS =						\
-	$(TEST_LIBC_MEM_SRCS_C:%.c=o/$(MODE)/%.com.runs)	\
-	$(TEST_LIBC_MEM_SRCS_CC:%.cc=o/$(MODE)/%.com.runs)
+	$(TEST_LIBC_MEM_SRCS_C:%.c=o/$(MODE)/%.runs)		\
+	$(TEST_LIBC_MEM_SRCS_CC:%.cc=o/$(MODE)/%.runs)
 
 TEST_LIBC_MEM_DIRECTDEPS =					\
 	LIBC_CALLS						\
@@ -55,7 +55,7 @@ o/$(MODE)/test/libc/mem/mem.pkg:				\
 		$(TEST_LIBC_MEM_OBJS)				\
 		$(foreach x,$(TEST_LIBC_MEM_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/mem/%.com.dbg:				\
+o/$(MODE)/test/libc/mem/%.dbg:					\
 		$(TEST_LIBC_MEM_DEPS)				\
 		o/$(MODE)/test/libc/mem/%.o			\
 		o/$(MODE)/test/libc/mem/mem.pkg			\
@@ -74,7 +74,7 @@ o/$(MODE)/test/libc/mem/prog/sock.o:				\
 
 ################################################################################
 
-o/$(MODE)/test/libc/mem/prog/life.com.dbg:			\
+o/$(MODE)/test/libc/mem/prog/life.dbg:				\
 		$(LIBC_RUNTIME)					\
 		o/$(MODE)/test/libc/mem/prog/life.o		\
 		$(CRT)						\
@@ -82,14 +82,14 @@ o/$(MODE)/test/libc/mem/prog/life.com.dbg:			\
 	@$(APELINK)
 
 o/$(MODE)/test/libc/mem/prog/life.elf:				\
-		o/$(MODE)/tool/build/assimilate.com		\
-		o/$(MODE)/test/libc/mem/prog/life.com
+		o/$(MODE)/tool/build/assimilate			\
+		o/$(MODE)/test/libc/mem/prog/life
 	@$(COMPILE) -wACP -T$@					\
-		build/bootstrap/cp.com				\
-		o/$(MODE)/test/libc/mem/prog/life.com		\
+		build/bootstrap/cp				\
+		o/$(MODE)/test/libc/mem/prog/life		\
 		o/$(MODE)/test/libc/mem/prog/life.elf
 	@$(COMPILE) -wAASSIMILATE -T$@				\
-		o/$(MODE)/tool/build/assimilate.com -bcef	\
+		o/$(MODE)/tool/build/assimilate -bcef		\
 		o/$(MODE)/test/libc/mem/prog/life.elf
 
 o/$(MODE)/test/libc/mem/prog/life.elf.zip.o: private		\
@@ -98,13 +98,13 @@ o/$(MODE)/test/libc/mem/prog/life.elf.zip.o: private		\
 
 ################################################################################
 
-o/$(MODE)/test/libc/mem/prog/life.com.zip.o: private		\
+o/$(MODE)/test/libc/mem/prog/life.zip.o: private		\
 		ZIPOBJ_FLAGS +=					\
 			-B
 
 ################################################################################
 
-o/$(MODE)/test/libc/mem/prog/sock.com.dbg:			\
+o/$(MODE)/test/libc/mem/prog/sock.dbg:				\
 		$(LIBC_RUNTIME)					\
 		$(LIBC_SOCK)					\
 		o/$(MODE)/test/libc/mem/prog/sock.o		\
@@ -113,14 +113,14 @@ o/$(MODE)/test/libc/mem/prog/sock.com.dbg:			\
 	@$(APELINK)
 
 o/$(MODE)/test/libc/mem/prog/sock.elf:				\
-		o/$(MODE)/tool/build/assimilate.com		\
-		o/$(MODE)/test/libc/mem/prog/sock.com
+		o/$(MODE)/tool/build/assimilate			\
+		o/$(MODE)/test/libc/mem/prog/sock
 	@$(COMPILE) -wACP -T$@					\
-		build/bootstrap/cp.com				\
-		o/$(MODE)/test/libc/mem/prog/sock.com		\
+		build/bootstrap/cp				\
+		o/$(MODE)/test/libc/mem/prog/sock		\
 		o/$(MODE)/test/libc/mem/prog/sock.elf
 	@$(COMPILE) -wAASSIMILATE -T$@				\
-		o/$(MODE)/tool/build/assimilate.com -cef	\
+		o/$(MODE)/tool/build/assimilate -cef		\
 		o/$(MODE)/test/libc/mem/prog/sock.elf
 
 o/$(MODE)/test/libc/mem/prog/sock.elf.zip.o: private		\
diff --git a/test/libc/nexgen32e/BUILD.mk b/test/libc/nexgen32e/BUILD.mk
index e586271e6..d2f4d4f83 100644
--- a/test/libc/nexgen32e/BUILD.mk
+++ b/test/libc/nexgen32e/BUILD.mk
@@ -12,17 +12,17 @@ TEST_LIBC_NEXGEN32E_OBJS =					\
 	$(TEST_LIBC_NEXGEN32E_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_LIBC_NEXGEN32E_COMS =					\
-	$(TEST_LIBC_NEXGEN32E_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_LIBC_NEXGEN32E_SRCS:%.c=o/$(MODE)/%)
 
 TEST_LIBC_NEXGEN32E_BINS =					\
 	$(TEST_LIBC_NEXGEN32E_COMS)				\
 	$(TEST_LIBC_NEXGEN32E_COMS:%=%.dbg)
 
 TEST_LIBC_NEXGEN32E_TESTS =					\
-	$(TEST_LIBC_NEXGEN32E_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_LIBC_NEXGEN32E_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_LIBC_NEXGEN32E_CHECKS =					\
-	$(TEST_LIBC_NEXGEN32E_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_LIBC_NEXGEN32E_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_LIBC_NEXGEN32E_DIRECTDEPS =				\
 	LIBC_CALLS						\
@@ -48,7 +48,7 @@ o/$(MODE)/test/libc/nexgen32e/nexgen32e.pkg:			\
 		$(TEST_LIBC_NEXGEN32E_OBJS)			\
 		$(foreach x,$(TEST_LIBC_NEXGEN32E_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/nexgen32e/%.com.dbg:			\
+o/$(MODE)/test/libc/nexgen32e/%.dbg:				\
 		$(TEST_LIBC_NEXGEN32E_DEPS)			\
 		o/$(MODE)/test/libc/nexgen32e/%.o		\
 		o/$(MODE)/test/libc/nexgen32e/nexgen32e.pkg	\
@@ -58,10 +58,10 @@ o/$(MODE)/test/libc/nexgen32e/%.com.dbg:			\
 	@$(APELINK)
 
 # we can't run this test on openbsd because rwx memory isn't allowed
-o/$(MODE)/test/libc/nexgen32e/stackrwx_test.com.ok:		\
-		o/$(MODE)/tool/build/runit.com			\
-		o/$(MODE)/tool/build/runitd.com			\
-		o/$(MODE)/test/libc/nexgen32e/stackrwx_test.com
+o/$(MODE)/test/libc/nexgen32e/stackrwx_test.ok:			\
+		o/$(MODE)/tool/build/runit			\
+		o/$(MODE)/tool/build/runitd			\
+		o/$(MODE)/test/libc/nexgen32e/stackrwx_test
 	@$(COMPILE) -wATEST -tT$@ $^ $(filter-out openbsd,$(HOSTS))
 
 $(TEST_LIBC_NEXGEN32E_OBJS): private				\
diff --git a/test/libc/proc/BUILD.mk b/test/libc/proc/BUILD.mk
index fb3aaa887..11f37d91d 100644
--- a/test/libc/proc/BUILD.mk
+++ b/test/libc/proc/BUILD.mk
@@ -6,90 +6,90 @@ PKGS += TEST_LIBC_PROC
 TEST_LIBC_PROC_SRCS := $(wildcard test/libc/proc/*.c)
 TEST_LIBC_PROC_SRCS_TEST = $(filter %_test.c,$(TEST_LIBC_PROC_SRCS))
 
-TEST_LIBC_PROC_OBJS =						\
+TEST_LIBC_PROC_OBJS =							\
 	$(TEST_LIBC_PROC_SRCS:%.c=o/$(MODE)/%.o)
 
-TEST_LIBC_PROC_COMS =						\
-	$(TEST_LIBC_PROC_SRCS:%.c=o/$(MODE)/%.com)
+TEST_LIBC_PROC_COMS =							\
+	$(TEST_LIBC_PROC_SRCS:%.c=o/$(MODE)/%)
 
-TEST_LIBC_PROC_BINS =						\
-	$(TEST_LIBC_PROC_COMS)					\
+TEST_LIBC_PROC_BINS =							\
+	$(TEST_LIBC_PROC_COMS)						\
 	$(TEST_LIBC_PROC_COMS:%=%.dbg)
 
-TEST_LIBC_PROC_TESTS =						\
-	$(TEST_LIBC_PROC_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+TEST_LIBC_PROC_TESTS =							\
+	$(TEST_LIBC_PROC_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
-TEST_LIBC_PROC_CHECKS =					\
-	$(TEST_LIBC_PROC_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+TEST_LIBC_PROC_CHECKS =							\
+	$(TEST_LIBC_PROC_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
-TEST_LIBC_PROC_DIRECTDEPS =					\
-	LIBC_CALLS						\
-	LIBC_FMT						\
-	LIBC_INTRIN						\
-	LIBC_MEM						\
-	LIBC_NEXGEN32E						\
-	LIBC_NT_KERNEL32					\
-	LIBC_RUNTIME						\
-	LIBC_PROC						\
-	LIBC_STR						\
-	LIBC_SYSV						\
-	LIBC_TESTLIB						\
-	LIBC_THREAD						\
-	LIBC_X							\
-	THIRD_PARTY_MUSL					\
+TEST_LIBC_PROC_DIRECTDEPS =						\
+	LIBC_CALLS							\
+	LIBC_FMT							\
+	LIBC_INTRIN							\
+	LIBC_MEM							\
+	LIBC_NEXGEN32E							\
+	LIBC_NT_KERNEL32						\
+	LIBC_RUNTIME							\
+	LIBC_PROC							\
+	LIBC_STR							\
+	LIBC_SYSV							\
+	LIBC_TESTLIB							\
+	LIBC_THREAD							\
+	LIBC_X								\
+	THIRD_PARTY_MUSL						\
 	THIRD_PARTY_TR
 
-TEST_LIBC_PROC_DEPS :=						\
+TEST_LIBC_PROC_DEPS :=							\
 	$(call uniq,$(foreach x,$(TEST_LIBC_PROC_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/test/libc/proc/proc.pkg:				\
-		$(TEST_LIBC_PROC_OBJS)				\
+o/$(MODE)/test/libc/proc/proc.pkg:					\
+		$(TEST_LIBC_PROC_OBJS)					\
 		$(foreach x,$(TEST_LIBC_PROC_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/proc/%.com.dbg:				\
-		$(TEST_LIBC_PROC_DEPS)				\
-		o/$(MODE)/test/libc/proc/%.o			\
-		o/$(MODE)/test/libc/proc/proc.pkg		\
-		o/$(MODE)/tool/build/echo.com.zip.o		\
-		$(LIBC_TESTMAIN)				\
-		$(CRT)						\
+o/$(MODE)/test/libc/proc/%.dbg:						\
+		$(TEST_LIBC_PROC_DEPS)					\
+		o/$(MODE)/test/libc/proc/%.o				\
+		o/$(MODE)/test/libc/proc/proc.pkg			\
+		o/$(MODE)/tool/build/echo.zip.o				\
+		$(LIBC_TESTMAIN)					\
+		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/proc/posix_spawn_test.com.runs:		\
+o/$(MODE)/test/libc/proc/posix_spawn_test.runs:				\
 		private QUOTA += -M8192m
 
-o/$(MODE)/test/libc/proc/posix_spawn_test.com.dbg:		\
-		$(TEST_LIBC_PROC_DEPS)				\
-		o/$(MODE)/test/libc/proc/posix_spawn_test.o	\
-		o/$(MODE)/test/libc/proc/proc.pkg		\
-		o/$(MODE)/tool/build/echo.com.zip.o		\
-		o/$(MODE)/tool/build/cocmd.com.zip.o		\
-		o/$(MODE)/test/libc/mem/prog/life.com.zip.o	\
-		o/$(MODE)/test/libc/mem/prog/life.elf.zip.o	\
-		o/$(MODE)/test/libc/proc/life-pe.com.zip.o	\
-		$(LIBC_TESTMAIN)				\
-		$(CRT)						\
+o/$(MODE)/test/libc/proc/posix_spawn_test.dbg:				\
+		$(TEST_LIBC_PROC_DEPS)					\
+		o/$(MODE)/test/libc/proc/posix_spawn_test.o		\
+		o/$(MODE)/test/libc/proc/proc.pkg			\
+		o/$(MODE)/tool/build/echo.zip.o				\
+		o/$(MODE)/tool/build/cocmd.zip.o			\
+		o/$(MODE)/test/libc/mem/prog/life.zip.o			\
+		o/$(MODE)/test/libc/mem/prog/life.elf.zip.o		\
+		o/$(MODE)/test/libc/proc/life-pe.zip.o			\
+		$(LIBC_TESTMAIN)					\
+		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/proc/system_test.com.dbg:			\
-		$(TEST_LIBC_PROC_DEPS)				\
-		o/$(MODE)/test/libc/proc/system_test.o		\
-		o/$(MODE)/test/libc/proc/proc.pkg		\
-		o/$(MODE)/tool/build/echo.com.zip.o		\
-		o/$(MODE)/tool/build/cocmd.com.zip.o		\
-		o/$(MODE)/tool/build/false.com.zip.o		\
-		$(LIBC_TESTMAIN)				\
-		$(CRT)						\
+o/$(MODE)/test/libc/proc/system_test.dbg:				\
+		$(TEST_LIBC_PROC_DEPS)					\
+		o/$(MODE)/test/libc/proc/system_test.o			\
+		o/$(MODE)/test/libc/proc/proc.pkg			\
+		o/$(MODE)/tool/build/echo.zip.o				\
+		o/$(MODE)/tool/build/cocmd.zip.o			\
+		o/$(MODE)/tool/build/false.zip.o			\
+		$(LIBC_TESTMAIN)					\
+		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/proc/execve_test.com.dbg:				\
+o/$(MODE)/test/libc/proc/execve_test.dbg:				\
 		$(TEST_LIBC_PROC_DEPS)					\
 		o/$(MODE)/test/libc/proc/execve_test.o			\
-		o/$(MODE)/test/libc/calls/life-nomod.com.zip.o		\
-		o/$(MODE)/test/libc/proc/execve_test_prog1.com.zip.o	\
+		o/$(MODE)/test/libc/calls/life-nomod.zip.o		\
+		o/$(MODE)/test/libc/proc/execve_test_prog1.zip.o	\
 		o/$(MODE)/test/libc/mem/prog/life.elf.zip.o		\
 		o/$(MODE)/test/libc/mem/prog/sock.elf.zip.o		\
 		o/$(MODE)/test/libc/proc/proc.pkg			\
@@ -98,26 +98,26 @@ o/$(MODE)/test/libc/proc/execve_test.com.dbg:				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/proc/fexecve_test.com.dbg:				\
+o/$(MODE)/test/libc/proc/fexecve_test.dbg:				\
 		$(TEST_LIBC_PROC_DEPS)					\
-		o/$(MODE)/test/libc/proc/fexecve_test.o		\
+		o/$(MODE)/test/libc/proc/fexecve_test.o			\
 		o/$(MODE)/test/libc/proc/proc.pkg			\
 		o/$(MODE)/test/libc/mem/prog/life.elf.zip.o		\
-		o/$(MODE)/test/libc/calls/life-nomod.com.zip.o		\
-		o/$(MODE)/test/libc/calls/zipread.com.zip.o		\
+		o/$(MODE)/test/libc/calls/life-nomod.zip.o		\
+		o/$(MODE)/test/libc/calls/zipread.zip.o			\
 		$(LIBC_TESTMAIN)					\
 		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/proc/execve_test_prog1.com.zip.o		\
-o/$(MODE)/test/libc/proc/life-pe.com.zip.o: private		\
-		ZIPOBJ_FLAGS +=					\
+o/$(MODE)/test/libc/proc/execve_test_prog1.zip.o			\
+o/$(MODE)/test/libc/proc/life-pe.zip.o: private				\
+		ZIPOBJ_FLAGS +=						\
 			-B
 
 $(TEST_LIBC_PROC_OBJS): test/libc/proc/BUILD.mk
 
 .PHONY: o/$(MODE)/test/libc/proc
-o/$(MODE)/test/libc/proc:					\
-		$(TEST_LIBC_PROC_BINS)				\
+o/$(MODE)/test/libc/proc:						\
+		$(TEST_LIBC_PROC_BINS)					\
 		$(TEST_LIBC_PROC_CHECKS)
diff --git a/test/libc/proc/execve_test.c b/test/libc/proc/execve_test.c
index 1d7b10bf4..bd323958d 100644
--- a/test/libc/proc/execve_test.c
+++ b/test/libc/proc/execve_test.c
@@ -51,8 +51,8 @@ void GenBuf(char buf[8], int x) {
 TEST(execve, testArgPassing) {
   int i;
   char ibuf[12], buf[8];
-  const char *prog = "./execve_test_prog1.com";
-  testlib_extract("/zip/execve_test_prog1.com", prog, 0755);
+  const char *prog = "./execve_test_prog1";
+  testlib_extract("/zip/execve_test_prog1", prog, 0755);
   for (i = 0; i < N; ++i) {
     FormatInt32(ibuf, i);
     GenBuf(buf, i);
@@ -84,12 +84,12 @@ TEST(execve, ziposAPE) {
   if (IsFreebsd()) return;                        // TODO: fixme on freebsd
   if (IsLinux() && !__is_linux_2_6_23()) return;  // TODO: fixme on old linux
   if (!IsLinux() && !IsFreebsd()) {
-    EXPECT_EQ(-1, execve("/zip/life-nomod.com", (char *const[]){0},
-                         (char *const[]){0}));
+    EXPECT_EQ(
+        -1, execve("/zip/life-nomod", (char *const[]){0}, (char *const[]){0}));
     return;
   }
   SPAWN(fork);
-  execve("/zip/life-nomod.com", (char *const[]){0}, (char *const[]){0});
+  execve("/zip/life-nomod", (char *const[]){0}, (char *const[]){0});
   kprintf("execve failed: %m\n");
   EXITS(42);
 }
diff --git a/test/libc/proc/fexecve_test.c b/test/libc/proc/fexecve_test.c
index 5c733b935..12f0ed20b 100644
--- a/test/libc/proc/fexecve_test.c
+++ b/test/libc/proc/fexecve_test.c
@@ -102,9 +102,9 @@ TEST(fexecve, memfd_create) {
 
 TEST(fexecve, APE) {
   if (!IsLinux() && !IsFreebsd()) return;
-  testlib_extract("/zip/life-nomod.com", "life-nomod.com", 0555);
+  testlib_extract("/zip/life-nomod", "life-nomod", 0555);
   SPAWN(fork);
-  int fd = open("life-nomod.com", O_RDONLY);
+  int fd = open("life-nomod", O_RDONLY);
   ASSERT_NE(-1, fd);
   fexecve(fd, (char *const[]){0}, (char *const[]){0});
   EXITS(42);
@@ -112,9 +112,9 @@ TEST(fexecve, APE) {
 
 TEST(fexecve, APE_cloexec) {
   if (!IsLinux() && !IsFreebsd()) return;
-  testlib_extract("/zip/life-nomod.com", "life-nomod.com", 0555);
+  testlib_extract("/zip/life-nomod", "life-nomod", 0555);
   SPAWN(fork);
-  int fd = open("life-nomod.com", O_RDONLY | O_CLOEXEC);
+  int fd = open("life-nomod", O_RDONLY | O_CLOEXEC);
   ASSERT_NE(-1, fd);
   fexecve(fd, (char *const[]){0}, (char *const[]){0});
   EXITS(42);
@@ -132,7 +132,7 @@ TEST(fexecve, zipos) {
 
 TEST(fexecve, ziposAPE) {
   if (!IsLinux() && !IsFreebsd()) return;
-  int fd = open("/zip/life-nomod.com", O_RDONLY);
+  int fd = open("/zip/life-nomod", O_RDONLY);
   ASSERT_NE(-1, fd);
   SPAWN(fork);
   fexecve(fd, (char *const[]){0}, (char *const[]){0});
@@ -143,7 +143,7 @@ TEST(fexecve, ziposAPE) {
 TEST(fexecve, ziposAPEHasZipos) {
   if (1) return; // TODO: fixme
   if (!IsLinux() && !IsFreebsd()) return;
-  int fd = open("/zip/zipread.com", O_RDONLY);
+  int fd = open("/zip/zipread", O_RDONLY);
   ASSERT_NE(-1, fd);
   SPAWN(fork);
   ASSERT_NE(-1, fd);
diff --git a/test/libc/proc/getpriority_test.c b/test/libc/proc/getpriority_test.c
index 1f9315210..024dcfd9f 100644
--- a/test/libc/proc/getpriority_test.c
+++ b/test/libc/proc/getpriority_test.c
@@ -29,7 +29,7 @@
 
 void SetUp(void) {
   if (getpriority(PRIO_PROCESS, getpid()) != 0) {
-    kprintf("getpriority_test.com must be launched at priority zero\n");
+    kprintf("getpriority_test must be launched at priority zero\n");
     exit(0);
   }
 }
diff --git a/test/libc/proc/life-pe.com b/test/libc/proc/life-pe
similarity index 100%
rename from test/libc/proc/life-pe.com
rename to test/libc/proc/life-pe
diff --git a/test/libc/proc/posix_spawn_test.c b/test/libc/proc/posix_spawn_test.c
index 046710146..16294928e 100644
--- a/test/libc/proc/posix_spawn_test.c
+++ b/test/libc/proc/posix_spawn_test.c
@@ -118,10 +118,10 @@ TEST(posix_spawn, self) {
 
 TEST(posix_spawn, ape) {
   int ws, pid;
-  char *prog = "./life.com";
+  char *prog = "./life";
   char *args[] = {prog, 0};
   char *envs[] = {0};
-  testlib_extract("/zip/life.com", prog, 0755);
+  testlib_extract("/zip/life", prog, 0755);
   ASSERT_EQ(0, posix_spawn(&pid, prog, NULL, NULL, args, envs));
   ASSERT_NE(-1, waitpid(pid, &ws, 0));
   ASSERT_TRUE(WIFEXITED(ws));
@@ -145,9 +145,9 @@ TEST(posix_spawn, elf) {
 TEST(posix_spawn, pipe) {
   char buf[10];
   int p[2], pid, status;
-  const char *pn = "./echo.com";
+  const char *pn = "./echo";
   posix_spawn_file_actions_t fa;
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
+  testlib_extract("/zip/echo", "echo", 0755);
   ASSERT_SYS(0, 0, pipe(p));
   ASSERT_EQ(0, posix_spawn_file_actions_init(&fa));
   ASSERT_EQ(0, posix_spawn_file_actions_addclose(&fa, p[0]));
@@ -165,17 +165,17 @@ TEST(posix_spawn, pipe) {
 TEST(posix_spawn, chdir) {
   int ws, pid, p[2];
   char buf[16] = {0};
-  char *args[] = {"cocmd.com", "-c", "cat hello.txt", 0};
+  char *args[] = {"cocmd", "-c", "cat hello.txt", 0};
   char *envs[] = {0};
   posix_spawn_file_actions_t fa;
-  testlib_extract("/zip/cocmd.com", "cocmd.com", 0755);
+  testlib_extract("/zip/cocmd", "cocmd", 0755);
   ASSERT_SYS(0, 0, mkdir("subdir", 0777));
   ASSERT_SYS(0, 0, xbarf("subdir/hello.txt", "hello\n", -1));
   ASSERT_SYS(0, 0, pipe2(p, O_CLOEXEC));
   ASSERT_EQ(0, posix_spawn_file_actions_init(&fa));
   ASSERT_EQ(0, posix_spawn_file_actions_adddup2(&fa, p[1], 1));
   ASSERT_EQ(0, posix_spawn_file_actions_addchdir_np(&fa, "subdir"));
-  ASSERT_EQ(0, posix_spawn(&pid, "../cocmd.com", &fa, 0, args, envs));
+  ASSERT_EQ(0, posix_spawn(&pid, "../cocmd", &fa, 0, args, envs));
   ASSERT_EQ(0, posix_spawn_file_actions_destroy(&fa));
   ASSERT_SYS(0, 0, close(p[1]));
   ASSERT_NE(-1, waitpid(pid, &ws, 0));
@@ -201,8 +201,8 @@ TEST(posix_spawn, torture) {
   posix_spawn_file_actions_t fa;
   signal(SIGUSR2, OhMyGoth);
   sigfillset(&allsig);
-  if (!fileexists("echo.com")) {
-    testlib_extract("/zip/echo.com", "echo.com", 0755);
+  if (!fileexists("echo")) {
+    testlib_extract("/zip/echo", "echo", 0755);
   }
   // XXX: NetBSD doesn't seem to let us set the scheduler to itself ;_;
   ASSERT_EQ(0, posix_spawnattr_init(&attr));
@@ -220,10 +220,10 @@ TEST(posix_spawn, torture) {
   for (int i = 0; i < n; ++i) {
     char *volatile zzz = malloc(13);
     volatile int fd = open("/dev/null", O_WRONLY);
-    char *args[] = {"./echo.com", NULL};
+    char *args[] = {"./echo", NULL};
     char *envs[] = {NULL};
     raise(SIGUSR2);
-    ASSERT_EQ(0, posix_spawn(&pid, "./echo.com", &fa, &attr, args, envs));
+    ASSERT_EQ(0, posix_spawn(&pid, "./echo", &fa, &attr, args, envs));
     ASSERT_FALSE(__vforked);
     ASSERT_NE(-1, waitpid(pid, &ws, 0));
     EXPECT_FALSE(WIFSIGNALED(ws));
@@ -246,7 +246,7 @@ void *Torturer(void *arg) {
 TEST(posix_spawn, agony) {
   int i, n = 4;
   pthread_t *t = gc(malloc(sizeof(pthread_t) * n));
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
+  testlib_extract("/zip/echo", "echo", 0755);
   for (i = 0; i < n; ++i) {
     ASSERT_EQ(0, pthread_create(t + i, 0, Torturer, 0));
   }
@@ -264,11 +264,11 @@ TEST(posix_spawn, etxtbsy) {
   if (IsNetbsd()) return;   // they don't appear impacted by this race condition
   if (IsOpenbsd()) return;  // they don't appear impacted by this race condition
   int ws, me, pid, thief;
-  char *prog = "./life.com";
+  char *prog = "./life";
   char *args[] = {prog, 0};
   char *envs[] = {0};
   sigset_t ss, old;
-  testlib_extract("/zip/life.com", prog, 0755);
+  testlib_extract("/zip/life", prog, 0755);
   for (int i = 0; i < 2; ++i) {
     sigemptyset(&ss);
     sigaddset(&ss, SIGUSR1);
@@ -382,22 +382,21 @@ BENCH(posix_spawn, bench) {
   creat("tiny64", 0755);
   write(3, kTinyLinuxExit, 128);
   close(3);
-  testlib_extract("/zip/life.com", "life.com", 0755);
+  testlib_extract("/zip/life", "life", 0755);
   testlib_extract("/zip/life.elf", "life.elf", 0755);
-  testlib_extract("/zip/life-pe.com", "life-pe.com", 0755);
+  testlib_extract("/zip/life-pe", "life-pe", 0755);
   kprintf("%s %s (MODE=" MODE
-          " rss=%'zu tiny64=%'zu life.com=%'zu life.elf=%'zu)\n",
+          " rss=%'zu tiny64=%'zu life=%'zu life.elf=%'zu)\n",
           __describe_os(), GetHost(), GetRss(), GetSize("tiny64"),
-          GetSize("life.com"), GetSize("life.elf"));
-  ForkExecveWait("./life.com");
-  EZBENCH2("posix_spawn life.com", donothing, PosixSpawnWait("./life.com"));
-  EZBENCH2("vfork life.com", donothing, VforkExecveWait("./life.com"));
-  EZBENCH2("fork life.com", donothing, ForkExecveWait("./life.com"));
+          GetSize("life"), GetSize("life.elf"));
+  ForkExecveWait("./life");
+  EZBENCH2("posix_spawn life", donothing, PosixSpawnWait("./life"));
+  EZBENCH2("vfork life", donothing, VforkExecveWait("./life"));
+  EZBENCH2("fork life", donothing, ForkExecveWait("./life"));
   if (IsWindows()) {
-    EZBENCH2("posix_spawn life-pe.com", donothing,
-             PosixSpawnWait("./life-pe.com"));
-    EZBENCH2("vfork life-pe.com", donothing, VforkExecveWait("./life-pe.com"));
-    EZBENCH2("fork life-pe.com", donothing, ForkExecveWait("./life-pe.com"));
+    EZBENCH2("posix_spawn life-pe", donothing, PosixSpawnWait("./life-pe"));
+    EZBENCH2("vfork life-pe", donothing, VforkExecveWait("./life-pe"));
+    EZBENCH2("fork life-pe", donothing, ForkExecveWait("./life-pe"));
   }
   if (IsXnu() || IsWindows() || IsMetal()) return;
   EZBENCH2("posix_spawn life.elf", donothing, PosixSpawnWait("./life.elf"));
diff --git a/test/libc/proc/system_test.c b/test/libc/proc/system_test.c
index 70d2ae73d..9d719e6bb 100644
--- a/test/libc/proc/system_test.c
+++ b/test/libc/proc/system_test.c
@@ -21,7 +21,6 @@
 #include "libc/dce.h"
 #include "libc/intrin/kprintf.h"
 #include "libc/mem/gc.h"
-#include "libc/mem/gc.h"
 #include "libc/paths.h"
 #include "libc/runtime/runtime.h"
 #include "libc/stdio/stdio.h"
@@ -81,14 +80,14 @@ TEST(system, exit) {
 }
 
 TEST(system, testStdoutRedirect) {
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
-  ASSERT_EQ(0, system("./echo.com hello >hello.txt"));
+  testlib_extract("/zip/echo", "echo", 0755);
+  ASSERT_EQ(0, system("./echo hello >hello.txt"));
   EXPECT_STREQ("hello\n", gc(xslurp("hello.txt", 0)));
 }
 
 TEST(system, testStdoutRedirect_withSpacesInFilename) {
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
-  ASSERT_EQ(0, system("./echo.com hello >\"hello there.txt\""));
+  testlib_extract("/zip/echo", "echo", 0755);
+  ASSERT_EQ(0, system("./echo hello >\"hello there.txt\""));
   EXPECT_STREQ("hello\n", gc(xslurp("hello there.txt", 0)));
 }
 
@@ -109,10 +108,10 @@ TEST(system, testStderrRedirect_toStdout) {
   buf[1] = 0;
   buf[2] = 0;
   buf[3] = 0;
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
+  testlib_extract("/zip/echo", "echo", 0755);
   ASSERT_NE(-1, dup2(1, 2));
   success = false;
-  if (GETEXITSTATUS(system("./echo.com aaa 2>&1")) == 0) {
+  if (GETEXITSTATUS(system("./echo aaa 2>&1")) == 0) {
     success = read(pipefd[0], buf, 4) == (4);
   }
   ASSERT_NE(-1, dup2(stderrBack, 2));
@@ -176,17 +175,17 @@ TEST(system, kill) {
 }
 
 TEST(system, exitStatusPreservedAfterSemiColon) {
-  testlib_extract("/zip/false.com", "false.com", 0755);
+  testlib_extract("/zip/false", "false", 0755);
   ASSERT_EQ(1, GETEXITSTATUS(system("false;")));
   ASSERT_EQ(1, GETEXITSTATUS(system("false; ")));
-  ASSERT_EQ(1, GETEXITSTATUS(system("./false.com;")));
-  ASSERT_EQ(1, GETEXITSTATUS(system("./false.com;")));
+  ASSERT_EQ(1, GETEXITSTATUS(system("./false;")));
+  ASSERT_EQ(1, GETEXITSTATUS(system("./false;")));
   CaptureStdout();
   ASSERT_EQ(0, GETEXITSTATUS(system("false; echo $?")));
   char buf[9] = {0};
   ASSERT_EQ(2, read(pipefd[0], buf, 8));
   ASSERT_STREQ("1\n", buf);
-  ASSERT_EQ(0, GETEXITSTATUS(system("./false.com; echo $?")));
+  ASSERT_EQ(0, GETEXITSTATUS(system("./false; echo $?")));
   ASSERT_EQ(2, read(pipefd[0], buf, 8));
   ASSERT_STREQ("1\n", buf);
   ASSERT_EQ(0, GETEXITSTATUS(system("echo -n hi")));
@@ -222,17 +221,17 @@ TEST(system, allowsLoneCloseCurlyBrace) {
   ASSERT_EQ(5, read(pipefd[0], buf, 5));
   ASSERT_STREQ("aaa}\n", buf);
   bzero(buf, 6);
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
-  ASSERT_EQ(0, GETEXITSTATUS(system("./echo.com \"aaa\"}")));
+  testlib_extract("/zip/echo", "echo", 0755);
+  ASSERT_EQ(0, GETEXITSTATUS(system("./echo \"aaa\"}")));
   ASSERT_EQ(5, read(pipefd[0], buf, 5));
   ASSERT_STREQ("aaa}\n", buf);
   RestoreStdout();
 }
 
 TEST(system, glob) {
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
-  ASSERT_EQ(0, system("./ec*.com aaa"));
-  ASSERT_EQ(0, system("./ec?o.com aaa"));
+  testlib_extract("/zip/echo", "echo", 0755);
+  ASSERT_EQ(0, system("./ec* aaa"));
+  ASSERT_EQ(0, system("./ec?o aaa"));
 }
 
 TEST(system, env) {
@@ -253,8 +252,8 @@ TEST(system, env) {
 TEST(system, pipelineCanOutputToFile) {
   ASSERT_EQ(0, GETEXITSTATUS(system("echo hello | tr a-z A-Z >res")));
   ASSERT_STREQ("HELLO\n", gc(xslurp("res", 0)));
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
-  ASSERT_EQ(0, GETEXITSTATUS(system("./echo.com hello | tr a-z A-Z >res")));
+  testlib_extract("/zip/echo", "echo", 0755);
+  ASSERT_EQ(0, GETEXITSTATUS(system("./echo hello | tr a-z A-Z >res")));
   ASSERT_STREQ("HELLO\n", gc(xslurp("res", 0)));
 }
 
@@ -267,11 +266,11 @@ TEST(system, pipelineCanOutputBackToSelf) {
   ASSERT_EQ(0, GETEXITSTATUS(system("echo hello | exec tr a-z A-Z")));
   ASSERT_SYS(0, 6, read(pipefd[0], buf, 16));
   ASSERT_STREQ("HELLO\n", buf);
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
-  ASSERT_EQ(0, GETEXITSTATUS(system("./echo.com hello | tr a-z A-Z")));
+  testlib_extract("/zip/echo", "echo", 0755);
+  ASSERT_EQ(0, GETEXITSTATUS(system("./echo hello | tr a-z A-Z")));
   ASSERT_SYS(0, 6, read(pipefd[0], buf, 16));
   ASSERT_STREQ("HELLO\n", buf);
-  ASSERT_EQ(0, GETEXITSTATUS(system("./echo.com hello | exec tr a-z A-Z")));
+  ASSERT_EQ(0, GETEXITSTATUS(system("./echo hello | exec tr a-z A-Z")));
   ASSERT_SYS(0, 6, read(pipefd[0], buf, 16));
   ASSERT_STREQ("HELLO\n", buf);
   RestoreStdout();
@@ -280,10 +279,10 @@ TEST(system, pipelineCanOutputBackToSelf) {
 int system2(const char *);
 
 BENCH(system, bench) {
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
-  EZBENCH2("system cmd", donothing, system("./echo.com hi >/dev/null"));
+  testlib_extract("/zip/echo", "echo", 0755);
+  EZBENCH2("system cmd", donothing, system("./echo hi >/dev/null"));
   EZBENCH2("systemvpe cmd", donothing,
-           systemvpe("./echo.com", (char *[]){"./echo.com", "hi", 0}, 0));
+           systemvpe("./echo", (char *[]){"./echo", "hi", 0}, 0));
   EZBENCH2("cocmd echo", donothing, system("echo hi >/dev/null"));
   EZBENCH2("cocmd exit", donothing, system("exit"));
 }
diff --git a/test/libc/release/BUILD.mk b/test/libc/release/BUILD.mk
index 85da0a377..86fa3c064 100644
--- a/test/libc/release/BUILD.mk
+++ b/test/libc/release/BUILD.mk
@@ -14,9 +14,9 @@ o/$(MODE)/test/libc/release/cosmopolitan.zip:			\
 		o/$(MODE)/ape/ape-copy-self.o			\
 		o/$(MODE)/ape/ape-no-modify-self.o		\
 		o/$(MODE)/cosmopolitan.a			\
-		o/$(MODE)/third_party/zip/zip.com
+		o/$(MODE)/third_party/zip/zip
 	@$(COMPILE) -AZIP -T$@					\
-		o/$(MODE)/third_party/zip/zip.com		\
+		o/$(MODE)/third_party/zip/zip			\
 		-b$(TMPDIR) -qj $@				\
 		o/cosmopolitan.h				\
 		o/$(MODE)/ape/ape.lds				\
@@ -46,7 +46,7 @@ o/$(MODE)/test/libc/release/smoke.o:					\
 		-Wl,-z,noexecstack					\
 		$<
 
-o/$(MODE)/test/libc/release/smoke.com.dbg:				\
+o/$(MODE)/test/libc/release/smoke.dbg:					\
 		o/$(MODE)/test/libc/release/smoke.o			\
 		o/$(MODE)/ape/ape.lds					\
 		o/$(MODE)/libc/crt/crt.o				\
@@ -67,7 +67,7 @@ o/$(MODE)/test/libc/release/smoke.com.dbg:				\
 		o/$(MODE)/cosmopolitan.a				\
 		-o $@
 
-o/$(MODE)/test/libc/release/smoke-nms.com.dbg:				\
+o/$(MODE)/test/libc/release/smoke-nms.dbg:				\
 		o/$(MODE)/test/libc/release/smoke.o			\
 		o/$(MODE)/ape/ape.lds					\
 		o/$(MODE)/libc/crt/crt.o				\
@@ -88,13 +88,13 @@ o/$(MODE)/test/libc/release/smoke-nms.com.dbg:				\
 		o/$(MODE)/cosmopolitan.a				\
 		-o $@
 
-o/$(MODE)/test/libc/release/smoke-chibicc.com.dbg:			\
+o/$(MODE)/test/libc/release/smoke-chibicc.dbg:				\
 		o/$(MODE)/test/libc/release/smoke-chibicc.o		\
 		o/$(MODE)/ape/ape.lds					\
 		o/$(MODE)/libc/crt/crt.o				\
 		o/$(MODE)/ape/ape-no-modify-self.o			\
 		o/$(MODE)/cosmopolitan.a				\
-		o/$(MODE)/third_party/chibicc/chibicc.com
+		o/$(MODE)/third_party/chibicc/chibicc
 	@$(COMPILE) -ALD $(LD)						\
 		-static							\
 		-no-pie							\
@@ -113,9 +113,9 @@ o/$(MODE)/test/libc/release/smoke-chibicc.com.dbg:			\
 o/$(MODE)/test/libc/release/smoke-chibicc.o:				\
 		test/libc/release/smoke.c				\
 		o/cosmopolitan.h					\
-		o/$(MODE)/third_party/chibicc/chibicc.com
+		o/$(MODE)/third_party/chibicc/chibicc
 	@$(COMPILE) -wACHIBICC						\
-		o/$(MODE)/third_party/chibicc/chibicc.com		\
+		o/$(MODE)/third_party/chibicc/chibicc			\
 		$(CHIBICC_FLAGS)					\
 		-o $@							\
 		-c							\
@@ -131,7 +131,7 @@ o/$(MODE)/test/libc/release/smoke-chibicc.o:				\
 		-include o/cosmopolitan.h				\
 		$<
 
-o/$(MODE)/test/libc/release/smokecxx.com.dbg:				\
+o/$(MODE)/test/libc/release/smokecxx.dbg:				\
 		o/$(MODE)/test/libc/release/smokecxx.o			\
 		o/$(MODE)/ape/ape.lds					\
 		o/$(MODE)/libc/crt/crt.o				\
@@ -171,7 +171,7 @@ o/$(MODE)/test/libc/release/smokecxx.o:					\
 		-include o/cosmopolitan.h				\
 		test/libc/release/smokecxx.cc
 
-o/$(MODE)/test/libc/release/smokeansi.com.dbg:				\
+o/$(MODE)/test/libc/release/smokeansi.dbg:				\
 		o/$(MODE)/test/libc/release/smokeansi.o			\
 		o/$(MODE)/ape/ape.lds					\
 		o/$(MODE)/libc/crt/crt.o				\
@@ -216,27 +216,27 @@ o/$(MODE)/test/libc/release/smokeansi.o:				\
 # TODO(jart): Rewrite these shell scripts as C code.
 # o/$(MODE)/test/libc/release/metal.ok:					\
 # 		test/libc/release/metal.sh				\
-# 		o/$(MODE)/examples/hello.com				\
-# 		o/$(MODE)/tool/build/blinkenlights.com.dbg
+# 		o/$(MODE)/examples/hello				\
+# 		o/$(MODE)/tool/build/blinkenlights.dbg
 # 	@$(COMPILE) -ASHTEST -tT$@ $<
 # o/$(MODE)/test/libc/release/emulate.ok:				\
 # 		test/libc/release/emulate.sh				\
-# 		o/$(MODE)/examples/hello.com				\
-# 		o/$(MODE)/tool/build/blinkenlights.com.dbg
+# 		o/$(MODE)/examples/hello				\
+# 		o/$(MODE)/tool/build/blinkenlights.dbg
 # 	@$(COMPILE) -ASHTEST -tT$@ $<
 
 .PHONY: o/$(MODE)/test/libc/release
 o/$(MODE)/test/libc/release:						\
-		o/$(MODE)/test/libc/release/smoke.com			\
-		o/$(MODE)/test/libc/release/smoke.com.runs		\
-		o/$(MODE)/test/libc/release/smoke-nms.com		\
-		o/$(MODE)/test/libc/release/smoke-nms.com.runs		\
-		o/$(MODE)/test/libc/release/smoke-chibicc.com		\
-		o/$(MODE)/test/libc/release/smoke-chibicc.com.runs	\
-		o/$(MODE)/test/libc/release/smokecxx.com		\
-		o/$(MODE)/test/libc/release/smokecxx.com.runs		\
-		o/$(MODE)/test/libc/release/smokeansi.com		\
-		o/$(MODE)/test/libc/release/smokeansi.com.runs
+		o/$(MODE)/test/libc/release/smoke			\
+		o/$(MODE)/test/libc/release/smoke.runs			\
+		o/$(MODE)/test/libc/release/smoke-nms			\
+		o/$(MODE)/test/libc/release/smoke-nms.runs		\
+		o/$(MODE)/test/libc/release/smoke-chibicc		\
+		o/$(MODE)/test/libc/release/smoke-chibicc.runs		\
+		o/$(MODE)/test/libc/release/smokecxx			\
+		o/$(MODE)/test/libc/release/smokecxx.runs		\
+		o/$(MODE)/test/libc/release/smokeansi			\
+		o/$(MODE)/test/libc/release/smokeansi.runs
 
 endif
 endif
diff --git a/test/libc/release/emulate.sh b/test/libc/release/emulate.sh
index cb9152877..bfccb8a22 100755
--- a/test/libc/release/emulate.sh
+++ b/test/libc/release/emulate.sh
@@ -9,7 +9,7 @@ if [ "$MODE" = opt ] || [ "$MODE" = optlinux ]; then
 fi
 
 # smoke test userspace binary emulation
-CMD="o/$MODE/tool/build/blinkenlights.com.dbg o/$MODE/examples/hello.com"
+CMD="o/$MODE/tool/build/blinkenlights.dbg o/$MODE/examples/hello"
 if OUTPUT="$($CMD)"; then
   if [ x"$OUTPUT" = x"hello world" ]; then
     exit 0
diff --git a/test/libc/release/metal.sh b/test/libc/release/metal.sh
index 29c0bae0a..ea4920e0c 100755
--- a/test/libc/release/metal.sh
+++ b/test/libc/release/metal.sh
@@ -13,7 +13,7 @@ fi
 $MKDIR o/$MODE/test/libc/release/
 
 # smoke test booting on bare metal and printing data to serial uart
-CMD="o/$MODE/tool/build/blinkenlights.com.dbg -r o/$MODE/examples/hello.com"
+CMD="o/$MODE/tool/build/blinkenlights.dbg -r o/$MODE/examples/hello"
 if OUTPUT="$($CMD)"; then
   if [ x"$OUTPUT" = x"hello world" ]; then
     exit 0
diff --git a/test/libc/runtime/BUILD.mk b/test/libc/runtime/BUILD.mk
index 230e5b173..7d2fd0c53 100644
--- a/test/libc/runtime/BUILD.mk
+++ b/test/libc/runtime/BUILD.mk
@@ -10,17 +10,17 @@ TEST_LIBC_RUNTIME_OBJS =						\
 	$(TEST_LIBC_RUNTIME_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_LIBC_RUNTIME_COMS =						\
-	$(TEST_LIBC_RUNTIME_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_LIBC_RUNTIME_SRCS:%.c=o/$(MODE)/%)
 
 TEST_LIBC_RUNTIME_BINS =						\
 	$(TEST_LIBC_RUNTIME_COMS)					\
 	$(TEST_LIBC_RUNTIME_COMS:%=%.dbg)
 
 TEST_LIBC_RUNTIME_TESTS =						\
-	$(TEST_LIBC_RUNTIME_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_LIBC_RUNTIME_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_LIBC_RUNTIME_CHECKS =						\
-	$(TEST_LIBC_RUNTIME_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_LIBC_RUNTIME_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_LIBC_RUNTIME_DIRECTDEPS =						\
 	LIBC_CALLS							\
@@ -49,7 +49,7 @@ o/$(MODE)/test/libc/runtime/runtime.pkg:				\
 		$(TEST_LIBC_RUNTIME_OBJS)				\
 		$(foreach x,$(TEST_LIBC_RUNTIME_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/runtime/%.com.dbg:					\
+o/$(MODE)/test/libc/runtime/%.dbg:					\
 		$(TEST_LIBC_RUNTIME_DEPS)				\
 		o/$(MODE)/test/libc/mem/prog/life.elf.zip.o		\
 		o/$(MODE)/test/libc/runtime/prog/ftraceasm.txt.zip.o	\
@@ -61,7 +61,7 @@ o/$(MODE)/test/libc/runtime/%.com.dbg:					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/runtime/ape_test.com.dbg:				\
+o/$(MODE)/test/libc/runtime/ape_test.dbg:				\
 		$(TEST_LIBC_RUNTIME_DEPS)				\
 		o/$(MODE)/test/libc/runtime/ape_test.o			\
 		o/$(MODE)/test/libc/runtime/runtime.pkg			\
@@ -74,8 +74,8 @@ $(TEST_LIBC_RUNTIME_OBJS): private					\
 	DEFAULT_CCFLAGS +=						\
 		-fno-builtin
 
-o/$(MODE)/test/libc/runtime/getenv_test.com.runs:			\
-		o/$(MODE)/test/libc/runtime/getenv_test.com
+o/$(MODE)/test/libc/runtime/getenv_test.runs:				\
+		o/$(MODE)/test/libc/runtime/getenv_test
 	@HELLO=THERE build/runit $@ $<
 
 o/$(MODE)/test/libc/runtime/itsatrap_test.o: private			\
diff --git a/test/libc/runtime/getdosargv_test.c b/test/libc/runtime/getdosargv_test.c
index c2b0c01be..ac6a8153a 100644
--- a/test/libc/runtime/getdosargv_test.c
+++ b/test/libc/runtime/getdosargv_test.c
@@ -95,9 +95,9 @@ TEST(GetDosArgv, realWorldUsage) {
   size_t size = ARG_MAX / 2;
   char *buf = malloc(size * sizeof(char));
   char **argv = malloc(max * sizeof(char *));
-  EXPECT_EQ(5, GetDosArgv(u"C:\\Users\\jtunn\\printargs.com oh yes yes yes",
-                          buf, size, argv, max));
-  EXPECT_STREQ("C:\\Users\\jtunn\\printargs.com", argv[0]);
+  EXPECT_EQ(5, GetDosArgv(u"C:\\Users\\jtunn\\printargs oh yes yes yes", buf,
+                          size, argv, max));
+  EXPECT_STREQ("C:\\Users\\jtunn\\printargs", argv[0]);
   EXPECT_STREQ("oh", argv[1]);
   EXPECT_STREQ("yes", argv[2]);
   EXPECT_STREQ("yes", argv[3]);
diff --git a/test/libc/sock/BUILD.mk b/test/libc/sock/BUILD.mk
index b3013bba6..b4ca093a8 100644
--- a/test/libc/sock/BUILD.mk
+++ b/test/libc/sock/BUILD.mk
@@ -6,85 +6,85 @@ PKGS += TEST_LIBC_SOCK
 TEST_LIBC_SOCK_SRCS := $(wildcard test/libc/sock/*.c)
 TEST_LIBC_SOCK_SRCS_TEST = $(filter %_test.c,$(TEST_LIBC_SOCK_SRCS))
 
-TEST_LIBC_SOCK_OBJS =						\
+TEST_LIBC_SOCK_OBJS =					\
 	$(TEST_LIBC_SOCK_SRCS:%.c=o/$(MODE)/%.o)
 
-TEST_LIBC_SOCK_COMS =						\
-	$(TEST_LIBC_SOCK_SRCS:%.c=o/$(MODE)/%.com)
+TEST_LIBC_SOCK_COMS =					\
+	$(TEST_LIBC_SOCK_SRCS:%.c=o/$(MODE)/%)
 
-TEST_LIBC_SOCK_BINS =						\
-	$(TEST_LIBC_SOCK_COMS)					\
+TEST_LIBC_SOCK_BINS =					\
+	$(TEST_LIBC_SOCK_COMS)				\
 	$(TEST_LIBC_SOCK_COMS:%=%.dbg)
 
-TEST_LIBC_SOCK_TESTS =						\
-	$(TEST_LIBC_SOCK_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+TEST_LIBC_SOCK_TESTS =					\
+	$(TEST_LIBC_SOCK_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
-TEST_LIBC_SOCK_CHECKS =						\
-	$(TEST_LIBC_SOCK_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+TEST_LIBC_SOCK_CHECKS =					\
+	$(TEST_LIBC_SOCK_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
-TEST_LIBC_SOCK_DIRECTDEPS =					\
-	LIBC_CALLS						\
-	LIBC_FMT						\
-	LIBC_INTRIN						\
-	LIBC_MEM						\
-	LIBC_NEXGEN32E						\
-	LIBC_PROC						\
-	LIBC_RUNTIME						\
-	LIBC_SOCK						\
-	LIBC_STDIO						\
-	LIBC_STR						\
-	LIBC_SYSV						\
-	LIBC_THREAD						\
-	LIBC_LOG						\
-	LIBC_SYSV_CALLS						\
-	LIBC_TESTLIB						\
-	LIBC_X							\
+TEST_LIBC_SOCK_DIRECTDEPS =				\
+	LIBC_CALLS					\
+	LIBC_FMT					\
+	LIBC_INTRIN					\
+	LIBC_MEM					\
+	LIBC_NEXGEN32E					\
+	LIBC_PROC					\
+	LIBC_RUNTIME					\
+	LIBC_SOCK					\
+	LIBC_STDIO					\
+	LIBC_STR					\
+	LIBC_SYSV					\
+	LIBC_THREAD					\
+	LIBC_LOG					\
+	LIBC_SYSV_CALLS					\
+	LIBC_TESTLIB					\
+	LIBC_X						\
 	TOOL_DECODE_LIB
 
-TEST_LIBC_SOCK_DEPS :=						\
+TEST_LIBC_SOCK_DEPS :=					\
 	$(call uniq,$(foreach x,$(TEST_LIBC_SOCK_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/test/libc/sock/sock.pkg:				\
-		$(TEST_LIBC_SOCK_OBJS)				\
+o/$(MODE)/test/libc/sock/sock.pkg:			\
+		$(TEST_LIBC_SOCK_OBJS)			\
 		$(foreach x,$(TEST_LIBC_SOCK_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/sock/%.com.dbg:				\
-		$(TEST_LIBC_SOCK_DEPS)				\
-		o/$(MODE)/test/libc/sock/%.o			\
-		o/$(MODE)/test/libc/sock/sock.pkg		\
-		$(LIBC_TESTMAIN)				\
-		$(CRT)						\
+o/$(MODE)/test/libc/sock/%.dbg:				\
+		$(TEST_LIBC_SOCK_DEPS)			\
+		o/$(MODE)/test/libc/sock/%.o		\
+		o/$(MODE)/test/libc/sock/sock.pkg	\
+		$(LIBC_TESTMAIN)			\
+		$(CRT)					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/sock/unix_test.com.runs:			\
+o/$(MODE)/test/libc/sock/unix_test.runs:		\
 		private .PLEDGE = stdio rpath wpath cpath fattr proc unix
 
-o/$(MODE)/test/libc/sock/connect_test.com.runs			\
-o/$(MODE)/test/libc/sock/recvfrom_test.com.runs			\
-o/$(MODE)/test/libc/sock/nonblock_test.com.runs			\
-o/$(MODE)/test/libc/sock/socket_test.com.runs			\
-o/$(MODE)/test/libc/sock/shutdown_test.com.runs			\
-o/$(MODE)/test/libc/sock/setsockopt_test.com.runs		\
-o/$(MODE)/test/libc/sock/sendfile_test.com.runs			\
-o/$(MODE)/test/libc/sock/poll_test.com.runs			\
-o/$(MODE)/test/libc/sock/pollfd_test.com.runs:			\
+o/$(MODE)/test/libc/sock/connect_test.runs		\
+o/$(MODE)/test/libc/sock/recvfrom_test.runs		\
+o/$(MODE)/test/libc/sock/nonblock_test.runs		\
+o/$(MODE)/test/libc/sock/socket_test.runs		\
+o/$(MODE)/test/libc/sock/shutdown_test.runs		\
+o/$(MODE)/test/libc/sock/setsockopt_test.runs		\
+o/$(MODE)/test/libc/sock/sendfile_test.runs		\
+o/$(MODE)/test/libc/sock/poll_test.runs			\
+o/$(MODE)/test/libc/sock/pollfd_test.runs:		\
 		private .PLEDGE = stdio rpath wpath cpath fattr proc inet
 
-o/$(MODE)/test/libc/sock/sendrecvmsg_test.com.runs:		\
+o/$(MODE)/test/libc/sock/sendrecvmsg_test.runs:		\
 		private .PLEDGE = stdio rpath wpath cpath fattr proc inet recvfd sendfd
 
-o/$(MODE)/test/libc/sock/socket_test.com.runs:			\
+o/$(MODE)/test/libc/sock/socket_test.runs:		\
 		private .INTERNET = 1  # todo: ipv6 filtering
 
-o/$(MODE)/test/libc/sock/recvmsg_test.com.runs:			\
+o/$(MODE)/test/libc/sock/recvmsg_test.runs:		\
 		private .INTERNET = 1  # need to bind to 0.0.0.0
-o/$(MODE)/test/libc/sock/recvmsg_test.com.runs:			\
+o/$(MODE)/test/libc/sock/recvmsg_test.runs:		\
 		private .PLEDGE = stdio rpath wpath cpath fattr proc inet recvfd sendfd
 
 $(TEST_LIBC_SOCK_OBJS): test/libc/sock/BUILD.mk
 
 .PHONY: o/$(MODE)/test/libc/sock
-o/$(MODE)/test/libc/sock:					\
-		$(TEST_LIBC_SOCK_BINS)				\
+o/$(MODE)/test/libc/sock:				\
+		$(TEST_LIBC_SOCK_BINS)			\
 		$(TEST_LIBC_SOCK_CHECKS)
diff --git a/test/libc/stdio/BUILD.mk b/test/libc/stdio/BUILD.mk
index 82f346466..8b9361212 100644
--- a/test/libc/stdio/BUILD.mk
+++ b/test/libc/stdio/BUILD.mk
@@ -12,17 +12,17 @@ TEST_LIBC_STDIO_OBJS =						\
 	$(TEST_LIBC_STDIO_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_LIBC_STDIO_COMS =						\
-	$(TEST_LIBC_STDIO_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_LIBC_STDIO_SRCS:%.c=o/$(MODE)/%)
 
 TEST_LIBC_STDIO_BINS =						\
 	$(TEST_LIBC_STDIO_COMS)					\
 	$(TEST_LIBC_STDIO_COMS:%=%.dbg)
 
 TEST_LIBC_STDIO_TESTS =						\
-	$(TEST_LIBC_STDIO_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_LIBC_STDIO_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_LIBC_STDIO_CHECKS =					\
-	$(TEST_LIBC_STDIO_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_LIBC_STDIO_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_LIBC_STDIO_DIRECTDEPS =					\
 	LIBC_CALLS						\
@@ -55,21 +55,21 @@ o/$(MODE)/test/libc/stdio/stdio.pkg:				\
 		$(TEST_LIBC_STDIO_OBJS)				\
 		$(foreach x,$(TEST_LIBC_STDIO_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/stdio/%.com.dbg:				\
+o/$(MODE)/test/libc/stdio/%.dbg:				\
 		$(TEST_LIBC_STDIO_DEPS)				\
 		o/$(MODE)/test/libc/stdio/%.o			\
 		o/$(MODE)/test/libc/stdio/stdio.pkg		\
-		o/$(MODE)/tool/build/echo.com.zip.o		\
+		o/$(MODE)/tool/build/echo.zip.o			\
 		$(LIBC_TESTMAIN)				\
 		$(CRT)						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/stdio/popen_test.com.dbg:			\
+o/$(MODE)/test/libc/stdio/popen_test.dbg:			\
 		$(TEST_LIBC_STDIO_DEPS)				\
 		o/$(MODE)/test/libc/stdio/popen_test.o		\
 		o/$(MODE)/test/libc/stdio/stdio.pkg		\
-		o/$(MODE)/tool/build/echo.com.zip.o		\
+		o/$(MODE)/tool/build/echo.zip.o			\
 		$(LIBC_TESTMAIN)				\
 		$(CRT)						\
 		$(APE_NO_MODIFY_SELF)
diff --git a/test/libc/stdio/dirstream_test.c b/test/libc/stdio/dirstream_test.c
index 75625c564..392497840 100644
--- a/test/libc/stdio/dirstream_test.c
+++ b/test/libc/stdio/dirstream_test.c
@@ -27,7 +27,6 @@
 #include "libc/limits.h"
 #include "libc/mem/critbit0.h"
 #include "libc/mem/gc.h"
-#include "libc/mem/gc.h"
 #include "libc/mem/mem.h"
 #include "libc/runtime/runtime.h"
 #include "libc/stdio/append.h"
@@ -424,7 +423,7 @@ static int walk(const char *fpath,      //
 
 TEST(dirstream, walk) {
   ASSERT_SYS(0, 0, nftw("/zip", walk, 128, FTW_PHYS | FTW_DEPTH));
-  ASSERT_STREQ("FTW_F  /zip/echo.com\n"
+  ASSERT_STREQ("FTW_F  /zip/echo\n"
                "FTW_F  /zip/libc/testlib/hyperion.txt\n"
                "FTW_F  /zip/libc/testlib/moby.txt\n"
                "FTW_DP /zip/libc/testlib\n"
diff --git a/test/libc/stdio/popen_test.c b/test/libc/stdio/popen_test.c
index f214149b7..b60e7c085 100644
--- a/test/libc/stdio/popen_test.c
+++ b/test/libc/stdio/popen_test.c
@@ -62,8 +62,8 @@ void CheckForFdLeaks(void) {
 
 TEST(popen, command) {
   char foo[6];
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
-  ASSERT_NE(NULL, (f = popen("./echo.com hello", "r")));
+  testlib_extract("/zip/echo", "echo", 0755);
+  ASSERT_NE(NULL, (f = popen("./echo hello", "r")));
   ASSERT_NE(NULL, fgets(foo, sizeof(foo), f));
   ASSERT_STREQ("hello", foo);
   ASSERT_EQ(0, pclose(f));
@@ -142,7 +142,7 @@ void *Worker(void *arg) {
     arg2 = malloc(13);
     FormatInt32(arg1, _rand64());
     FormatInt32(arg2, _rand64());
-    sprintf(cmd, "echo %s; ./echo.com %s", arg1, arg2);
+    sprintf(cmd, "echo %s; ./echo %s", arg1, arg2);
     strcat(arg1, "\n");
     strcat(arg2, "\n");
     ASSERT_NE(NULL, (f = popen(cmd, "r")));
@@ -163,7 +163,7 @@ TEST(popen, torture) {
   }
   int i, n = 4;
   pthread_t *t = gc(malloc(sizeof(pthread_t) * n));
-  testlib_extract("/zip/echo.com", "echo.com", 0755);
+  testlib_extract("/zip/echo", "echo", 0755);
   for (i = 0; i < n; ++i) ASSERT_EQ(0, pthread_create(t + i, 0, Worker, 0));
   for (i = 0; i < n; ++i) ASSERT_EQ(0, pthread_join(t[i], 0));
   CheckForFdLeaks();
diff --git a/test/libc/stdio/zipdir_test.c b/test/libc/stdio/zipdir_test.c
index 387ffbfd7..60916c646 100644
--- a/test/libc/stdio/zipdir_test.c
+++ b/test/libc/stdio/zipdir_test.c
@@ -101,7 +101,7 @@ TEST(zipdir, testListZip) {
   ASSERT_STREQ("..", ent->d_name);
   ASSERT_EQ(DT_DIR, ent->d_type);
   ASSERT_NE(NULL, (ent = readdir(dir)));
-  ASSERT_STREQ("echo.com", ent->d_name);
+  ASSERT_STREQ("echo", ent->d_name);
   ASSERT_EQ(DT_REG, ent->d_type);
   ASSERT_NE(NULL, (ent = readdir(dir)));
   ASSERT_STREQ("libc", ent->d_name);
diff --git a/test/libc/str/BUILD.mk b/test/libc/str/BUILD.mk
index 2d19ba9d6..2f65289ea 100644
--- a/test/libc/str/BUILD.mk
+++ b/test/libc/str/BUILD.mk
@@ -10,78 +10,78 @@ TEST_LIBC_STR_SRCS = $(TEST_LIBC_STR_SRCS_C) $(TEST_LIBC_STR_SRCS_CC)
 TEST_LIBC_STR_SRCS_TEST_C = $(filter %_test.c,$(TEST_LIBC_STR_FILES))
 TEST_LIBC_STR_SRCS_TEST_CC = $(filter %_test.cc,$(TEST_LIBC_STR_FILES))
 
-TEST_LIBC_STR_OBJS =							\
-	$(TEST_LIBC_STR_SRCS_C:%.c=o/$(MODE)/%.o)			\
+TEST_LIBC_STR_OBJS =						\
+	$(TEST_LIBC_STR_SRCS_C:%.c=o/$(MODE)/%.o)		\
 	$(TEST_LIBC_STR_SRCS_CC:%.cc=o/$(MODE)/%.o)
 
-TEST_LIBC_STR_COMS =							\
-	$(TEST_LIBC_STR_SRCS_TEST_C:%.c=o/$(MODE)/%.com)		\
-	$(TEST_LIBC_STR_SRCS_TEST_CC:%.cc=o/$(MODE)/%.com)
+TEST_LIBC_STR_COMS =						\
+	$(TEST_LIBC_STR_SRCS_TEST_C:%.c=o/$(MODE)/%)		\
+	$(TEST_LIBC_STR_SRCS_TEST_CC:%.cc=o/$(MODE)/%)
 
-TEST_LIBC_STR_BINS =							\
-	$(TEST_LIBC_STR_COMS)						\
+TEST_LIBC_STR_BINS =						\
+	$(TEST_LIBC_STR_COMS)					\
 	$(TEST_LIBC_STR_COMS:%=%.dbg)
 
-TEST_LIBC_STR_TESTS =							\
-	$(TEST_LIBC_STR_SRCS_TEST_C:%.c=o/$(MODE)/%.com.ok)		\
-	$(TEST_LIBC_STR_SRCS_TEST_CC:%.cc=o/$(MODE)/%.com.ok)
+TEST_LIBC_STR_TESTS =						\
+	$(TEST_LIBC_STR_SRCS_TEST_C:%.c=o/$(MODE)/%.ok)		\
+	$(TEST_LIBC_STR_SRCS_TEST_CC:%.cc=o/$(MODE)/%.ok)
 
-TEST_LIBC_STR_CHECKS =							\
-	$(TEST_LIBC_STR_SRCS_TEST_C:%.c=o/$(MODE)/%.com.runs)		\
-	$(TEST_LIBC_STR_SRCS_TEST_CC:%.cc=o/$(MODE)/%.com.runs)
+TEST_LIBC_STR_CHECKS =						\
+	$(TEST_LIBC_STR_SRCS_TEST_C:%.c=o/$(MODE)/%.runs)	\
+	$(TEST_LIBC_STR_SRCS_TEST_CC:%.cc=o/$(MODE)/%.runs)
 
-TEST_LIBC_STR_DIRECTDEPS =						\
-	LIBC_CALLS							\
-	LIBC_FMT							\
-	LIBC_INTRIN							\
-	LIBC_LOG							\
-	LIBC_TINYMATH							\
-	LIBC_MEM							\
-	LIBC_NEXGEN32E							\
-	LIBC_RUNTIME							\
-	LIBC_STDIO							\
-	LIBC_STR							\
-	LIBC_SYSV							\
-	LIBC_SYSV_CALLS							\
-	LIBC_TESTLIB							\
-	LIBC_X								\
-	THIRD_PARTY_COMPILER_RT						\
-	THIRD_PARTY_MBEDTLS						\
-	THIRD_PARTY_REGEX						\
-	THIRD_PARTY_ZLIB						\
-	THIRD_PARTY_LIBCXX						\
-	THIRD_PARTY_SMALLZ4						\
+TEST_LIBC_STR_DIRECTDEPS =					\
+	LIBC_CALLS						\
+	LIBC_FMT						\
+	LIBC_INTRIN						\
+	LIBC_LOG						\
+	LIBC_TINYMATH						\
+	LIBC_MEM						\
+	LIBC_NEXGEN32E						\
+	LIBC_RUNTIME						\
+	LIBC_STDIO						\
+	LIBC_STR						\
+	LIBC_SYSV						\
+	LIBC_SYSV_CALLS						\
+	LIBC_TESTLIB						\
+	LIBC_X							\
+	THIRD_PARTY_COMPILER_RT					\
+	THIRD_PARTY_MBEDTLS					\
+	THIRD_PARTY_REGEX					\
+	THIRD_PARTY_ZLIB					\
+	THIRD_PARTY_LIBCXX					\
+	THIRD_PARTY_SMALLZ4					\
 	THIRD_PARTY_VQSORT
 
-TEST_LIBC_STR_DEPS :=							\
+TEST_LIBC_STR_DEPS :=						\
 	$(call uniq,$(foreach x,$(TEST_LIBC_STR_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/test/libc/str/str.pkg:					\
-		$(TEST_LIBC_STR_OBJS)					\
+o/$(MODE)/test/libc/str/str.pkg:				\
+		$(TEST_LIBC_STR_OBJS)				\
 		$(foreach x,$(TEST_LIBC_STR_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/str/tpenc_test.o: private				\
-		CFLAGS +=						\
+o/$(MODE)/test/libc/str/tpenc_test.o: private			\
+		CFLAGS +=					\
 			$(TRADITIONAL)
 
-o/$(MODE)/test/libc/str/%.com.dbg:					\
-		$(TEST_LIBC_STR_DEPS)					\
-		o/$(MODE)/test/libc/str/%.o				\
-		o/$(MODE)/test/libc/str/str.pkg				\
-		$(LIBC_TESTMAIN)					\
-		$(CRT)							\
+o/$(MODE)/test/libc/str/%.dbg:					\
+		$(TEST_LIBC_STR_DEPS)				\
+		o/$(MODE)/test/libc/str/%.o			\
+		o/$(MODE)/test/libc/str/str.pkg			\
+		$(LIBC_TESTMAIN)				\
+		$(CRT)						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-$(TEST_LIBC_STR_OBJS): private						\
-		DEFAULT_CCFLAGS +=					\
+$(TEST_LIBC_STR_OBJS): private					\
+		DEFAULT_CCFLAGS +=				\
 			-fno-builtin
 
-o/$(MODE)/test/libc/str/memmove_test.o: private				\
-		CFLAGS +=						\
+o/$(MODE)/test/libc/str/memmove_test.o: private			\
+		CFLAGS +=					\
 			-O2 -D_FORTIFY_SOURCE=2
 
 .PHONY: o/$(MODE)/test/libc/str
-o/$(MODE)/test/libc/str:						\
-		$(TEST_LIBC_STR_BINS)					\
+o/$(MODE)/test/libc/str:					\
+		$(TEST_LIBC_STR_BINS)				\
 		$(TEST_LIBC_STR_CHECKS)
diff --git a/test/libc/str/regex_test.c b/test/libc/str/regex_test.c
index 8523190c3..f51b7f557 100644
--- a/test/libc/str/regex_test.c
+++ b/test/libc/str/regex_test.c
@@ -38,7 +38,7 @@ TEST(regex, testDns) {
   regex_t rx;
   EXPECT_EQ(REG_OK, regcomp(&rx, "^[-._0-9A-Za-z]*$", REG_EXTENDED));
   EXPECT_EQ(REG_OK, regexec(&rx, "", 0, NULL, 0));
-  EXPECT_EQ(REG_OK, regexec(&rx, "foo.com", 0, NULL, 0));
+  EXPECT_EQ(REG_OK, regexec(&rx, "foo", 0, NULL, 0));
   EXPECT_EQ(REG_NOMATCH, regexec(&rx, "bar@example", 0, NULL, 0));
   regfree(&rx);
 }
@@ -96,16 +96,16 @@ TEST(regex, testUnicodeCharacterClass) {
 void A(void) {
   regex_t rx;
   regcomp(&rx, "^[-._0-9A-Za-z]*$", REG_EXTENDED);
-  regexec(&rx, "foo.com", 0, NULL, 0);
+  regexec(&rx, "foo", 0, NULL, 0);
   regfree(&rx);
 }
 void B(regex_t *rx) {
-  regexec(rx, "foo.com", 0, NULL, 0);
+  regexec(rx, "foo", 0, NULL, 0);
 }
 void C(void) {
   regex_t rx;
   regcomp(&rx, "^[-._0-9A-Za-z]*$", 0);
-  regexec(&rx, "foo.com", 0, NULL, 0);
+  regexec(&rx, "foo", 0, NULL, 0);
   regfree(&rx);
 }
 void D(regex_t *rx, regmatch_t *m) {
diff --git a/test/libc/thread/BUILD.mk b/test/libc/thread/BUILD.mk
index 15bc7232a..bd27baa61 100644
--- a/test/libc/thread/BUILD.mk
+++ b/test/libc/thread/BUILD.mk
@@ -16,17 +16,17 @@ TEST_LIBC_THREAD_OBJS =					\
 	$(TEST_LIBC_THREAD_SRCS_CC:%.cc=o/$(MODE)/%.o)
 
 TEST_LIBC_THREAD_COMS =					\
-	$(TEST_LIBC_THREAD_OBJS:%.o=%.com)
+	$(TEST_LIBC_THREAD_OBJS:%.o=%)
 
 TEST_LIBC_THREAD_BINS =					\
 	$(TEST_LIBC_THREAD_COMS)			\
 	$(TEST_LIBC_THREAD_COMS:%=%.dbg)
 
 TEST_LIBC_THREAD_TESTS =				\
-	$(TEST_LIBC_THREAD_OBJS:%.o=%.com.ok)
+	$(TEST_LIBC_THREAD_OBJS:%.o=%.ok)
 
 TEST_LIBC_THREAD_CHECKS =				\
-	$(TEST_LIBC_THREAD_OBJS:%.o=%.com.runs)
+	$(TEST_LIBC_THREAD_OBJS:%.o=%.runs)
 
 TEST_LIBC_THREAD_DIRECTDEPS =				\
 	LIBC_CALLS					\
@@ -58,7 +58,7 @@ o/$(MODE)/test/libc/thread/thread.pkg:			\
 		$(TEST_LIBC_THREAD_OBJS)		\
 		$(foreach x,$(TEST_LIBC_THREAD_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/thread/%.com.dbg:			\
+o/$(MODE)/test/libc/thread/%.dbg:			\
 		$(TEST_LIBC_THREAD_DEPS)		\
 		o/$(MODE)/test/libc/thread/%.o		\
 		o/$(MODE)/test/libc/thread/thread.pkg	\
@@ -67,7 +67,7 @@ o/$(MODE)/test/libc/thread/%.com.dbg:			\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/libc/thread/pthread_kill_test.com.runs:	\
+o/$(MODE)/test/libc/thread/pthread_kill_test.runs:	\
 		private .PLEDGE = stdio rpath wpath cpath fattr proc inet
 
 .PHONY: o/$(MODE)/test/libc/thread
diff --git a/test/libc/time/BUILD.mk b/test/libc/time/BUILD.mk
index 3f7dc14d1..a7add074a 100644
--- a/test/libc/time/BUILD.mk
+++ b/test/libc/time/BUILD.mk
@@ -11,11 +11,11 @@ TEST_LIBC_TIME_OBJS =					\
 	$(TEST_LIBC_TIME_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_LIBC_TIME_COMS =					\
-	$(TEST_LIBC_TIME_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_LIBC_TIME_SRCS:%.c=o/$(MODE)/%)
 
-TEST_LIBC_TIME_TESTS = $(TEST_LIBC_TIME_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+TEST_LIBC_TIME_TESTS = $(TEST_LIBC_TIME_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 TEST_LIBC_TIME_CHECKS =					\
-	$(TEST_LIBC_TIME_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_LIBC_TIME_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_LIBC_TIME_DIRECTDEPS =				\
 	LIBC_CALLS					\
@@ -36,7 +36,7 @@ o/$(MODE)/test/libc/time/time.pkg:			\
 		$(TEST_LIBC_TIME_OBJS)			\
 		$(foreach x,$(TEST_LIBC_TIME_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/time/%.com.dbg:			\
+o/$(MODE)/test/libc/time/%.dbg:				\
 		$(TEST_LIBC_TIME_DEPS)			\
 		o/$(MODE)/test/libc/time/%.o		\
 		o/$(MODE)/test/libc/time/time.pkg	\
diff --git a/test/libc/tinymath/BUILD.mk b/test/libc/tinymath/BUILD.mk
index 4424fed24..ef755a29d 100644
--- a/test/libc/tinymath/BUILD.mk
+++ b/test/libc/tinymath/BUILD.mk
@@ -10,17 +10,17 @@ TEST_LIBC_TINYMATH_OBJS =					\
 	$(TEST_LIBC_TINYMATH_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_LIBC_TINYMATH_COMS =					\
-	$(TEST_LIBC_TINYMATH_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_LIBC_TINYMATH_SRCS:%.c=o/$(MODE)/%)
 
 TEST_LIBC_TINYMATH_BINS =					\
 	$(TEST_LIBC_TINYMATH_COMS)				\
 	$(TEST_LIBC_TINYMATH_COMS:%=%.dbg)
 
 TEST_LIBC_TINYMATH_TESTS =					\
-	$(TEST_LIBC_TINYMATH_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_LIBC_TINYMATH_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_LIBC_TINYMATH_CHECKS =					\
-	$(TEST_LIBC_TINYMATH_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_LIBC_TINYMATH_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_LIBC_TINYMATH_DIRECTDEPS =					\
 	LIBC_CALLS						\
@@ -47,7 +47,7 @@ o/$(MODE)/test/libc/tinymath/tinymath.pkg:			\
 		$(TEST_LIBC_TINYMATH_OBJS)			\
 		$(foreach x,$(TEST_LIBC_TINYMATH_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/tinymath/%.com.dbg:				\
+o/$(MODE)/test/libc/tinymath/%.dbg:				\
 		$(TEST_LIBC_TINYMATH_DEPS)			\
 		o/$(MODE)/test/libc/tinymath/%.o		\
 		o/$(MODE)/test/libc/tinymath/tinymath.pkg	\
diff --git a/test/libc/x/BUILD.mk b/test/libc/x/BUILD.mk
index e7b09d819..b8915456a 100644
--- a/test/libc/x/BUILD.mk
+++ b/test/libc/x/BUILD.mk
@@ -10,17 +10,17 @@ TEST_LIBC_X_OBJS =				\
 	$(TEST_LIBC_X_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_LIBC_X_COMS =				\
-	$(TEST_LIBC_X_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_LIBC_X_SRCS:%.c=o/$(MODE)/%)
 
 TEST_LIBC_X_BINS =				\
 	$(TEST_LIBC_X_COMS)			\
 	$(TEST_LIBC_X_COMS:%=%.dbg)
 
 TEST_LIBC_X_TESTS =				\
-	$(TEST_LIBC_X_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_LIBC_X_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_LIBC_X_CHECKS =				\
-	$(TEST_LIBC_X_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_LIBC_X_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_LIBC_X_DIRECTDEPS =			\
 	LIBC_CALLS				\
@@ -45,7 +45,7 @@ o/$(MODE)/test/libc/x/x.pkg:			\
 		$(TEST_LIBC_X_OBJS)		\
 		$(foreach x,$(TEST_LIBC_X_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/x/%.com.dbg:		\
+o/$(MODE)/test/libc/x/%.dbg:			\
 		$(TEST_LIBC_X_DEPS)		\
 		o/$(MODE)/test/libc/x/%.o	\
 		o/$(MODE)/test/libc/x/x.pkg	\
diff --git a/test/libc/xed/BUILD.mk b/test/libc/xed/BUILD.mk
index bb20c13db..c91ecfc23 100644
--- a/test/libc/xed/BUILD.mk
+++ b/test/libc/xed/BUILD.mk
@@ -56,17 +56,17 @@ TEST_LIBC_XED_OBJS =						\
 	$(TEST_LIBC_XED_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_LIBC_XED_COMS =						\
-	$(TEST_LIBC_XED_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_LIBC_XED_SRCS:%.c=o/$(MODE)/%)
 
 TEST_LIBC_XED_BINS =						\
 	$(TEST_LIBC_XED_COMS)					\
 	$(TEST_LIBC_XED_COMS:%=%.dbg)
 
 TEST_LIBC_XED_TESTS =						\
-	$(TEST_LIBC_XED_SRCS:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_LIBC_XED_SRCS:%.c=o/$(MODE)/%.ok)
 
 TEST_LIBC_XED_CHECKS =						\
-	$(TEST_LIBC_XED_SRCS:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_LIBC_XED_SRCS:%.c=o/$(MODE)/%.runs)
 
 TEST_LIBC_XED_DIRECTDEPS =					\
 	LIBC_INTRIN						\
@@ -85,7 +85,7 @@ o/$(MODE)/test/libc/xed/xed.pkg:				\
 		$(TEST_LIBC_XED_OBJS)				\
 		$(foreach x,$(TEST_LIBC_XED_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libc/xed/%.com.dbg:				\
+o/$(MODE)/test/libc/xed/%.dbg:					\
 		$(TEST_LIBC_XED_DEPS)				\
 		o/$(MODE)/test/libc/xed/%.o			\
 		o/$(MODE)/test/libc/xed/xed.pkg			\
diff --git a/test/libcxx/BUILD.mk b/test/libcxx/BUILD.mk
index 836e6da8c..1e1ca15ae 100644
--- a/test/libcxx/BUILD.mk
+++ b/test/libcxx/BUILD.mk
@@ -6,7 +6,7 @@ PKGS += TEST_LIBCXX
 TEST_LIBCXX_FILES := $(wildcard test/libcxx/*)
 TEST_LIBCXX_SRCS = $(filter %.cc,$(TEST_LIBCXX_FILES))
 TEST_LIBCXX_OBJS = $(TEST_LIBCXX_SRCS:%.cc=o/$(MODE)/%.o)
-TEST_LIBCXX_COMS = $(TEST_LIBCXX_OBJS:%.o=%.com)
+TEST_LIBCXX_COMS = $(TEST_LIBCXX_OBJS:%.o=%)
 TEST_LIBCXX_BINS = $(TEST_LIBCXX_COMS) $(TEST_LIBCXX_COMS:%=%.dbg)
 TEST_LIBCXX_CHECKS = $(TEST_LIBCXX_COMS:%=%.runs)
 TEST_LIBCXX_TESTS = $(TEST_LIBCXX_COMS:%=%.ok)
@@ -31,7 +31,7 @@ o/$(MODE)/test/libcxx/libcxx.pkg:			\
 		$(TEST_LIBCXX_OBJS)			\
 		$(foreach x,$(TEST_LIBCXX_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/libcxx/%.com.dbg:			\
+o/$(MODE)/test/libcxx/%.dbg:				\
 		$(TEST_LIBCXX_DEPS)			\
 		o/$(MODE)/test/libcxx/%.o		\
 		o/$(MODE)/test/libcxx/libcxx.pkg	\
@@ -42,7 +42,7 @@ o/$(MODE)/test/libcxx/%.com.dbg:			\
 $(TEST_LIBCXX_OBJS): private CCFLAGS += -fexceptions -frtti
 
 o/$(MODE)/test/libcxx/openmp_test.o: private CXXFLAGS += -fopenmp
-o/$(MODE)/test/libcxx/openmp_test.com.runs: private QUOTA += -C100
+o/$(MODE)/test/libcxx/openmp_test.runs: private QUOTA += -C100
 
 .PHONY: o/$(MODE)/test/libcxx
 o/$(MODE)/test/libcxx:					\
diff --git a/test/math/BUILD.mk b/test/math/BUILD.mk
index e0a241b20..188697014 100644
--- a/test/math/BUILD.mk
+++ b/test/math/BUILD.mk
@@ -6,10 +6,10 @@ PKGS += TEST_MATH
 TEST_MATH_SRCS := $(wildcard test/math/*.c)
 TEST_MATH_SRCS_TEST = $(filter %_test.c,$(TEST_MATH_SRCS))
 TEST_MATH_OBJS = $(TEST_MATH_SRCS:%.c=o/$(MODE)/%.o)
-TEST_MATH_COMS = $(TEST_MATH_SRCS_TEST:%.c=o/$(MODE)/%.com)
+TEST_MATH_COMS = $(TEST_MATH_SRCS_TEST:%.c=o/$(MODE)/%)
 TEST_MATH_BINS = $(TEST_MATH_COMS) $(TEST_MATH_COMS:%=%.dbg)
-TEST_MATH_TESTS = $(TEST_MATH_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
-TEST_MATH_CHECKS = $(TEST_MATH_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+TEST_MATH_TESTS = $(TEST_MATH_SRCS_TEST:%.c=o/$(MODE)/%.ok)
+TEST_MATH_CHECKS = $(TEST_MATH_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_MATH_DIRECTDEPS =				\
 	LIBC_INTRIN				\
@@ -25,9 +25,9 @@ o/$(MODE)/test/math/math.pkg:			\
 		$(TEST_MATH_OBJS)		\
 		$(foreach x,$(TEST_MATH_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/math/%.com.dbg:			\
+o/$(MODE)/test/math/%.dbg:			\
 		$(TEST_MATH_DEPS)		\
-		o/$(MODE)/test/math/%.o	\
+		o/$(MODE)/test/math/%.o		\
 		o/$(MODE)/test/math/math.pkg	\
 		$(CRT)				\
 		$(APE_NO_MODIFY_SELF)
diff --git a/test/net/finger/BUILD.mk b/test/net/finger/BUILD.mk
index 9688bbd35..9207cca94 100644
--- a/test/net/finger/BUILD.mk
+++ b/test/net/finger/BUILD.mk
@@ -11,13 +11,13 @@ TEST_NET_FINGER_OBJS =						\
 	$(TEST_NET_FINGER_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_NET_FINGER_COMS =						\
-	$(TEST_NET_FINGER_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_NET_FINGER_SRCS:%.c=o/$(MODE)/%)
 
 TEST_NET_FINGER_TESTS =						\
-	$(TEST_NET_FINGER_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_NET_FINGER_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_NET_FINGER_CHECKS =					\
-	$(TEST_NET_FINGER_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_NET_FINGER_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_NET_FINGER_DIRECTDEPS =					\
 	NET_FINGER						\
@@ -32,7 +32,7 @@ o/$(MODE)/test/net/finger/finger.pkg:				\
 		$(TEST_NET_FINGER_OBJS)				\
 		$(foreach x,$(TEST_NET_FINGER_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/net/finger/%.com.dbg:				\
+o/$(MODE)/test/net/finger/%.dbg:				\
 		$(TEST_NET_FINGER_DEPS)				\
 		o/$(MODE)/test/net/finger/%.o			\
 		$(LIBC_TESTMAIN)				\
diff --git a/test/posix/BUILD.mk b/test/posix/BUILD.mk
index ac5b2e413..ba418c314 100644
--- a/test/posix/BUILD.mk
+++ b/test/posix/BUILD.mk
@@ -13,17 +13,17 @@ TEST_POSIX_OBJS =				\
 	$(TEST_POSIX_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_POSIX_COMS =				\
-	$(TEST_POSIX_SRCS_TEST:%.c=o/$(MODE)/%.com)
+	$(TEST_POSIX_SRCS_TEST:%.c=o/$(MODE)/%)
 
 TEST_POSIX_BINS =				\
 	$(TEST_POSIX_COMS)			\
 	$(TEST_POSIX_COMS:%=%.dbg)
 
 TEST_POSIX_TESTS =				\
-	$(TEST_POSIX_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_POSIX_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_POSIX_CHECKS =				\
-	$(TEST_POSIX_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_POSIX_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_POSIX_DIRECTDEPS =				\
 	LIBC_CALLS				\
@@ -43,7 +43,7 @@ o/$(MODE)/test/posix/posix.pkg:			\
 		$(TEST_POSIX_OBJS)		\
 		$(foreach x,$(TEST_POSIX_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/posix/%.com.dbg:			\
+o/$(MODE)/test/posix/%.dbg:			\
 		$(TEST_POSIX_DEPS)		\
 		o/$(MODE)/test/posix/%.o	\
 		o/$(MODE)/test/posix/posix.pkg	\
diff --git a/test/posix/sigchld_test.c b/test/posix/sigchld_test.c
index 1bf0dc025..2b9de5860 100644
--- a/test/posix/sigchld_test.c
+++ b/test/posix/sigchld_test.c
@@ -32,7 +32,7 @@
 #include <unistd.h>
 
 // clang-format off
-// sh -c 'build/bootstrap/make.com -j8 V=1 o//test/posix/sigchld_test.com.runs'
+// sh -c 'build/bootstrap/make -j8 V=1 o//test/posix/sigchld_test.runs'
 // clang-format on
 
 void Assert(const char *file, int line, bool ok) {
diff --git a/test/tool/args/BUILD.mk b/test/tool/args/BUILD.mk
index e0b0da345..207305dae 100644
--- a/test/tool/args/BUILD.mk
+++ b/test/tool/args/BUILD.mk
@@ -9,24 +9,24 @@ TEST_TOOL_ARGS_FILES := $(wildcard test/tool/args/*)
 TEST_TOOL_ARGS_SRCS = $(filter %.c,$(TEST_TOOL_ARGS_FILES))
 TEST_TOOL_ARGS_SRCS_TEST = $(filter %_test.c,$(TEST_TOOL_ARGS_SRCS))
 TEST_TOOL_ARGS_HDRS = $(filter %.h,$(TEST_TOOL_ARGS_FILES))
-TEST_TOOL_ARGS_COMS = $(TEST_TOOL_ARGS_OBJS:%.o=%.com)
+TEST_TOOL_ARGS_COMS = $(TEST_TOOL_ARGS_OBJS:%.o=%)
 
 TEST_TOOL_ARGS_OBJS =				\
 	$(TEST_TOOL_ARGS_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_TOOL_ARGS_COMS =				\
-	$(TEST_TOOL_ARGS_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_TOOL_ARGS_SRCS:%.c=o/$(MODE)/%)
 
 TEST_TOOL_ARGS_BINS =				\
 	$(TEST_TOOL_ARGS_COMS)			\
 	$(TEST_TOOL_ARGS_COMS:%=%.dbg)
 
 TEST_TOOL_ARGS_TESTS =				\
-	$(TEST_TOOL_ARGS_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_TOOL_ARGS_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_TOOL_ARGS_CHECKS =				\
 	$(TEST_TOOL_ARGS_HDRS:%=o/$(MODE)/%.ok)	\
-	$(TEST_TOOL_ARGS_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_TOOL_ARGS_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_TOOL_ARGS_DIRECTDEPS =			\
 	LIBC_CALLS				\
@@ -56,7 +56,7 @@ $(TEST_TOOL_ARGS_A).pkg:			\
 		$(TEST_TOOL_ARGS_OBJS)		\
 		$(foreach x,$(TEST_TOOL_ARGS_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/tool/args/%.com.dbg:		\
+o/$(MODE)/test/tool/args/%.dbg:			\
 		$(TEST_TOOL_ARGS_DEPS)		\
 		$(TEST_TOOL_ARGS_A)		\
 		o/$(MODE)/test/tool/args/%.o	\
diff --git a/test/tool/build/lib/BUILD.mk b/test/tool/build/lib/BUILD.mk
index f3f987fe5..51d2c123e 100644
--- a/test/tool/build/lib/BUILD.mk
+++ b/test/tool/build/lib/BUILD.mk
@@ -9,24 +9,24 @@ TEST_TOOL_BUILD_LIB_FILES := $(wildcard test/tool/build/lib/*)
 TEST_TOOL_BUILD_LIB_SRCS = $(filter %.c,$(TEST_TOOL_BUILD_LIB_FILES))
 TEST_TOOL_BUILD_LIB_SRCS_TEST = $(filter %_test.c,$(TEST_TOOL_BUILD_LIB_SRCS))
 TEST_TOOL_BUILD_LIB_HDRS = $(filter %.h,$(TEST_TOOL_BUILD_LIB_FILES))
-TEST_TOOL_BUILD_LIB_COMS = $(TEST_TOOL_BUILD_LIB_OBJS:%.o=%.com)
+TEST_TOOL_BUILD_LIB_COMS = $(TEST_TOOL_BUILD_LIB_OBJS:%.o=%)
 
 TEST_TOOL_BUILD_LIB_OBJS =					\
 	$(TEST_TOOL_BUILD_LIB_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_TOOL_BUILD_LIB_COMS =					\
-	$(TEST_TOOL_BUILD_LIB_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_TOOL_BUILD_LIB_SRCS:%.c=o/$(MODE)/%)
 
 TEST_TOOL_BUILD_LIB_BINS =					\
 	$(TEST_TOOL_BUILD_LIB_COMS)				\
 	$(TEST_TOOL_BUILD_LIB_COMS:%=%.dbg)
 
 TEST_TOOL_BUILD_LIB_TESTS =					\
-	$(TEST_TOOL_BUILD_LIB_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_TOOL_BUILD_LIB_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_TOOL_BUILD_LIB_CHECKS =					\
 	$(TEST_TOOL_BUILD_LIB_HDRS:%=o/$(MODE)/%.ok)		\
-	$(TEST_TOOL_BUILD_LIB_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_TOOL_BUILD_LIB_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_TOOL_BUILD_LIB_DIRECTDEPS =				\
 	LIBC_CALLS						\
@@ -57,7 +57,7 @@ $(TEST_TOOL_BUILD_LIB_A).pkg:					\
 		$(TEST_TOOL_BUILD_LIB_OBJS)			\
 		$(foreach x,$(TEST_TOOL_BUILD_LIB_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/tool/build/lib/%.com.dbg:			\
+o/$(MODE)/test/tool/build/lib/%.dbg:				\
 		$(TEST_TOOL_BUILD_LIB_DEPS)			\
 		$(TEST_TOOL_BUILD_LIB_A)			\
 		o/$(MODE)/test/tool/build/lib/%.o		\
diff --git a/test/tool/build/pledge_test.sh b/test/tool/build/pledge_test.sh
index 92b1a6953..62fc7ecb9 100755
--- a/test/tool/build/pledge_test.sh
+++ b/test/tool/build/pledge_test.sh
@@ -5,21 +5,21 @@ t=/tmp/pledge-test
 if [ $# = 0 ]; then
   if ! [ $(id -u) = 0 ]; then
     make -j16 MODE=fastbuild \
-         o/fastbuild/examples/ls.com \
-         o/fastbuild/tool/curl/curl.com \
-         o/fastbuild/examples/life.com \
-         o/fastbuild/examples/hello.com \
-         o/fastbuild/examples/printargs.com \
-         o/fastbuild/tool/build/assimilate.com \
-         o/fastbuild/tool/build/pledge.com || exit
+         o/fastbuild/examples/ls \
+         o/fastbuild/tool/curl/curl \
+         o/fastbuild/examples/life \
+         o/fastbuild/examples/hello \
+         o/fastbuild/examples/printargs \
+         o/fastbuild/tool/build/assimilate \
+         o/fastbuild/tool/build/pledge || exit
     make -j16 MODE=$m \
-         o/$m/examples/ls.com \
-         o/$m/tool/curl/curl.com \
-         o/$m/examples/life.com \
-         o/$m/examples/hello.com \
-         o/$m/examples/printargs.com \
-         o/$m/tool/build/assimilate.com \
-         o/$m/tool/build/pledge.com || exit
+         o/$m/examples/ls \
+         o/$m/tool/curl/curl \
+         o/$m/examples/life \
+         o/$m/examples/hello \
+         o/$m/examples/printargs \
+         o/$m/tool/build/assimilate \
+         o/$m/tool/build/pledge || exit
     test/tool/build/pledge_test.sh ape_binfmt_test_suite || exit
     test/tool/build/pledge_test.sh ape_loader_test_suite || exit
     test/tool/build/pledge_test.sh ape_assimilated_test_suite || exit
@@ -59,41 +59,41 @@ if [ "$1" = setuid_setup ]; then
   rm -rf $t || exit
   mkdir -p $t || exit
   chmod 01777 $t || exit
-  cp o/$m/tool/build/pledge.com $t || exit
-  chmod 06755 $t/pledge.com || exit
+  cp o/$m/tool/build/pledge $t || exit
+  chmod 06755 $t/pledge || exit
 
 elif [ "$1" = ape_binfmt_test_suite ]; then
 
   ape/apeinstall.sh >/dev/null 2>&1
 
-  startit ape binfmt life.com
-  o/fastbuild/tool/build/pledge.com -p 'stdio rpath prot_exec' o/fastbuild/examples/life.com
+  startit ape binfmt life
+  o/fastbuild/tool/build/pledge -p 'stdio rpath prot_exec' o/fastbuild/examples/life
   [ $? = 42 ]
   checkem
 
-  startit ape binfmt hello.com
-  [ "$(o/fastbuild/tool/build/pledge.com -p 'stdio rpath prot_exec' o/fastbuild/examples/hello.com)" = "hello world" ]
+  startit ape binfmt hello
+  [ "$(o/fastbuild/tool/build/pledge -p 'stdio rpath prot_exec' o/fastbuild/examples/hello)" = "hello world" ]
   checkem
 
-  startit ape binfmt curl.com
-  [ "$(o/fastbuild/tool/build/pledge.com -p 'stdio inet dns rpath prot_exec' o/fastbuild/tool/curl/curl.com https://justine.lol/hello.txt)" = "hello world" ]
+  startit ape binfmt curl
+  [ "$(o/fastbuild/tool/build/pledge -p 'stdio inet dns rpath prot_exec' o/fastbuild/tool/curl/curl https://justine.lol/hello.txt)" = "hello world" ]
   checkem
 
 elif [ "$1" = ape_loader_test_suite ]; then
 
   ape/apeuninstall.sh >/dev/null 2>&1
 
-  startit ape loader life.com
-  o/fastbuild/tool/build/pledge.com -p 'stdio rpath prot_exec' o/fastbuild/examples/life.com
+  startit ape loader life
+  o/fastbuild/tool/build/pledge -p 'stdio rpath prot_exec' o/fastbuild/examples/life
   [ $? = 42 ]
   checkem
 
-  startit ape loader hello.com
-  [ "$(o/fastbuild/tool/build/pledge.com -p 'stdio rpath prot_exec' o/fastbuild/examples/hello.com)" = "hello world" ]
+  startit ape loader hello
+  [ "$(o/fastbuild/tool/build/pledge -p 'stdio rpath prot_exec' o/fastbuild/examples/hello)" = "hello world" ]
   checkem
 
-  startit ape loader curl.com
-  [ "$(o/fastbuild/tool/build/pledge.com -p 'stdio inet dns rpath prot_exec' o/fastbuild/tool/curl/curl.com https://justine.lol/hello.txt)" = "hello world" ]
+  startit ape loader curl
+  [ "$(o/fastbuild/tool/build/pledge -p 'stdio inet dns rpath prot_exec' o/fastbuild/tool/curl/curl https://justine.lol/hello.txt)" = "hello world" ]
   checkem
 
   ape/apeinstall.sh >/dev/null 2>&1
@@ -102,76 +102,76 @@ elif [ "$1" = ape_assimilated_test_suite ]; then
 
   mkdir -p $t/assimilated
 
-  startit ape assimilated life.com
-  cp o/fastbuild/examples/life.com $t/assimilated
-  o/fastbuild/tool/build/assimilate.com $t/assimilated/life.com
-  o/$m/tool/build/pledge.com -p 'stdio' $t/assimilated/life.com
+  startit ape assimilated life
+  cp o/fastbuild/examples/life $t/assimilated
+  o/fastbuild/tool/build/assimilate $t/assimilated/life
+  o/$m/tool/build/pledge -p 'stdio' $t/assimilated/life
   [ $? = 42 ]
   checkem
 
-  startit ape assimilated hello.com
-  cp o/fastbuild/examples/hello.com $t/assimilated
-  o/fastbuild/tool/build/assimilate.com $t/assimilated/hello.com
-  [ "$(o/$m/tool/build/pledge.com -p 'stdio' $t/assimilated/hello.com)" = "hello world" ]
+  startit ape assimilated hello
+  cp o/fastbuild/examples/hello $t/assimilated
+  o/fastbuild/tool/build/assimilate $t/assimilated/hello
+  [ "$(o/$m/tool/build/pledge -p 'stdio' $t/assimilated/hello)" = "hello world" ]
   checkem
 
-  startit ape assimilated curl.com
-  cp o/fastbuild/tool/curl/curl.com $t/assimilated
-  o/fastbuild/tool/build/assimilate.com $t/assimilated/curl.com
-  [ "$(o/$m/tool/build/pledge.com -p 'stdio rpath inet dns' $t/assimilated/curl.com https://justine.lol/hello.txt)" = "hello world" ]
+  startit ape assimilated curl
+  cp o/fastbuild/tool/curl/curl $t/assimilated
+  o/fastbuild/tool/build/assimilate $t/assimilated/curl
+  [ "$(o/$m/tool/build/pledge -p 'stdio rpath inet dns' $t/assimilated/curl https://justine.lol/hello.txt)" = "hello world" ]
   checkem
 
 elif [ "$1" = ape_native_test_suite ]; then
 
-  startit ape native life.com
-  o/$m/tool/build/pledge.com -p 'stdio' o/$m/examples/life.com
+  startit ape native life
+  o/$m/tool/build/pledge -p 'stdio' o/$m/examples/life
   [ $? = 42 ]
   checkem
 
-  startit ape native hello.com
-  [ "$(o/$m/tool/build/pledge.com -p 'stdio' o/$m/examples/hello.com)" = "hello world" ]
+  startit ape native hello
+  [ "$(o/$m/tool/build/pledge -p 'stdio' o/$m/examples/hello)" = "hello world" ]
   checkem
 
-  startit ape native curl.com
-  [ "$(o/$m/tool/build/pledge.com -p 'stdio rpath inet dns' o/$m/tool/curl/curl.com https://justine.lol/hello.txt)" = "hello world" ]
+  startit ape native curl
+  [ "$(o/$m/tool/build/pledge -p 'stdio rpath inet dns' o/$m/tool/curl/curl https://justine.lol/hello.txt)" = "hello world" ]
   checkem
 
 elif [ "$1" = setuid_test_suite ]; then
 
-  startit setuid life.com
-  $t/pledge.com -p 'stdio' o/$m/examples/life.com
+  startit setuid life
+  $t/pledge -p 'stdio' o/$m/examples/life
   [ $? = 42 ]
   checkem
 
-  startit setuid hello.com
-  [ "$($t/pledge.com -p 'stdio' o/$m/examples/hello.com)" = "hello world" ]
+  startit setuid hello
+  [ "$($t/pledge -p 'stdio' o/$m/examples/hello)" = "hello world" ]
   checkem
 
-  startit setuid curl.com
-  [ "$($t/pledge.com -p 'stdio rpath inet dns' o/$m/tool/curl/curl.com https://justine.lol/hello.txt)" = "hello world" ]
+  startit setuid curl
+  [ "$($t/pledge -p 'stdio rpath inet dns' o/$m/tool/curl/curl https://justine.lol/hello.txt)" = "hello world" ]
   checkem
 
   startit setuid getuid
-  [ "$($t/pledge.com -p 'stdio rpath proc tty' o/$m/examples/printargs.com 2>&1 | grep getuid | grep -o [[:digit:]]*)" = "$(id -u)" ]
+  [ "$($t/pledge -p 'stdio rpath proc tty' o/$m/examples/printargs 2>&1 | grep getuid | grep -o [[:digit:]]*)" = "$(id -u)" ]
   checkem
 
   startit setuid geteuid
-  [ "$($t/pledge.com -p 'stdio rpath proc tty' o/$m/examples/printargs.com 2>&1 | grep geteuid | grep -o [[:digit:]]*)" = "$(id -u)" ]
+  [ "$($t/pledge -p 'stdio rpath proc tty' o/$m/examples/printargs 2>&1 | grep geteuid | grep -o [[:digit:]]*)" = "$(id -u)" ]
   checkem
 
   startit setuid no capabilities
-  [ "$($t/pledge.com -p 'stdio rpath proc tty' o/$m/examples/printargs.com 2>&1 | grep CAP_ | wc -l)" = 0 ]
+  [ "$($t/pledge -p 'stdio rpath proc tty' o/$m/examples/printargs 2>&1 | grep CAP_ | wc -l)" = 0 ]
   checkem
 
   startit setuid maximum nice
-  $t/pledge.com -np 'stdio rpath proc tty' o/$m/examples/printargs.com 2>&1 | grep SCHED_IDLE >/dev/null
+  $t/pledge -np 'stdio rpath proc tty' o/$m/examples/printargs 2>&1 | grep SCHED_IDLE >/dev/null
   checkem
 
   startit setuid chroot
   mkdir $t/jail &&
   touch $t/jail/hi &&
-  cp o/$m/examples/ls.com $t/jail &&
-  $t/pledge.com -v / -c $t/jail -p 'stdio rpath' /ls.com / | grep 'DT_REG     /hi' >/dev/null
+  cp o/$m/examples/ls $t/jail &&
+  $t/pledge -v / -c $t/jail -p 'stdio rpath' /ls / | grep 'DT_REG     /hi' >/dev/null
   checkem
 
 fi
diff --git a/test/tool/net/BUILD.mk b/test/tool/net/BUILD.mk
index 704d4dc11..e86fa81cf 100644
--- a/test/tool/net/BUILD.mk
+++ b/test/tool/net/BUILD.mk
@@ -10,22 +10,22 @@ TEST_TOOL_NET_SRCS = $(filter %.c,$(TEST_TOOL_NET_FILES))
 TEST_TOOL_NET_SRCS_TEST = $(filter %_test.c,$(TEST_TOOL_NET_SRCS))
 TEST_TOOL_NET_LUAS_TEST = $(filter %_test.lua,$(TEST_TOOL_NET_FILES))
 TEST_TOOL_NET_HDRS = $(filter %.h,$(TEST_TOOL_NET_FILES))
-TEST_TOOL_NET_COMS = $(TEST_TOOL_NET_SRCS:%.c=o/$(MODE)/%.com)
+TEST_TOOL_NET_COMS = $(TEST_TOOL_NET_SRCS:%.c=o/$(MODE)/%)
 
 TEST_TOOL_NET_OBJS =						\
 	$(TEST_TOOL_NET_SRCS:%.c=o/$(MODE)/%.o)			\
-	o/$(MODE)/test/tool/net/redbean-tester.com.zip.o
+	o/$(MODE)/test/tool/net/redbean-tester.zip.o
 
 TEST_TOOL_NET_BINS =						\
 	$(TEST_TOOL_NET_COMS)					\
 	$(TEST_TOOL_NET_COMS:%=%.dbg)
 
 TEST_TOOL_NET_TESTS =						\
-	$(TEST_TOOL_NET_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_TOOL_NET_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_TOOL_NET_CHECKS =						\
 	$(TEST_TOOL_NET_HDRS:%=o/$(MODE)/%.ok)			\
-	$(TEST_TOOL_NET_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)	\
+	$(TEST_TOOL_NET_SRCS_TEST:%.c=o/$(MODE)/%.runs)		\
 	$(TEST_TOOL_NET_LUAS_TEST:%.lua=o/$(MODE)/%.lua.runs)
 
 TEST_TOOL_NET_DIRECTDEPS =					\
@@ -60,7 +60,7 @@ $(TEST_TOOL_NET_A).pkg:						\
 		$(TEST_TOOL_NET_OBJS)				\
 		$(foreach x,$(TEST_TOOL_NET_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/tool/net/%.com.dbg:				\
+o/$(MODE)/test/tool/net/%.dbg:					\
 		$(TEST_TOOL_NET_DEPS)				\
 		$(TEST_TOOL_NET_A)				\
 		o/$(MODE)/test/tool/net/%.o			\
@@ -70,7 +70,8 @@ o/$(MODE)/test/tool/net/%.com.dbg:				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/tool/net/redbean-tester.com.dbg:			\
+.PRECIOUS: o/$(MODE)/test/tool/net/redbean-tester
+o/$(MODE)/test/tool/net/redbean-tester.dbg:			\
 		$(TOOL_NET_DEPS)				\
 		o/$(MODE)/tool/net/redbean.o			\
 		$(TOOL_NET_REDBEAN_LUA_MODULES)			\
@@ -80,20 +81,10 @@ o/$(MODE)/test/tool/net/redbean-tester.com.dbg:			\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/tool/net/redbean-tester.com:			\
-		o/$(MODE)/test/tool/net/redbean-tester.com.dbg	\
-		o/$(MODE)/third_party/zip/zip.com		\
-		o/$(MODE)/tool/build/symtab.com			\
-		$(TOOL_NET_REDBEAN_STANDARD_ASSETS)
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-	@$(TOOL_NET_REDBEAN_STANDARD_ASSETS_ZIP)
-
-o/$(MODE)/test/tool/net/redbean_test.com.runs:			\
+o/$(MODE)/test/tool/net/redbean_test.runs:			\
 		private .PLEDGE = stdio rpath wpath cpath fattr proc inet
 
-o/$(MODE)/test/tool/net/sqlite_test.com.runs:			\
+o/$(MODE)/test/tool/net/sqlite_test.runs:			\
 		private .PLEDGE = stdio rpath wpath cpath fattr proc flock
 
 .PHONY: o/$(MODE)/test/tool/net
diff --git a/test/tool/net/redbean_test.c b/test/tool/net/redbean_test.c
index 64ad6a317..39fcbb4e1 100644
--- a/test/tool/net/redbean_test.c
+++ b/test/tool/net/redbean_test.c
@@ -42,7 +42,7 @@
 #ifdef __x86_64__
 
 __static_yoink("zipos");
-__static_yoink("o/" MODE "/test/tool/net/redbean-tester.com");
+__static_yoink("o/" MODE "/test/tool/net/redbean-tester");
 
 int port;
 
@@ -53,9 +53,9 @@ void SetUpOnce(void) {
   if (IsWindows()) return;
   testlib_enable_tmp_setup_teardown_once();
   ASSERT_NE(-1, mkdir("bin", 0755));
-  ASSERT_NE(-1, (fdin = open("/zip/o/" MODE "/test/tool/net/redbean-tester.com",
+  ASSERT_NE(-1, (fdin = open("/zip/o/" MODE "/test/tool/net/redbean-tester",
                              O_RDONLY)));
-  ASSERT_NE(-1, (fdout = creat("bin/redbean-tester.com", 0755)));
+  ASSERT_NE(-1, (fdout = creat("bin/redbean-tester", 0755)));
   for (;;) {
     ASSERT_NE(-1, (n = read(fdin, buf, sizeof(buf))));
     if (!n) break;
@@ -118,8 +118,8 @@ TEST(redbean, testOptions) {
     close(pipefds[0]);
     dup2(pipefds[1], 1);
     sigprocmask(SIG_SETMASK, &savemask, NULL);
-    execv("bin/redbean-tester.com",
-          (char *const[]){"bin/redbean-tester.com", "-vvszXp0", "-l127.0.0.1",
+    execv("bin/redbean-tester",
+          (char *const[]){"bin/redbean-tester", "-vvszXp0", "-l127.0.0.1",
                           __strace > 0 ? "--strace" : 0, 0});
     _exit(127);
   }
@@ -157,8 +157,8 @@ TEST(redbean, testPipeline) {
     close(pipefds[0]);
     dup2(pipefds[1], 1);
     sigprocmask(SIG_SETMASK, &savemask, NULL);
-    execv("bin/redbean-tester.com",
-          (char *const[]){"bin/redbean-tester.com", "-vvszXp0", "-l127.0.0.1",
+    execv("bin/redbean-tester",
+          (char *const[]){"bin/redbean-tester", "-vvszXp0", "-l127.0.0.1",
                           __strace > 0 ? "--strace" : 0, 0});
     _exit(127);
   }
@@ -205,8 +205,8 @@ TEST(redbean, testContentRange) {
     close(pipefds[0]);
     dup2(pipefds[1], 1);
     sigprocmask(SIG_SETMASK, &savemask, NULL);
-    execv("bin/redbean-tester.com",
-          (char *const[]){"bin/redbean-tester.com", "-vvszXp0", "-l127.0.0.1",
+    execv("bin/redbean-tester",
+          (char *const[]){"bin/redbean-tester", "-vvszXp0", "-l127.0.0.1",
                           __strace > 0 ? "--strace" : 0, 0});
     _exit(127);
   }
diff --git a/test/tool/plinko/BUILD.mk b/test/tool/plinko/BUILD.mk
index b1517b17d..396330be4 100644
--- a/test/tool/plinko/BUILD.mk
+++ b/test/tool/plinko/BUILD.mk
@@ -11,11 +11,11 @@ TEST_TOOL_PLINKO_FILES := $(wildcard test/tool/plinko/*)
 TEST_TOOL_PLINKO_SRCS = $(filter %.c,$(TEST_TOOL_PLINKO_FILES))
 TEST_TOOL_PLINKO_SRCS_TEST = $(filter %_test.c,$(TEST_TOOL_PLINKO_SRCS))
 TEST_TOOL_PLINKO_HDRS = $(filter %.h,$(TEST_TOOL_PLINKO_FILES))
-TEST_TOOL_PLINKO_COMS = $(TEST_TOOL_PLINKO_OBJS:%.o=%.com)
+TEST_TOOL_PLINKO_COMS = $(TEST_TOOL_PLINKO_OBJS:%.o=%)
 
 TEST_TOOL_PLINKO_OBJS =						\
 	$(TEST_TOOL_PLINKO_SRCS:%.c=o/$(MODE)/%.o)		\
-	o/$(MODE)/tool/plinko/plinko.com.zip.o			\
+	o/$(MODE)/tool/plinko/plinko.zip.o			\
 	o/$(MODE)/tool/plinko/lib/library.lisp.zip.o		\
 	o/$(MODE)/tool/plinko/lib/binarytrees.lisp.zip.o	\
 	o/$(MODE)/tool/plinko/lib/algebra.lisp.zip.o		\
@@ -25,18 +25,18 @@ TEST_TOOL_PLINKO_OBJS =						\
 	o/$(MODE)/test/tool/plinko/algebra_test.lisp.zip.o
 
 TEST_TOOL_PLINKO_COMS =						\
-	$(TEST_TOOL_PLINKO_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_TOOL_PLINKO_SRCS:%.c=o/$(MODE)/%)
 
 TEST_TOOL_PLINKO_BINS =						\
 	$(TEST_TOOL_PLINKO_COMS)				\
 	$(TEST_TOOL_PLINKO_COMS:%=%.dbg)
 
 TEST_TOOL_PLINKO_TESTS =					\
-	$(TEST_TOOL_PLINKO_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_TOOL_PLINKO_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_TOOL_PLINKO_CHECKS =					\
 	$(TEST_TOOL_PLINKO_HDRS:%=o/$(MODE)/%.ok)		\
-	$(TEST_TOOL_PLINKO_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_TOOL_PLINKO_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_TOOL_PLINKO_DIRECTDEPS =					\
 	LIBC_CALLS						\
@@ -67,7 +67,7 @@ $(TEST_TOOL_PLINKO_A).pkg:					\
 		$(TEST_TOOL_PLINKO_OBJS)			\
 		$(foreach x,$(TEST_TOOL_PLINKO_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/tool/plinko/%.com.dbg:				\
+o/$(MODE)/test/tool/plinko/%.dbg:				\
 		$(TEST_TOOL_PLINKO_DEPS)			\
 		$(TEST_TOOL_PLINKO_A)				\
 		o/$(MODE)/test/tool/plinko/%.o			\
@@ -77,7 +77,7 @@ o/$(MODE)/test/tool/plinko/%.com.dbg:				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/test/tool/plinko/plinko_test.com.runs: private	\
+o/$(MODE)/test/tool/plinko/plinko_test.runs: private		\
 		QUOTA =	-M100g
 
 o/$(MODE)/test/tool/plinko/algebra_test.lisp.zip.o: private ZIPOBJ_FLAGS += -B
diff --git a/test/tool/plinko/plinko_test.c b/test/tool/plinko/plinko_test.c
index db201931b..cefc2f192 100644
--- a/test/tool/plinko/plinko_test.c
+++ b/test/tool/plinko/plinko_test.c
@@ -30,7 +30,7 @@
 #include "libc/testlib/testlib.h"
 
 __static_yoink("zipos");
-__static_yoink("plinko.com");
+__static_yoink("plinko");
 __static_yoink("library.lisp");
 __static_yoink("library_test.lisp");
 __static_yoink("binarytrees.lisp");
@@ -54,8 +54,8 @@ void SetUpOnce(void) {
   int fdin, fdout;
   testlib_enable_tmp_setup_teardown_once();
   ASSERT_NE(-1, mkdir("bin", 0755));
-  ASSERT_NE(-1, (fdin = open("/zip/plinko.com", O_RDONLY)));
-  ASSERT_NE(-1, (fdout = creat("bin/plinko.com", 0755)));
+  ASSERT_NE(-1, (fdin = open("/zip/plinko", O_RDONLY)));
+  ASSERT_NE(-1, (fdout = creat("bin/plinko", 0755)));
   ASSERT_NE(-1, copyfd(fdin, fdout, -1));
   EXPECT_EQ(0, close(fdout));
   EXPECT_EQ(0, close(fdin));
@@ -89,8 +89,7 @@ TEST(plinko, worksOrPrintsNiceError) {
     sigaction(SIGQUIT, &savequit, 0);
     sigaction(SIGPIPE, &savepipe, 0);
     sigprocmask(SIG_SETMASK, &savemask, 0);
-    execve("bin/plinko.com", (char *const[]){"bin/plinko.com", 0},
-           (char *const[]){0});
+    execve("bin/plinko", (char *const[]){"bin/plinko", 0}, (char *const[]){0});
     _exit(127);
   }
   close(pfds[0][0]);
diff --git a/test/tool/viz/lib/BUILD.mk b/test/tool/viz/lib/BUILD.mk
index e9cad7540..2fb36620b 100644
--- a/test/tool/viz/lib/BUILD.mk
+++ b/test/tool/viz/lib/BUILD.mk
@@ -10,17 +10,17 @@ TEST_TOOL_VIZ_LIB_OBJS =				\
 	$(TEST_TOOL_VIZ_LIB_SRCS:%.c=o/$(MODE)/%.o)
 
 TEST_TOOL_VIZ_LIB_COMS =				\
-	$(TEST_TOOL_VIZ_LIB_SRCS:%.c=o/$(MODE)/%.com)
+	$(TEST_TOOL_VIZ_LIB_SRCS:%.c=o/$(MODE)/%)
 
 TEST_TOOL_VIZ_LIB_BINS =				\
 	$(TEST_TOOL_VIZ_LIB_COMS)			\
 	$(TEST_TOOL_VIZ_LIB_COMS:%=%.dbg)
 
 TEST_TOOL_VIZ_LIB_TESTS =				\
-	$(TEST_TOOL_VIZ_LIB_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
+	$(TEST_TOOL_VIZ_LIB_SRCS_TEST:%.c=o/$(MODE)/%.ok)
 
 TEST_TOOL_VIZ_LIB_CHECKS =				\
-	$(TEST_TOOL_VIZ_LIB_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+	$(TEST_TOOL_VIZ_LIB_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 TEST_TOOL_VIZ_LIB_DIRECTDEPS =				\
 	DSP_MPEG					\
@@ -45,7 +45,7 @@ o/$(MODE)/test/tool/viz/lib/vizlib.pkg:			\
 		$(TEST_TOOL_VIZ_LIB_OBJS)		\
 		$(foreach x,$(TEST_TOOL_VIZ_LIB_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/test/tool/viz/lib/%.com.dbg:			\
+o/$(MODE)/test/tool/viz/lib/%.dbg:			\
 		$(TEST_TOOL_VIZ_LIB_DEPS)		\
 		o/$(MODE)/test/tool/viz/lib/%.o		\
 		o/$(MODE)/test/tool/viz/lib/vizlib.pkg	\
diff --git a/third_party/awk/BUILD.mk b/third_party/awk/BUILD.mk
index d51409c19..a421bd448 100644
--- a/third_party/awk/BUILD.mk
+++ b/third_party/awk/BUILD.mk
@@ -40,10 +40,10 @@ $(THIRD_PARTY_AWK_A):					\
 		$(THIRD_PARTY_AWK_OBJS)
 
 $(THIRD_PARTY_AWK_A).pkg:				\
-		$(THIRD_PARTY_AWK_OBJS)		\
+		$(THIRD_PARTY_AWK_OBJS)			\
 		$(foreach x,$(THIRD_PARTY_AWK_A_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/awk/awk.com.dbg:			\
+o/$(MODE)/third_party/awk/awk.dbg:			\
 		$(THIRD_PARTY_AWK)			\
 		o/$(MODE)/third_party/awk/cmd.o		\
 		o/$(MODE)/third_party/awk/README.zip.o	\
@@ -56,7 +56,7 @@ o/$(MODE)/third_party/awk/README.zip.o:			\
 			-B
 
 THIRD_PARTY_AWK_BINS = $(THIRD_PARTY_AWK_COMS) $(THIRD_PARTY_AWK_COMS:%=%.dbg)
-THIRD_PARTY_AWK_COMS = o/$(MODE)/third_party/awk/awk.com
+THIRD_PARTY_AWK_COMS = o/$(MODE)/third_party/awk/awk
 THIRD_PARTY_AWK_LIBS = $(THIRD_PARTY_AWK_A)
 $(THIRD_PARTY_AWK_OBJS): $(BUILD_FILES) third_party/awk/BUILD.mk
 
diff --git a/third_party/bash/BUILD.mk b/third_party/bash/BUILD.mk
index 790dc452d..53c3874a4 100644
--- a/third_party/bash/BUILD.mk
+++ b/third_party/bash/BUILD.mk
@@ -9,7 +9,7 @@ THIRD_PARTY_BASH_HDRS = $(filter %.h,$(THIRD_PARTY_BASH_FILES))
 THIRD_PARTY_BASH_INCS = $(filter %.inc,$(THIRD_PARTY_BASH_FILES))
 THIRD_PARTY_BASH_SRCS = $(filter %.c,$(THIRD_PARTY_BASH_FILES))
 THIRD_PARTY_BASH_OBJS = $(THIRD_PARTY_BASH_SRCS:%.c=o/$(MODE)/%.o)
-THIRD_PARTY_BASH_COMS = o/$(MODE)/third_party/bash/bash.com
+THIRD_PARTY_BASH_COMS = o/$(MODE)/third_party/bash/bash
 THIRD_PARTY_BASH_CHECKS = $(THIRD_PARTY_BASH_A).pkg
 
 THIRD_PARTY_BASH_BINS =							\
@@ -50,7 +50,7 @@ $(THIRD_PARTY_BASH_A):							\
 	$(THIRD_PARTY_BASH_A).pkg					\
 	$(filter-out %main.o,$(THIRD_PARTY_BASH_OBJS))
 
-o/$(MODE)/third_party/bash/bash.com.dbg:				\
+o/$(MODE)/third_party/bash/bash.dbg:					\
 		$(THIRD_PARTY_BASH_DEPS)				\
 		$(THIRD_PARTY_BASH_A)					\
 		$(THIRD_PARTY_BASH_A).pkg				\
diff --git a/third_party/bzip2/BUILD.mk b/third_party/bzip2/BUILD.mk
index 40be9004a..7318dd6a9 100644
--- a/third_party/bzip2/BUILD.mk
+++ b/third_party/bzip2/BUILD.mk
@@ -14,8 +14,8 @@ THIRD_PARTY_BZIP2_A_OBJS = $(THIRD_PARTY_BZIP2_A_SRCS:%.c=o/$(MODE)/%.o)
 THIRD_PARTY_BZIP2_BINS = $(THIRD_PARTY_BZIP2_COMS) $(THIRD_PARTY_BZIP2_COMS:%=%.dbg)
 
 THIRD_PARTY_BZIP2_COMS =					\
-	o/$(MODE)/third_party/bzip2/bzip2.com			\
-	o/$(MODE)/third_party/bzip2/bzip2recover.com
+	o/$(MODE)/third_party/bzip2/bzip2			\
+	o/$(MODE)/third_party/bzip2/bzip2recover
 
 THIRD_PARTY_BZIP2_A_CHECKS =					\
 	$(THIRD_PARTY_BZIP2_A).pkg				\
@@ -45,7 +45,7 @@ $(THIRD_PARTY_BZIP2_A).pkg:					\
 		$(THIRD_PARTY_BZIP2_A_OBJS)			\
 		$(foreach x,$(THIRD_PARTY_BZIP2_A_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/bzip2/bzip2.com.dbg:			\
+o/$(MODE)/third_party/bzip2/bzip2.dbg:				\
 		$(THIRD_PARTY_BZIP2)				\
 		o/$(MODE)/third_party/bzip2/bzip2.o		\
 		o/$(MODE)/third_party/bzip2/bzip2.a.pkg		\
@@ -53,7 +53,7 @@ o/$(MODE)/third_party/bzip2/bzip2.com.dbg:			\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/bzip2/bzip2recover.com.dbg:		\
+o/$(MODE)/third_party/bzip2/bzip2recover.dbg:			\
 		$(THIRD_PARTY_BZIP2)				\
 		o/$(MODE)/third_party/bzip2/bzip2recover.o	\
 		o/$(MODE)/third_party/bzip2/bzip2.a.pkg		\
@@ -82,5 +82,5 @@ o/$(MODE)/third_party/bzip2:					\
 		$(THIRD_PARTY_BZIP2_CHECKS)
 
 # TODO(jart): write regression test
-# master jart@nightmare:~/cosmo$ o//third_party/bzip2/bzip2.com -1 <third_party/bzip2/sample1.ref >a
+# master jart@nightmare:~/cosmo$ o//third_party/bzip2/bzip2 -1 <third_party/bzip2/sample1.ref >a
 # master jart@nightmare:~/cosmo$ cmp -s third_party/bzip2/sample1.bz2 a
diff --git a/third_party/chibicc/BUILD.mk b/third_party/chibicc/BUILD.mk
index e72ff7ec2..33f001406 100644
--- a/third_party/chibicc/BUILD.mk
+++ b/third_party/chibicc/BUILD.mk
@@ -12,7 +12,7 @@
 
 ifeq ($(ARCH), x86_64)
 
-CHIBICC = o/$(MODE)/third_party/chibicc/chibicc.com
+CHIBICC = o/$(MODE)/third_party/chibicc/chibicc
 CHIBICC_FLAGS =								\
 	-fno-common							\
 	-include libc/integral/normalize.inc				\
@@ -37,8 +37,8 @@ THIRD_PARTY_CHIBICC_DEFINES =						\
 	-DLDS=\"o/$(MODE)/ape/ape.lds\"
 
 THIRD_PARTY_CHIBICC_BINS =						\
-	o/$(MODE)/third_party/chibicc/chibicc.com.dbg			\
-	o/$(MODE)/third_party/chibicc/chibicc.com
+	o/$(MODE)/third_party/chibicc/chibicc.dbg			\
+	o/$(MODE)/third_party/chibicc/chibicc
 
 THIRD_PARTY_CHIBICC_A_OBJS =						\
 	$(THIRD_PARTY_CHIBICC_A_SRCS:%.c=o/$(MODE)/%.o)
@@ -77,7 +77,7 @@ $(THIRD_PARTY_CHIBICC_A).pkg:						\
 		$(THIRD_PARTY_CHIBICC_A_OBJS)				\
 		$(foreach x,$(THIRD_PARTY_CHIBICC_A_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/chibicc/chibicc.com.dbg:				\
+o/$(MODE)/third_party/chibicc/chibicc.dbg:				\
 		$(THIRD_PARTY_CHIBICC_A_DEPS)				\
 		$(THIRD_PARTY_CHIBICC_A)				\
 		$(APE_NO_MODIFY_SELF)					\
@@ -87,15 +87,7 @@ o/$(MODE)/third_party/chibicc/chibicc.com.dbg:				\
 		$(THIRD_PARTY_CHIBICC_A).pkg
 	@$(APELINK)
 
-o/$(MODE)/third_party/chibicc/chibicc.com:				\
-		o/$(MODE)/third_party/chibicc/chibicc.com.dbg		\
-		o/$(MODE)/third_party/zip/zip.com			\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
-o/$(MODE)/third_party/chibicc/as.com.dbg:				\
+o/$(MODE)/third_party/chibicc/as.dbg:					\
 		$(THIRD_PARTY_CHIBICC_A_DEPS)				\
 		$(THIRD_PARTY_CHIBICC_A)				\
 		$(APE_NO_MODIFY_SELF)					\
diff --git a/third_party/chibicc/help.txt b/third_party/chibicc/help.txt
index e7baa62f3..8fb453435 100644
--- a/third_party/chibicc/help.txt
+++ b/third_party/chibicc/help.txt
@@ -1,6 +1,6 @@
 SYNOPSIS
 
-  chibicc.com [FLAGS] INPUTS
+  chibicc [FLAGS] INPUTS
 
 DESCRIPTION
 
diff --git a/third_party/chibicc/test/BUILD.mk b/third_party/chibicc/test/BUILD.mk
index 08f704c31..f5a47118f 100644
--- a/third_party/chibicc/test/BUILD.mk
+++ b/third_party/chibicc/test/BUILD.mk
@@ -22,7 +22,7 @@ THIRD_PARTY_CHIBICC_TEST_HDRS = $(filter %.h,$(THIRD_PARTY_CHIBICC_TEST_FILES))
 THIRD_PARTY_CHIBICC_TEST_TESTS = $(THIRD_PARTY_CHIBICC_TEST_COMS:%=%.ok)
 
 THIRD_PARTY_CHIBICC_TEST_COMS =							\
-	$(THIRD_PARTY_CHIBICC_TEST_SRCS_TEST:%_test.c=o/$(MODE)/%_test.com)
+	$(THIRD_PARTY_CHIBICC_TEST_SRCS_TEST:%_test.c=o/$(MODE)/%_test)
 
 THIRD_PARTY_CHIBICC_TEST_OBJS =							\
 	$(THIRD_PARTY_CHIBICC_TEST_SRCS:%.c=o/$(MODE)/%.o)
@@ -60,7 +60,7 @@ $(THIRD_PARTY_CHIBICC_TEST_A).pkg:						\
 		o/$(MODE)/third_party/chibicc/test/common.o			\
 		$(foreach x,$(THIRD_PARTY_CHIBICC_TEST_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/chibicc/test/%.com.dbg:					\
+o/$(MODE)/third_party/chibicc/test/%.dbg:					\
 		$(THIRD_PARTY_CHIBICC_TEST_DEPS)				\
 		$(THIRD_PARTY_CHIBICC_TEST_A)					\
 		o/$(MODE)/third_party/chibicc/test/%.o				\
diff --git a/third_party/ctags/BUILD.mk b/third_party/ctags/BUILD.mk
index 72f9f143f..826ceefe4 100644
--- a/third_party/ctags/BUILD.mk
+++ b/third_party/ctags/BUILD.mk
@@ -43,7 +43,7 @@ $(THIRD_PARTY_CTAGS_A).pkg:				\
 		$(THIRD_PARTY_CTAGS_OBJS)		\
 		$(foreach x,$(THIRD_PARTY_CTAGS_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/ctags/ctags.com.dbg:		\
+o/$(MODE)/third_party/ctags/ctags.dbg:			\
 		$(THIRD_PARTY_CTAGS)			\
 		o/$(MODE)/third_party/ctags/main.o	\
 		$(CRT)					\
@@ -52,7 +52,7 @@ o/$(MODE)/third_party/ctags/ctags.com.dbg:		\
 
 THIRD_PARTY_CTAGS_LIBS = $(THIRD_PARTY_CTAGS_A)
 THIRD_PARTY_CTAGS_BINS = $(THIRD_PARTY_CTAGS_COMS) $(THIRD_PARTY_CTAGS_COMS:%=%.dbg)
-THIRD_PARTY_CTAGS_COMS = o/$(MODE)/third_party/ctags/ctags.com
+THIRD_PARTY_CTAGS_COMS = o/$(MODE)/third_party/ctags/ctags
 $(THIRD_PARTY_CTAGS_OBJS): $(BUILD_FILES) third_party/ctags/BUILD.mk
 
 .PHONY: o/$(MODE)/third_party/ctags
diff --git a/third_party/ctags/c.c b/third_party/ctags/c.c
index cf2862ec4..2355acf20 100644
--- a/third_party/ctags/c.c
+++ b/third_party/ctags/c.c
@@ -2879,7 +2879,7 @@ extern parserDefinition* CParser (void)
 extern parserDefinition* CppParser (void)
 {
 	static const char *const extensions [] = {
-		"c++", "cc", "cp", "cpp", "cxx", "h", "h++", "hh", "hp", "hpp", "hxx",
+		"c++", "cc", "cp", "cpp", "cxx", "cu", "h", "h++", "hh", "hp", "hpp", "hxx",
 #ifndef CASE_INSENSITIVE_FILENAMES
 		"C", "H",
 #endif
diff --git a/third_party/double-conversion/test/BUILD.mk b/third_party/double-conversion/test/BUILD.mk
index 5678ef6dd..b601bd7c6 100644
--- a/third_party/double-conversion/test/BUILD.mk
+++ b/third_party/double-conversion/test/BUILD.mk
@@ -4,7 +4,7 @@
 PKGS += THIRD_PARTY_DOUBLECONVERSION_TEST
 
 THIRD_PARTY_DOUBLECONVERSION_TEST_COMS =					\
-	o/$(MODE)/third_party/double-conversion/double-conversion-tester.com
+	o/$(MODE)/third_party/double-conversion/double-conversion-tester
 
 THIRD_PARTY_DOUBLECONVERSION_TEST_BINS =					\
 	$(THIRD_PARTY_DOUBLECONVERSION_TEST_COMS)				\
@@ -51,7 +51,7 @@ THIRD_PARTY_DOUBLECONVERSION_TEST_DIRECTDEPS =					\
 THIRD_PARTY_DOUBLECONVERSION_TEST_DEPS :=					\
 	$(call uniq,$(foreach x,$(THIRD_PARTY_DOUBLECONVERSION_TEST_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/third_party/double-conversion/double-conversion-tester.com.dbg:	\
+o/$(MODE)/third_party/double-conversion/double-conversion-tester.dbg:		\
 		$(THIRD_PARTY_DOUBLECONVERSION_TEST_DEPS)			\
 		$(THIRD_PARTY_DOUBLECONVERSION_TEST_OBJS)			\
 		$(CRT)								\
@@ -75,39 +75,39 @@ THIRD_PARTY_DOUBLECONVERSION_TEST_CHECKS =					\
 # TODO(jart): find some way to run these under runitd
 
 o/$(MODE)/third_party/double-conversion/test-strtod.runs:			\
-		o/$(MODE)/third_party/double-conversion/double-conversion-tester.com
+		o/$(MODE)/third_party/double-conversion/double-conversion-tester
 	@$(COMPILE) -ACHECK -wtT$@ $< test-strtod
 
 o/$(MODE)/third_party/double-conversion/test-ieee.runs:				\
-		o/$(MODE)/third_party/double-conversion/double-conversion-tester.com
+		o/$(MODE)/third_party/double-conversion/double-conversion-tester
 	@$(COMPILE) -ACHECK -wtT$@ $< test-ieee
 
 o/$(MODE)/third_party/double-conversion/test-fixed-dtoa.runs:			\
-		o/$(MODE)/third_party/double-conversion/double-conversion-tester.com
+		o/$(MODE)/third_party/double-conversion/double-conversion-tester
 	@$(COMPILE) -ACHECK -wtT$@ $< test-fixed-dtoa
 
 o/$(MODE)/third_party/double-conversion/test-fast-dtoa.runs:			\
-		o/$(MODE)/third_party/double-conversion/double-conversion-tester.com
+		o/$(MODE)/third_party/double-conversion/double-conversion-tester
 	@$(COMPILE) -ACHECK -wtT$@ $< test-fast-dtoa
 
 o/$(MODE)/third_party/double-conversion/test-dtoa.runs:				\
-		o/$(MODE)/third_party/double-conversion/double-conversion-tester.com
+		o/$(MODE)/third_party/double-conversion/double-conversion-tester
 	@$(COMPILE) -ACHECK -wtT$@ $< test-dtoa
 
 o/$(MODE)/third_party/double-conversion/test-diy-fp.runs:			\
-		o/$(MODE)/third_party/double-conversion/double-conversion-tester.com
+		o/$(MODE)/third_party/double-conversion/double-conversion-tester
 	@$(COMPILE) -ACHECK -wtT$@ $< test-diy-fp
 
 o/$(MODE)/third_party/double-conversion/test-conversions.runs:			\
-		o/$(MODE)/third_party/double-conversion/double-conversion-tester.com
+		o/$(MODE)/third_party/double-conversion/double-conversion-tester
 	@$(COMPILE) -ACHECK -wtT$@ $< test-conversions
 
 o/$(MODE)/third_party/double-conversion/test-bignum-dtoa.runs:			\
-		o/$(MODE)/third_party/double-conversion/double-conversion-tester.com
+		o/$(MODE)/third_party/double-conversion/double-conversion-tester
 	@$(COMPILE) -ACHECK -wtT$@ $< test-bignum-dtoa
 
 o/$(MODE)/third_party/double-conversion/test-bignum.runs:			\
-		o/$(MODE)/third_party/double-conversion/double-conversion-tester.com
+		o/$(MODE)/third_party/double-conversion/double-conversion-tester
 	@$(COMPILE) -ACHECK -wtT$@ $< test-bignum
 
 .PHONY: o/$(MODE)/third_party/double-conversion/test
diff --git a/third_party/finger/BUILD.mk b/third_party/finger/BUILD.mk
index bd8f48e24..a9d5ef12f 100644
--- a/third_party/finger/BUILD.mk
+++ b/third_party/finger/BUILD.mk
@@ -42,14 +42,14 @@ $(THIRD_PARTY_FINGER_A).pkg:				\
 		$(THIRD_PARTY_FINGER_A_OBJS)		\
 		$(foreach x,$(THIRD_PARTY_FINGER_A_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/finger/finger.com.dbg:		\
+o/$(MODE)/third_party/finger/finger.dbg:		\
 		$(THIRD_PARTY_FINGER)			\
 		o/$(MODE)/third_party/finger/finger.o	\
 		$(CRT)					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-THIRD_PARTY_FINGER_COMS = o/$(MODE)/third_party/finger/finger.com
+THIRD_PARTY_FINGER_COMS = o/$(MODE)/third_party/finger/finger
 THIRD_PARTY_FINGER_BINS = $(THIRD_PARTY_FINGER_COMS) $(THIRD_PARTY_FINGER_COMS:%=%.dbg)
 THIRD_PARTY_FINGER_LIBS = $(foreach x,$(THIRD_PARTY_FINGER_ARTIFACTS),$($(x)))
 THIRD_PARTY_FINGER_SRCS = $(foreach x,$(THIRD_PARTY_FINGER_ARTIFACTS),$($(x)_SRCS))
diff --git a/third_party/less/BUILD.mk b/third_party/less/BUILD.mk
index 53a546ca4..2a0ddd0ff 100644
--- a/third_party/less/BUILD.mk
+++ b/third_party/less/BUILD.mk
@@ -9,78 +9,78 @@ THIRD_PARTY_LESS_HDRS = $(filter %.h,$(THIRD_PARTY_LESS_FILES))
 THIRD_PARTY_LESS_INCS = $(filter %.inc,$(THIRD_PARTY_LESS_FILES))
 THIRD_PARTY_LESS_SRCS = $(filter %.c,$(THIRD_PARTY_LESS_FILES))
 THIRD_PARTY_LESS_OBJS = $(THIRD_PARTY_LESS_SRCS:%.c=o/$(MODE)/%.o)
-THIRD_PARTY_LESS_COMS = o/$(MODE)/third_party/less/less.com
+THIRD_PARTY_LESS_COMS = o/$(MODE)/third_party/less/less
 THIRD_PARTY_LESS_CHECKS = $(THIRD_PARTY_LESS_A).pkg
 
-THIRD_PARTY_LESS_BINS =						\
-	$(THIRD_PARTY_LESS_COMS)				\
+THIRD_PARTY_LESS_BINS =					\
+	$(THIRD_PARTY_LESS_COMS)			\
 	$(THIRD_PARTY_LESS_COMS:%=%.dbg)
 
-THIRD_PARTY_LESS_DIRECTDEPS =					\
-	LIBC_CALLS						\
-	LIBC_FMT						\
-	LIBC_INTRIN						\
-	LIBC_MEM						\
-	LIBC_NEXGEN32E						\
-	LIBC_PROC						\
-	LIBC_RUNTIME						\
-	LIBC_STDIO						\
-	LIBC_STR						\
-	LIBC_SYSV						\
-	THIRD_PARTY_NCURSES					\
+THIRD_PARTY_LESS_DIRECTDEPS =				\
+	LIBC_CALLS					\
+	LIBC_FMT					\
+	LIBC_INTRIN					\
+	LIBC_MEM					\
+	LIBC_NEXGEN32E					\
+	LIBC_PROC					\
+	LIBC_RUNTIME					\
+	LIBC_STDIO					\
+	LIBC_STR					\
+	LIBC_SYSV					\
+	THIRD_PARTY_NCURSES				\
 	THIRD_PARTY_PCRE
 
-THIRD_PARTY_LESS_DEPS :=					\
+THIRD_PARTY_LESS_DEPS :=				\
 	$(call uniq,$(foreach x,$(THIRD_PARTY_LESS_DIRECTDEPS),$($(x))))
 
-$(THIRD_PARTY_LESS_A).pkg:					\
-	$(THIRD_PARTY_LESS_OBJS)				\
+$(THIRD_PARTY_LESS_A).pkg:				\
+	$(THIRD_PARTY_LESS_OBJS)			\
 	$(foreach x,$(THIRD_PARTY_LESS_DIRECTDEPS),$($(x)_A).pkg)
 
-$(THIRD_PARTY_LESS_A):						\
-	third_party/less/					\
-	$(THIRD_PARTY_LESS_A).pkg				\
+$(THIRD_PARTY_LESS_A):					\
+	third_party/less/				\
+	$(THIRD_PARTY_LESS_A).pkg			\
 	$(filter-out %main.o,$(THIRD_PARTY_LESS_OBJS))
 
-o/$(MODE)/third_party/less/less.com.dbg:			\
-		$(THIRD_PARTY_LESS_DEPS)			\
-		$(THIRD_PARTY_LESS_A)				\
-		$(THIRD_PARTY_LESS_A).pkg			\
-		o/$(MODE)/third_party/less/main.o		\
-		$(CRT)						\
+o/$(MODE)/third_party/less/less.dbg:			\
+		$(THIRD_PARTY_LESS_DEPS)		\
+		$(THIRD_PARTY_LESS_A)			\
+		$(THIRD_PARTY_LESS_A).pkg		\
+		o/$(MODE)/third_party/less/main.o	\
+		$(CRT)					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/less/lesskey.com.dbg:			\
-		$(THIRD_PARTY_LESS_DEPS)			\
-		$(THIRD_PARTY_LESS_A)				\
-		$(THIRD_PARTY_LESS_A).pkg			\
-		o/$(MODE)/third_party/less/lesskey.o		\
-		$(CRT)						\
+o/$(MODE)/third_party/less/lesskey.dbg:			\
+		$(THIRD_PARTY_LESS_DEPS)		\
+		$(THIRD_PARTY_LESS_A)			\
+		$(THIRD_PARTY_LESS_A).pkg		\
+		o/$(MODE)/third_party/less/lesskey.o	\
+		$(CRT)					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/less/lessecho.com.dbg:			\
-		$(THIRD_PARTY_LESS_DEPS)			\
-		$(THIRD_PARTY_LESS_A)				\
-		$(THIRD_PARTY_LESS_A).pkg			\
-		o/$(MODE)/third_party/less/lessecho.o		\
-		$(CRT)						\
+o/$(MODE)/third_party/less/lessecho.dbg:		\
+		$(THIRD_PARTY_LESS_DEPS)		\
+		$(THIRD_PARTY_LESS_A)			\
+		$(THIRD_PARTY_LESS_A).pkg		\
+		o/$(MODE)/third_party/less/lessecho.o	\
+		$(CRT)					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/less/screen.o: private			\
-		CFLAGS +=					\
+o/$(MODE)/third_party/less/screen.o: private		\
+		CFLAGS +=				\
 			-fportcosmo
 
-$(THIRD_PARTY_LESS_OBJS): private				\
-		CPPFLAGS +=					\
-			-DBINDIR=\"/opt/cosmos/bin\"		\
+$(THIRD_PARTY_LESS_OBJS): private			\
+		CPPFLAGS +=				\
+			-DBINDIR=\"/opt/cosmos/bin\"	\
 			-DSYSDIR=\"/opt/cosmos/etc\"
 
 $(THIRD_PARTY_LESS_OBJS): third_party/less/BUILD.mk
 
 .PHONY: o/$(MODE)/third_party/less
-o/$(MODE)/third_party/less:					\
-		$(THIRD_PARTY_LESS_BINS)			\
+o/$(MODE)/third_party/less:				\
+		$(THIRD_PARTY_LESS_BINS)		\
 		$(THIRD_PARTY_LESS_CHECKS)
diff --git a/third_party/libcxxabi/test/BUILD.mk b/third_party/libcxxabi/test/BUILD.mk
index 6bc0d5861..6899daa64 100644
--- a/third_party/libcxxabi/test/BUILD.mk
+++ b/third_party/libcxxabi/test/BUILD.mk
@@ -80,7 +80,7 @@ THIRD_PARTY_LIBCXXABI_TEST_COMS_SRCS =					\
 	$(filter-out %.pass.cc,$(THIRD_PARTY_LIBCXXABI_TEST_SRCS))
 
 THIRD_PARTY_LIBCXXABI_TEST_COMS =					\
-	$(THIRD_PARTY_LIBCXXABI_TEST_COMS_SRCS:%.cc=o/$(MODE)/%.com)
+	$(THIRD_PARTY_LIBCXXABI_TEST_COMS_SRCS:%.cc=o/$(MODE)/%)
 
 THIRD_PARTY_LIBCXXABI_TEST_TESTS =					\
 	$(THIRD_PARTY_LIBCXXABI_TEST_COMS:%=%.ok)
@@ -118,7 +118,7 @@ $(THIRD_PARTY_LIBCXXABI_TEST_A).pkg:					\
 		$(foreach x,$(THIRD_PARTY_LIBCXXABI_TEST_DIRECTDEPS),$($(x)_A).pkg) \
 		$(THIRD_PARTY_LIBCXXABI_TEST_OBJS)
 
-o/$(MODE)/third_party/libcxxabi/test/%.com.dbg:				\
+o/$(MODE)/third_party/libcxxabi/test/%.dbg:				\
 		$(THIRD_PARTY_LIBCXXABI_TEST_DEPS)			\
 		$(THIRD_PARTY_LIBCXXABI_TEST_A)				\
 		o/$(MODE)/third_party/libcxxabi/test/%.o		\
diff --git a/third_party/lua/BUILD.mk b/third_party/lua/BUILD.mk
index bd62923b2..4aa974277 100644
--- a/third_party/lua/BUILD.mk
+++ b/third_party/lua/BUILD.mk
@@ -3,298 +3,290 @@
 
 PKGS += THIRD_PARTY_LUA
 
-THIRD_PARTY_LUA_COMS =							\
-	o/$(MODE)/third_party/lua/lua.com				\
-	o/$(MODE)/third_party/lua/luac.com
+THIRD_PARTY_LUA_COMS =						\
+	o/$(MODE)/third_party/lua/lua				\
+	o/$(MODE)/third_party/lua/luac
 
-THIRD_PARTY_LUA_BINS =							\
-	$(THIRD_PARTY_LUA_COMS)						\
+THIRD_PARTY_LUA_BINS =						\
+	$(THIRD_PARTY_LUA_COMS)					\
 	$(THIRD_PARTY_LUA_COMS:%=%.dbg)
 
-THIRD_PARTY_LUA_CHECKS =						\
-	$(THIRD_PARTY_LUA_A).pkg					\
-	$(THIRD_PARTY_LUA_UNIX).pkg					\
-	$(THIRD_PARTY_LUA_HDRS:%=o/$(MODE)/%.ok)			\
-	o/$(MODE)/third_party/lua/lua.com.pkg				\
-	o/$(MODE)/third_party/lua/luac.com.pkg
+THIRD_PARTY_LUA_CHECKS =					\
+	$(THIRD_PARTY_LUA_A).pkg				\
+	$(THIRD_PARTY_LUA_UNIX).pkg				\
+	$(THIRD_PARTY_LUA_HDRS:%=o/$(MODE)/%.ok)		\
+	o/$(MODE)/third_party/lua/lua.pkg			\
+	o/$(MODE)/third_party/lua/luac.pkg
 
 ################################################################################
 # lua.a
 
-THIRD_PARTY_LUA =							\
-	$(THIRD_PARTY_LUA_A_DEPS)					\
+THIRD_PARTY_LUA =						\
+	$(THIRD_PARTY_LUA_A_DEPS)				\
 	$(THIRD_PARTY_LUA_A)
 
-THIRD_PARTY_LUA_ARTIFACTS +=						\
+THIRD_PARTY_LUA_ARTIFACTS +=					\
 	THIRD_PARTY_LUA_A
 
-THIRD_PARTY_LUA_A =							\
+THIRD_PARTY_LUA_A =						\
 	o/$(MODE)/third_party/lua/lua.a
 
-THIRD_PARTY_LUA_A_HDRS =						\
-	third_party/lua/cosmo.h						\
-	third_party/lua/lapi.h						\
-	third_party/lua/lauxlib.h					\
-	third_party/lua/lcode.h						\
-	third_party/lua/lctype.h					\
-	third_party/lua/ldebug.h					\
-	third_party/lua/ldo.h						\
-	third_party/lua/lfunc.h						\
-	third_party/lua/lgc.h						\
-	third_party/lua/llex.h						\
-	third_party/lua/llimits.h					\
-	third_party/lua/lmem.h						\
-	third_party/lua/lobject.h					\
-	third_party/lua/lopcodes.h					\
-	third_party/lua/lparser.h					\
-	third_party/lua/lprefix.h					\
-	third_party/lua/lrepl.h						\
-	third_party/lua/lstate.h					\
-	third_party/lua/lstring.h					\
-	third_party/lua/ltable.h					\
-	third_party/lua/ltests.h					\
-	third_party/lua/ltm.h						\
-	third_party/lua/lua.h						\
-	third_party/lua/luaconf.h					\
-	third_party/lua/lualib.h					\
-	third_party/lua/lundump.h					\
-	third_party/lua/lvm.h						\
-	third_party/lua/lzio.h						\
-	third_party/lua/tms.h						\
+THIRD_PARTY_LUA_A_HDRS =					\
+	third_party/lua/cosmo.h					\
+	third_party/lua/lapi.h					\
+	third_party/lua/lauxlib.h				\
+	third_party/lua/lcode.h					\
+	third_party/lua/lctype.h				\
+	third_party/lua/ldebug.h				\
+	third_party/lua/ldo.h					\
+	third_party/lua/lfunc.h					\
+	third_party/lua/lgc.h					\
+	third_party/lua/llex.h					\
+	third_party/lua/llimits.h				\
+	third_party/lua/lmem.h					\
+	third_party/lua/lobject.h				\
+	third_party/lua/lopcodes.h				\
+	third_party/lua/lparser.h				\
+	third_party/lua/lprefix.h				\
+	third_party/lua/lrepl.h					\
+	third_party/lua/lstate.h				\
+	third_party/lua/lstring.h				\
+	third_party/lua/ltable.h				\
+	third_party/lua/ltests.h				\
+	third_party/lua/ltm.h					\
+	third_party/lua/lua.h					\
+	third_party/lua/luaconf.h				\
+	third_party/lua/lualib.h				\
+	third_party/lua/lundump.h				\
+	third_party/lua/lvm.h					\
+	third_party/lua/lzio.h					\
+	third_party/lua/tms.h					\
 	third_party/lua/visitor.h
 
-THIRD_PARTY_LUA_A_INCS =						\
-	third_party/lua/ljumptab.inc					\
+THIRD_PARTY_LUA_A_INCS =					\
+	third_party/lua/ljumptab.inc				\
 	third_party/lua/lopnames.inc
 
-THIRD_PARTY_LUA_A_SRCS =						\
-	third_party/lua/lapi.c						\
-	third_party/lua/lauxlib.c					\
-	third_party/lua/lbaselib.c					\
-	third_party/lua/lcode.c						\
-	third_party/lua/lcorolib.c					\
-	third_party/lua/ldblib.c					\
-	third_party/lua/ldebug.c					\
-	third_party/lua/ldo.c						\
-	third_party/lua/ldump.c						\
-	third_party/lua/lfunc.c						\
-	third_party/lua/lgc.c						\
-	third_party/lua/linit.c						\
-	third_party/lua/liolib.c					\
-	third_party/lua/llex.c						\
-	third_party/lua/llock.c						\
-	third_party/lua/lmathlib.c					\
-	third_party/lua/lmem.c						\
-	third_party/lua/lnotice.c					\
-	third_party/lua/loadlib.c					\
-	third_party/lua/lobject.c					\
-	third_party/lua/lopcodes.c					\
-	third_party/lua/loslib.c					\
-	third_party/lua/lparser.c					\
-	third_party/lua/lrepl.c						\
-	third_party/lua/lstate.c					\
-	third_party/lua/lstring.c					\
-	third_party/lua/lstrlib.c					\
-	third_party/lua/ltable.c					\
-	third_party/lua/ltablib.c					\
-	third_party/lua/ltests.c					\
-	third_party/lua/ltm.c						\
-	third_party/lua/luacallwithtrace.c				\
-	third_party/lua/luaencodejsondata.c				\
-	third_party/lua/luaencodeluadata.c				\
-	third_party/lua/luaencodeurl.c					\
-	third_party/lua/luaformatstack.c				\
-	third_party/lua/luaparseurl.c					\
-	third_party/lua/luaprintstack.c					\
-	third_party/lua/luapushheader.c					\
-	third_party/lua/luapushheaders.c				\
-	third_party/lua/luapushlatin1.c					\
-	third_party/lua/luapushurlparams.c				\
-	third_party/lua/lundump.c					\
-	third_party/lua/lutf8lib.c					\
-	third_party/lua/lvm.c						\
-	third_party/lua/lzio.c						\
-	third_party/lua/serialize.c					\
+THIRD_PARTY_LUA_A_SRCS =					\
+	third_party/lua/lapi.c					\
+	third_party/lua/lauxlib.c				\
+	third_party/lua/lbaselib.c				\
+	third_party/lua/lcode.c					\
+	third_party/lua/lcorolib.c				\
+	third_party/lua/ldblib.c				\
+	third_party/lua/ldebug.c				\
+	third_party/lua/ldo.c					\
+	third_party/lua/ldump.c					\
+	third_party/lua/lfunc.c					\
+	third_party/lua/lgc.c					\
+	third_party/lua/linit.c					\
+	third_party/lua/liolib.c				\
+	third_party/lua/llex.c					\
+	third_party/lua/llock.c					\
+	third_party/lua/lmathlib.c				\
+	third_party/lua/lmem.c					\
+	third_party/lua/lnotice.c				\
+	third_party/lua/loadlib.c				\
+	third_party/lua/lobject.c				\
+	third_party/lua/lopcodes.c				\
+	third_party/lua/loslib.c				\
+	third_party/lua/lparser.c				\
+	third_party/lua/lrepl.c					\
+	third_party/lua/lstate.c				\
+	third_party/lua/lstring.c				\
+	third_party/lua/lstrlib.c				\
+	third_party/lua/ltable.c				\
+	third_party/lua/ltablib.c				\
+	third_party/lua/ltests.c				\
+	third_party/lua/ltm.c					\
+	third_party/lua/luacallwithtrace.c			\
+	third_party/lua/luaencodejsondata.c			\
+	third_party/lua/luaencodeluadata.c			\
+	third_party/lua/luaencodeurl.c				\
+	third_party/lua/luaformatstack.c			\
+	third_party/lua/luaparseurl.c				\
+	third_party/lua/luaprintstack.c				\
+	third_party/lua/luapushheader.c				\
+	third_party/lua/luapushheaders.c			\
+	third_party/lua/luapushlatin1.c				\
+	third_party/lua/luapushurlparams.c			\
+	third_party/lua/lundump.c				\
+	third_party/lua/lutf8lib.c				\
+	third_party/lua/lvm.c					\
+	third_party/lua/lzio.c					\
+	third_party/lua/serialize.c				\
 	third_party/lua/visitor.c
 
-THIRD_PARTY_LUA_A_OBJS =						\
+THIRD_PARTY_LUA_A_OBJS =					\
 	$(THIRD_PARTY_LUA_A_SRCS:%.c=o/$(MODE)/%.o)
 
-THIRD_PARTY_LUA_A_DIRECTDEPS =						\
-	LIBC_CALLS							\
-	LIBC_FMT							\
-	LIBC_INTRIN							\
-	LIBC_MEM							\
-	LIBC_NEXGEN32E							\
-	LIBC_PROC							\
-	LIBC_RUNTIME							\
-	LIBC_STDIO							\
-	LIBC_STR							\
-	LIBC_SYSV							\
-	LIBC_LOG							\
-	LIBC_TIME							\
-	LIBC_X								\
-	LIBC_TINYMATH							\
-	NET_HTTP							\
-	THIRD_PARTY_LINENOISE						\
-	THIRD_PARTY_DOUBLECONVERSION					\
+THIRD_PARTY_LUA_A_DIRECTDEPS =					\
+	LIBC_CALLS						\
+	LIBC_FMT						\
+	LIBC_INTRIN						\
+	LIBC_MEM						\
+	LIBC_NEXGEN32E						\
+	LIBC_PROC						\
+	LIBC_RUNTIME						\
+	LIBC_STDIO						\
+	LIBC_STR						\
+	LIBC_SYSV						\
+	LIBC_LOG						\
+	LIBC_TIME						\
+	LIBC_X							\
+	LIBC_TINYMATH						\
+	NET_HTTP						\
+	THIRD_PARTY_LINENOISE					\
+	THIRD_PARTY_DOUBLECONVERSION				\
 	THIRD_PARTY_GDTOA
 
-THIRD_PARTY_LUA_A_DEPS :=						\
+THIRD_PARTY_LUA_A_DEPS :=					\
 	$(call uniq,$(foreach x,$(THIRD_PARTY_LUA_A_DIRECTDEPS),$($(x))))
 
-$(THIRD_PARTY_LUA_A):							\
-		third_party/lua/					\
-		$(THIRD_PARTY_LUA_A).pkg				\
+$(THIRD_PARTY_LUA_A):						\
+		third_party/lua/				\
+		$(THIRD_PARTY_LUA_A).pkg			\
 		$(THIRD_PARTY_LUA_A_OBJS)
 
-$(THIRD_PARTY_LUA_A).pkg:						\
-		$(THIRD_PARTY_LUA_A_OBJS)				\
+$(THIRD_PARTY_LUA_A).pkg:					\
+		$(THIRD_PARTY_LUA_A_OBJS)			\
 		$(foreach x,$(THIRD_PARTY_LUA_A_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/lua/lmathlib.o					\
-o//third_party/lua/lgc.o: private					\
-		CFLAGS +=						\
+o/$(MODE)/third_party/lua/lmathlib.o				\
+o//third_party/lua/lgc.o: private				\
+		CFLAGS +=					\
 			-O2
 
-o/$(MODE)/third_party/lua/lvm.o: private				\
-		CFLAGS +=						\
+o/$(MODE)/third_party/lua/lvm.o: private			\
+		CFLAGS +=					\
 			-fno-gcse
 
-$(THIRD_PARTY_LUA_A_OBJS): private					\
-		CFLAGS +=						\
-			-ffunction-sections				\
+$(THIRD_PARTY_LUA_A_OBJS): private				\
+		CFLAGS +=					\
+			-ffunction-sections			\
 			-fdata-sections
 
 ################################################################################
 # lunix.a
 
-THIRD_PARTY_LUA_UNIX =							\
-	$(THIRD_PARTY_LUA_A_DEPS)					\
+THIRD_PARTY_LUA_UNIX =						\
+	$(THIRD_PARTY_LUA_A_DEPS)				\
 	$(THIRD_PARTY_LUA_A)
 
-THIRD_PARTY_LUA_ARTIFACTS +=						\
+THIRD_PARTY_LUA_ARTIFACTS +=					\
 	THIRD_PARTY_LUA_UNIX
 
-THIRD_PARTY_LUA_UNIX_A =							\
+THIRD_PARTY_LUA_UNIX_A =					\
 	o/$(MODE)/third_party/lua/lunix.a
 
-THIRD_PARTY_LUA_UNIX_HDRS =						\
+THIRD_PARTY_LUA_UNIX_HDRS =					\
 	third_party/lua/lunix.h
 
-THIRD_PARTY_LUA_UNIX_SRCS =						\
+THIRD_PARTY_LUA_UNIX_SRCS =					\
 	third_party/lua/lunix.c
 
-THIRD_PARTY_LUA_UNIX_OBJS =						\
+THIRD_PARTY_LUA_UNIX_OBJS =					\
 	$(THIRD_PARTY_LUA_UNIX_SRCS:%.c=o/$(MODE)/%.o)
 
-THIRD_PARTY_LUA_UNIX_DIRECTDEPS =					\
-	LIBC_CALLS							\
-	LIBC_FMT							\
-	LIBC_INTRIN							\
-	LIBC_LOG							\
-	LIBC_MEM							\
-	LIBC_NEXGEN32E							\
-	LIBC_NT_KERNEL32						\
-	LIBC_PROC							\
-	LIBC_RUNTIME							\
-	LIBC_SOCK							\
-	LIBC_STDIO							\
-	LIBC_STR							\
-	LIBC_SYSV							\
-	LIBC_THREAD							\
-	LIBC_TIME							\
-	LIBC_X								\
-	THIRD_PARTY_LUA							\
+THIRD_PARTY_LUA_UNIX_DIRECTDEPS =				\
+	LIBC_CALLS						\
+	LIBC_FMT						\
+	LIBC_INTRIN						\
+	LIBC_LOG						\
+	LIBC_MEM						\
+	LIBC_NEXGEN32E						\
+	LIBC_NT_KERNEL32					\
+	LIBC_PROC						\
+	LIBC_RUNTIME						\
+	LIBC_SOCK						\
+	LIBC_STDIO						\
+	LIBC_STR						\
+	LIBC_SYSV						\
+	LIBC_THREAD						\
+	LIBC_TIME						\
+	LIBC_X							\
+	THIRD_PARTY_LUA						\
 	THIRD_PARTY_NSYNC
 
-THIRD_PARTY_LUA_UNIX_DEPS :=						\
+THIRD_PARTY_LUA_UNIX_DEPS :=					\
 	$(call uniq,$(foreach x,$(THIRD_PARTY_LUA_UNIX_DIRECTDEPS),$($(x))))
 
-$(THIRD_PARTY_LUA_A):							\
-		third_party/lua/					\
-		$(THIRD_PARTY_LUA_UNIX_A).pkg				\
+$(THIRD_PARTY_LUA_A):						\
+		third_party/lua/				\
+		$(THIRD_PARTY_LUA_UNIX_A).pkg			\
 		$(THIRD_PARTY_LUA_UNIX_OBJS)
 
-$(THIRD_PARTY_LUA_UNIX_A).pkg:						\
-		$(THIRD_PARTY_LUA_UNIX_OBJS)				\
+$(THIRD_PARTY_LUA_UNIX_A).pkg:					\
+		$(THIRD_PARTY_LUA_UNIX_OBJS)			\
 		$(foreach x,$(THIRD_PARTY_LUA_UNIX_DIRECTDEPS),$($(x)_A).pkg)
 
 ################################################################################
-# lua.com
+# lua
 
-THIRD_PARTY_LUA_LUA_DIRECTDEPS =					\
-	LIBC_CALLS							\
-	LIBC_FMT							\
-	LIBC_INTRIN							\
-	LIBC_NEXGEN32E							\
-	LIBC_STDIO							\
-	LIBC_LOG							\
-	LIBC_STR							\
-	LIBC_SYSV							\
-	LIBC_THREAD							\
-	THIRD_PARTY_LINENOISE						\
-	THIRD_PARTY_LUA							\
-	THIRD_PARTY_LUA_UNIX						\
+THIRD_PARTY_LUA_LUA_DIRECTDEPS =				\
+	LIBC_CALLS						\
+	LIBC_FMT						\
+	LIBC_INTRIN						\
+	LIBC_NEXGEN32E						\
+	LIBC_STDIO						\
+	LIBC_LOG						\
+	LIBC_STR						\
+	LIBC_SYSV						\
+	LIBC_THREAD						\
+	THIRD_PARTY_LINENOISE					\
+	THIRD_PARTY_LUA						\
+	THIRD_PARTY_LUA_UNIX					\
 	TOOL_ARGS
 
-THIRD_PARTY_LUA_LUA_DEPS :=						\
+THIRD_PARTY_LUA_LUA_DEPS :=					\
 	$(call uniq,$(foreach x,$(THIRD_PARTY_LUA_LUA_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/third_party/lua/lua.com.pkg:					\
-		o/$(MODE)/third_party/lua/lua.main.o			\
+o/$(MODE)/third_party/lua/lua.pkg:				\
+		o/$(MODE)/third_party/lua/lua.main.o		\
 		$(foreach x,$(THIRD_PARTY_LUA_LUA_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/lua/lua.com.dbg:					\
-		$(THIRD_PARTY_LUA_LUA_DEPS)				\
-		o/$(MODE)/third_party/lua/lua.com.pkg			\
-		o/$(MODE)/third_party/lua/lua.main.o			\
-		$(CRT)							\
+o/$(MODE)/third_party/lua/lua.dbg:				\
+		$(THIRD_PARTY_LUA_LUA_DEPS)			\
+		o/$(MODE)/third_party/lua/lua.pkg		\
+		o/$(MODE)/third_party/lua/lua.main.o		\
+		$(CRT)						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/lua/lua2.com:					\
-		o/$(MODE)/third_party/lua/lua.com.dbg			\
-		o/$(MODE)/third_party/zip/zip.com			\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
 ################################################################################
-# luac.com
+# luac
 
-THIRD_PARTY_LUA_LUAC_DIRECTDEPS =					\
-	LIBC_FMT							\
-	LIBC_INTRIN							\
-	LIBC_NEXGEN32E							\
-	LIBC_RUNTIME							\
-	LIBC_STDIO							\
-	LIBC_STR							\
-	LIBC_SYSV							\
-	THIRD_PARTY_LUA							\
+THIRD_PARTY_LUA_LUAC_DIRECTDEPS =				\
+	LIBC_FMT						\
+	LIBC_INTRIN						\
+	LIBC_NEXGEN32E						\
+	LIBC_RUNTIME						\
+	LIBC_STDIO						\
+	LIBC_STR						\
+	LIBC_SYSV						\
+	THIRD_PARTY_LUA						\
 	TOOL_ARGS
 
-THIRD_PARTY_LUA_LUAC_DEPS :=						\
+THIRD_PARTY_LUA_LUAC_DEPS :=					\
 	$(call uniq,$(foreach x,$(THIRD_PARTY_LUA_LUAC_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/third_party/lua/luac.com.pkg:					\
-		o/$(MODE)/third_party/lua/luac.main.o			\
+o/$(MODE)/third_party/lua/luac.pkg:				\
+		o/$(MODE)/third_party/lua/luac.main.o		\
 		$(foreach x,$(THIRD_PARTY_LUA_LUAC_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/lua/luac.com.dbg:					\
-		$(THIRD_PARTY_LUA_LUAC_DEPS)				\
-		o/$(MODE)/third_party/lua/luac.com.pkg			\
-		o/$(MODE)/third_party/lua/luac.main.o			\
-		$(CRT)							\
+o/$(MODE)/third_party/lua/luac.dbg:				\
+		$(THIRD_PARTY_LUA_LUAC_DEPS)			\
+		o/$(MODE)/third_party/lua/luac.pkg		\
+		o/$(MODE)/third_party/lua/luac.main.o		\
+		$(CRT)						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
 ################################################################################
 
-THIRD_PARTY_LUA_SRCS =							\
-	$(foreach x,$(THIRD_PARTY_LUA_ARTIFACTS),$($(x)_SRCS))		\
-	third_party/lua/lua.main.c					\
+THIRD_PARTY_LUA_SRCS =						\
+	$(foreach x,$(THIRD_PARTY_LUA_ARTIFACTS),$($(x)_SRCS))	\
+	third_party/lua/lua.main.c				\
 	third_party/lua/luac.main.c
 
 THIRD_PARTY_LUA_LIBS = $(foreach x,$(THIRD_PARTY_LUA_ARTIFACTS),$($(x)))
@@ -304,7 +296,7 @@ THIRD_PARTY_LUA_OBJS = $(foreach x,$(THIRD_PARTY_LUA_ARTIFACTS),$($(x)_OBJS))
 $(THIRD_PARTY_LUA_OBJS): third_party/lua/BUILD.mk
 
 .PHONY: o/$(MODE)/third_party/lua
-o/$(MODE)/third_party/lua:						\
-		$(THIRD_PARTY_LUA_LIBS)					\
-		$(THIRD_PARTY_LUA_BINS)					\
+o/$(MODE)/third_party/lua:					\
+		$(THIRD_PARTY_LUA_LIBS)				\
+		$(THIRD_PARTY_LUA_BINS)				\
 		$(THIRD_PARTY_LUA_CHECKS)
diff --git a/third_party/lz4cli/BUILD.mk b/third_party/lz4cli/BUILD.mk
index 2440066db..1c5ab1f69 100644
--- a/third_party/lz4cli/BUILD.mk
+++ b/third_party/lz4cli/BUILD.mk
@@ -18,7 +18,7 @@ THIRD_PARTY_LZ4CLI_SRCS = $(filter %.c,$(THIRD_PARTY_LZ4CLI_FILES))
 THIRD_PARTY_LZ4CLI_HDRS = $(filter %.h,$(THIRD_PARTY_LZ4CLI_FILES))
 
 THIRD_PARTY_LZ4CLI =					\
-	o/$(MODE)/third_party/lz4cli/lz4cli.com
+	o/$(MODE)/third_party/lz4cli/lz4cli
 
 THIRD_PARTY_LZ4CLI_OBJS =				\
 	o/$(MODE)/third_party/lz4cli/bench.o		\
@@ -51,7 +51,7 @@ $(THIRD_PARTY_LZ4CLI_OBJS): private			\
 	DEFAULT_CPPFLAGS +=				\
 		-isystem third_party/lz4cli
 
-o/$(MODE)/third_party/lz4cli/lz4cli.com.dbg:		\
+o/$(MODE)/third_party/lz4cli/lz4cli.dbg:		\
 		$(THIRD_PARTY_LZ4CLI_DEPS)		\
 		$(THIRD_PARTY_LZ4CLI_OBJS)		\
 		$(CRT)					\
diff --git a/third_party/make/BUILD.mk b/third_party/make/BUILD.mk
index 156a812a0..a08f76e65 100644
--- a/third_party/make/BUILD.mk
+++ b/third_party/make/BUILD.mk
@@ -8,7 +8,7 @@ THIRD_PARTY_MAKE_FILES := $(wildcard third_party/make/*)
 THIRD_PARTY_MAKE_HDRS = $(filter %.h,$(THIRD_PARTY_MAKE_FILES))
 THIRD_PARTY_MAKE_SRCS = $(filter %.c,$(THIRD_PARTY_MAKE_FILES))
 THIRD_PARTY_MAKE_OBJS = $(THIRD_PARTY_MAKE_SRCS:%.c=o/$(MODE)/%.o)
-THIRD_PARTY_MAKE_COMS = o/$(MODE)/third_party/make/make.com
+THIRD_PARTY_MAKE_COMS = o/$(MODE)/third_party/make/make
 THIRD_PARTY_MAKE_CHECKS = $(THIRD_PARTY_MAKE_A).pkg
 
 THIRD_PARTY_MAKE_BINS =					\
@@ -43,7 +43,7 @@ $(THIRD_PARTY_MAKE_A):					\
 	$(THIRD_PARTY_MAKE_A).pkg			\
 	$(filter-out %main.o,$(THIRD_PARTY_MAKE_OBJS))
 
-o/$(MODE)/third_party/make/make.com.dbg:		\
+o/$(MODE)/third_party/make/make.dbg:			\
 		$(THIRD_PARTY_MAKE_DEPS)		\
 		$(THIRD_PARTY_MAKE_A)			\
 		$(THIRD_PARTY_MAKE_A).pkg		\
diff --git a/third_party/mbedtls/speed.sh b/third_party/mbedtls/speed.sh
index 06de7163f..8178ce2e0 100755
--- a/third_party/mbedtls/speed.sh
+++ b/third_party/mbedtls/speed.sh
@@ -7,74 +7,74 @@ run() {
 }
 
 (
-  run o//third_party/mbedtls/test/test_suite_aes.cbc.com
-  run o//third_party/mbedtls/test/test_suite_aes.cfb.com
-  run o//third_party/mbedtls/test/test_suite_aes.ecb.com
-  run o//third_party/mbedtls/test/test_suite_aes.ofb.com
-  run o//third_party/mbedtls/test/test_suite_aes.rest.com
-  run o//third_party/mbedtls/test/test_suite_aes.xts.com
-  run o//third_party/mbedtls/test/test_suite_asn1parse.com
-  run o//third_party/mbedtls/test/test_suite_asn1write.com
-  run o//third_party/mbedtls/test/test_suite_base64.com
-  run o//third_party/mbedtls/test/test_suite_blowfish.com
-  run o//third_party/mbedtls/test/test_suite_chacha20.com
-  run o//third_party/mbedtls/test/test_suite_chachapoly.com
-  run o//third_party/mbedtls/test/test_suite_cipher.aes.com
-  run o//third_party/mbedtls/test/test_suite_cipher.blowfish.com
-  run o//third_party/mbedtls/test/test_suite_cipher.ccm.com
-  run o//third_party/mbedtls/test/test_suite_cipher.chacha20.com
-  run o//third_party/mbedtls/test/test_suite_cipher.chachapoly.com
-  run o//third_party/mbedtls/test/test_suite_cipher.des.com
-  run o//third_party/mbedtls/test/test_suite_cipher.gcm.com
-  run o//third_party/mbedtls/test/test_suite_cipher.misc.com
-  run o//third_party/mbedtls/test/test_suite_cipher.nist_kw.com
-  run o//third_party/mbedtls/test/test_suite_cipher.null.com
-  run o//third_party/mbedtls/test/test_suite_cipher.padding.com
-  run o//third_party/mbedtls/test/test_suite_ctr_drbg.com
-  run o//third_party/mbedtls/test/test_suite_des.com
-  run o//third_party/mbedtls/test/test_suite_dhm.com
-  run o//third_party/mbedtls/test/test_suite_ecdh.com
-  run o//third_party/mbedtls/test/test_suite_ecdsa.com
-  run o//third_party/mbedtls/test/test_suite_ecjpake.com
-  run o//third_party/mbedtls/test/test_suite_ecp.com
-  run o//third_party/mbedtls/test/test_suite_entropy.com
-  run o//third_party/mbedtls/test/test_suite_error.com
-  run o//third_party/mbedtls/test/test_suite_gcm.aes128_de.com
-  run o//third_party/mbedtls/test/test_suite_gcm.aes128_en.com
-  run o//third_party/mbedtls/test/test_suite_gcm.aes192_de.com
-  run o//third_party/mbedtls/test/test_suite_gcm.aes192_en.com
-  run o//third_party/mbedtls/test/test_suite_gcm.aes256_de.com
-  run o//third_party/mbedtls/test/test_suite_gcm.aes256_en.com
-  run o//third_party/mbedtls/test/test_suite_gcm.misc.com
-  run o//third_party/mbedtls/test/test_suite_hkdf.com
-  run o//third_party/mbedtls/test/test_suite_hmac_drbg.misc.com
-  run o//third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed.com
-  run o//third_party/mbedtls/test/test_suite_hmac_drbg.nopr.com
-  run o//third_party/mbedtls/test/test_suite_hmac_drbg.pr.com
-  run o//third_party/mbedtls/test/test_suite_md.com
-  run o//third_party/mbedtls/test/test_suite_mdx.com
-  run o//third_party/mbedtls/test/test_suite_memory_buffer_alloc.com
-  run o//third_party/mbedtls/test/test_suite_mpi.com
-  run o//third_party/mbedtls/test/test_suite_net.com
-  run o//third_party/mbedtls/test/test_suite_nist_kw.com
-  run o//third_party/mbedtls/test/test_suite_oid.com
-  run o//third_party/mbedtls/test/test_suite_pem.com
-  run o//third_party/mbedtls/test/test_suite_pk.com
-  run o//third_party/mbedtls/test/test_suite_pkcs1_v15.com
-  run o//third_party/mbedtls/test/test_suite_pkcs1_v21.com
-  run o//third_party/mbedtls/test/test_suite_pkcs5.com
-  run o//third_party/mbedtls/test/test_suite_pkparse.com
-  run o//third_party/mbedtls/test/test_suite_pkwrite.com
-  run o//third_party/mbedtls/test/test_suite_poly1305.com
-  run o//third_party/mbedtls/test/test_suite_random.com
-  run o//third_party/mbedtls/test/test_suite_rsa.com
-  run o//third_party/mbedtls/test/test_suite_shax.com
-  run o//third_party/mbedtls/test/test_suite_ssl.com
-  run o//third_party/mbedtls/test/test_suite_timing.com
-  run o//third_party/mbedtls/test/test_suite_version.com
-  run o//third_party/mbedtls/test/test_suite_x509parse.com
-  run o//third_party/mbedtls/test/test_suite_x509write.com
-) | o//tool/build/deltaify2.com | sort -n | tee speed.txt
+  run o//third_party/mbedtls/test/test_suite_aes.cbc
+  run o//third_party/mbedtls/test/test_suite_aes.cfb
+  run o//third_party/mbedtls/test/test_suite_aes.ecb
+  run o//third_party/mbedtls/test/test_suite_aes.ofb
+  run o//third_party/mbedtls/test/test_suite_aes.rest
+  run o//third_party/mbedtls/test/test_suite_aes.xts
+  run o//third_party/mbedtls/test/test_suite_asn1parse
+  run o//third_party/mbedtls/test/test_suite_asn1write
+  run o//third_party/mbedtls/test/test_suite_base64
+  run o//third_party/mbedtls/test/test_suite_blowfish
+  run o//third_party/mbedtls/test/test_suite_chacha20
+  run o//third_party/mbedtls/test/test_suite_chachapoly
+  run o//third_party/mbedtls/test/test_suite_cipher.aes
+  run o//third_party/mbedtls/test/test_suite_cipher.blowfish
+  run o//third_party/mbedtls/test/test_suite_cipher.ccm
+  run o//third_party/mbedtls/test/test_suite_cipher.chacha20
+  run o//third_party/mbedtls/test/test_suite_cipher.chachapoly
+  run o//third_party/mbedtls/test/test_suite_cipher.des
+  run o//third_party/mbedtls/test/test_suite_cipher.gcm
+  run o//third_party/mbedtls/test/test_suite_cipher.misc
+  run o//third_party/mbedtls/test/test_suite_cipher.nist_kw
+  run o//third_party/mbedtls/test/test_suite_cipher.null
+  run o//third_party/mbedtls/test/test_suite_cipher.padding
+  run o//third_party/mbedtls/test/test_suite_ctr_drbg
+  run o//third_party/mbedtls/test/test_suite_des
+  run o//third_party/mbedtls/test/test_suite_dhm
+  run o//third_party/mbedtls/test/test_suite_ecdh
+  run o//third_party/mbedtls/test/test_suite_ecdsa
+  run o//third_party/mbedtls/test/test_suite_ecjpake
+  run o//third_party/mbedtls/test/test_suite_ecp
+  run o//third_party/mbedtls/test/test_suite_entropy
+  run o//third_party/mbedtls/test/test_suite_error
+  run o//third_party/mbedtls/test/test_suite_gcm.aes128_de
+  run o//third_party/mbedtls/test/test_suite_gcm.aes128_en
+  run o//third_party/mbedtls/test/test_suite_gcm.aes192_de
+  run o//third_party/mbedtls/test/test_suite_gcm.aes192_en
+  run o//third_party/mbedtls/test/test_suite_gcm.aes256_de
+  run o//third_party/mbedtls/test/test_suite_gcm.aes256_en
+  run o//third_party/mbedtls/test/test_suite_gcm.misc
+  run o//third_party/mbedtls/test/test_suite_hkdf
+  run o//third_party/mbedtls/test/test_suite_hmac_drbg.misc
+  run o//third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed
+  run o//third_party/mbedtls/test/test_suite_hmac_drbg.nopr
+  run o//third_party/mbedtls/test/test_suite_hmac_drbg.pr
+  run o//third_party/mbedtls/test/test_suite_md
+  run o//third_party/mbedtls/test/test_suite_mdx
+  run o//third_party/mbedtls/test/test_suite_memory_buffer_alloc
+  run o//third_party/mbedtls/test/test_suite_mpi
+  run o//third_party/mbedtls/test/test_suite_net
+  run o//third_party/mbedtls/test/test_suite_nist_kw
+  run o//third_party/mbedtls/test/test_suite_oid
+  run o//third_party/mbedtls/test/test_suite_pem
+  run o//third_party/mbedtls/test/test_suite_pk
+  run o//third_party/mbedtls/test/test_suite_pkcs1_v15
+  run o//third_party/mbedtls/test/test_suite_pkcs1_v21
+  run o//third_party/mbedtls/test/test_suite_pkcs5
+  run o//third_party/mbedtls/test/test_suite_pkparse
+  run o//third_party/mbedtls/test/test_suite_pkwrite
+  run o//third_party/mbedtls/test/test_suite_poly1305
+  run o//third_party/mbedtls/test/test_suite_random
+  run o//third_party/mbedtls/test/test_suite_rsa
+  run o//third_party/mbedtls/test/test_suite_shax
+  run o//third_party/mbedtls/test/test_suite_ssl
+  run o//third_party/mbedtls/test/test_suite_timing
+  run o//third_party/mbedtls/test/test_suite_version
+  run o//third_party/mbedtls/test/test_suite_x509parse
+  run o//third_party/mbedtls/test/test_suite_x509write
+) | o//tool/build/deltaify2 | sort -n | tee speed.txt
 
 mkdir -p ~/speed/mbedtls
 cp speed.txt ~/speed/mbedtls/$(date +%Y-%m-%d-%H-%H).txt
diff --git a/third_party/mbedtls/test/BUILD.mk b/third_party/mbedtls/test/BUILD.mk
index a892433bc..ed807c0c6 100644
--- a/third_party/mbedtls/test/BUILD.mk
+++ b/third_party/mbedtls/test/BUILD.mk
@@ -12,76 +12,76 @@ THIRD_PARTY_MBEDTLS_TEST_OBJS =											\
 	$(THIRD_PARTY_MBEDTLS_TEST_SRCS:%.c=o/$(MODE)/%.o)
 
 # TOOD(jart): Re-enable me once we can mock out time.
-# o/$(MODE)/third_party/mbedtls/test/test_suite_x509parse.com
+# o/$(MODE)/third_party/mbedtls/test/test_suite_x509parse
 
 THIRD_PARTY_MBEDTLS_TEST_COMS =											\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cbc.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cfb.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ecb.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ofb.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.rest.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.xts.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_asn1parse.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_asn1write.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_base64.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_blowfish.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_chacha20.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_chachapoly.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.aes.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.blowfish.com					\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.ccm.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chacha20.com					\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chachapoly.com					\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.des.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.gcm.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.misc.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.nist_kw.com					\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.null.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.padding.com					\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_des.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_dhm.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_ecdh.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_ecdsa.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_ecp.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_entropy.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_error.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_de.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_en.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_de.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_en.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_de.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_en.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.misc.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_hkdf.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc.com					\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed.com					\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.nopr.com					\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.pr.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_md.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_mdx.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_memory_buffer_alloc.com					\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_mpi.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_net.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_nist_kw.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_oid.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_pem.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_pk.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v15.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v21.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs5.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_pkparse.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_pkwrite.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_poly1305.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_random.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_rsa.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_shax.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_ssl.com							\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_timing.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_version.com						\
-	o/$(MODE)/third_party/mbedtls/test/test_suite_x509write.com						\
-	o/$(MODE)/third_party/mbedtls/test/secp384r1_test.com							\
-	o/$(MODE)/third_party/mbedtls/test/everest_test.com
+	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cbc							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cfb							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ecb							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ofb							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.rest							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_aes.xts							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_asn1parse							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_asn1write							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_base64							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_blowfish							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_chacha20							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_chachapoly						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.aes						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.blowfish						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.ccm						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chacha20						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chachapoly						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.des						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.gcm						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.misc						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.nist_kw						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.null						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.padding						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_des							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_dhm							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_ecdh							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_ecdsa							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_ecp							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_entropy							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_error							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_de						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_en						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_de						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_en						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_de						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_en						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.misc							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_hkdf							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed					\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.nopr						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.pr						\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_md							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_mdx							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_memory_buffer_alloc					\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_mpi							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_net							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_nist_kw							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_oid							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_pem							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_pk							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v15							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v21							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs5							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_pkparse							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_pkwrite							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_poly1305							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_random							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_rsa							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_shax							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_ssl							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_timing							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_version							\
+	o/$(MODE)/third_party/mbedtls/test/test_suite_x509write							\
+	o/$(MODE)/third_party/mbedtls/test/secp384r1_test							\
+	o/$(MODE)/third_party/mbedtls/test/everest_test
 
 THIRD_PARTY_MBEDTLS_TEST_TESTS =										\
 	$(THIRD_PARTY_MBEDTLS_TEST_COMS:%=%.ok)
@@ -123,7 +123,7 @@ o/$(MODE)/third_party/mbedtls/test/test.pkg:									\
 
 o/$(MODE)/third_party/mbedtls/test/lib.o: third_party/mbedtls/test/lib.c
 
-o/$(MODE)/third_party/mbedtls/test/%.com.dbg:									\
+o/$(MODE)/third_party/mbedtls/test/%.dbg:									\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/%.o								\
@@ -132,7 +132,7 @@ o/$(MODE)/third_party/mbedtls/test/%.com.dbg:									\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/%.com.runs: o/$(MODE)/third_party/mbedtls/test/%.com
+o/$(MODE)/third_party/mbedtls/test/%.runs: o/$(MODE)/third_party/mbedtls/test/%
 	@$(COMPILE) -ACHECK -wtT$@ $< $(TESTARGS)
 
 o/$(MODE)/third_party/mbedtls/test/lib.o: private								\
@@ -149,8 +149,8 @@ o/$(MODE)/third_party/mbedtls/test:										\
 o/$(MODE)/third_party/mbedtls/test/TESTS:									\
 		$(THIRD_PARTY_MBEDTLS_TEST_TESTS)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cbc.com: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cbc.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cbc.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cbc: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cbc.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cbc.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cbc.o						\
@@ -160,8 +160,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cbc.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cfb.com: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cfb.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cfb.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cfb: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cfb.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cfb.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cfb.o						\
@@ -171,8 +171,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_aes.cfb.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ecb.com: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ecb.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ecb.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ecb: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ecb.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ecb.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ecb.o						\
@@ -182,8 +182,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ecb.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ofb.com: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ofb.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ofb.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ofb: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ofb.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ofb.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ofb.o						\
@@ -193,8 +193,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_aes.ofb.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.rest.com: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.rest.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.rest.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.rest: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.rest.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.rest.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_aes.rest.o					\
@@ -204,8 +204,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_aes.rest.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.xts.com: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.xts.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_aes.xts.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.xts: o/$(MODE)/third_party/mbedtls/test/test_suite_aes.xts.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_aes.xts.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_aes.xts.o						\
@@ -215,8 +215,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_aes.xts.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_asn1parse.com: o/$(MODE)/third_party/mbedtls/test/test_suite_asn1parse.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_asn1parse.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_asn1parse: o/$(MODE)/third_party/mbedtls/test/test_suite_asn1parse.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_asn1parse.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_asn1parse.o					\
@@ -226,8 +226,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_asn1parse.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_asn1write.com: o/$(MODE)/third_party/mbedtls/test/test_suite_asn1write.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_asn1write.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_asn1write: o/$(MODE)/third_party/mbedtls/test/test_suite_asn1write.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_asn1write.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_asn1write.o					\
@@ -237,8 +237,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_asn1write.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_base64.com: o/$(MODE)/third_party/mbedtls/test/test_suite_base64.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_base64.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_base64: o/$(MODE)/third_party/mbedtls/test/test_suite_base64.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_base64.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_base64.o						\
@@ -248,8 +248,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_base64.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_blowfish.com: o/$(MODE)/third_party/mbedtls/test/test_suite_blowfish.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_blowfish.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_blowfish: o/$(MODE)/third_party/mbedtls/test/test_suite_blowfish.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_blowfish.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_blowfish.o					\
@@ -259,8 +259,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_blowfish.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_chacha20.com: o/$(MODE)/third_party/mbedtls/test/test_suite_chacha20.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_chacha20.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_chacha20: o/$(MODE)/third_party/mbedtls/test/test_suite_chacha20.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_chacha20.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_chacha20.o					\
@@ -270,8 +270,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_chacha20.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_chachapoly.com: o/$(MODE)/third_party/mbedtls/test/test_suite_chachapoly.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_chachapoly.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_chachapoly: o/$(MODE)/third_party/mbedtls/test/test_suite_chachapoly.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_chachapoly.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_chachapoly.o					\
@@ -281,8 +281,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_chachapoly.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.aes.com: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.aes.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.aes.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.aes: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.aes.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.aes.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.aes.o					\
@@ -292,8 +292,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.aes.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.blowfish.com: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.blowfish.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.blowfish.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.blowfish: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.blowfish.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.blowfish.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.blowfish.o					\
@@ -303,8 +303,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.blowfish.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.ccm.com: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.ccm.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.ccm.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.ccm: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.ccm.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.ccm.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.ccm.o					\
@@ -314,8 +314,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.ccm.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chacha20.com: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chacha20.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chacha20.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chacha20: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chacha20.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chacha20.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chacha20.o					\
@@ -325,8 +325,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chacha20.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chachapoly.com: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chachapoly.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chachapoly.com.dbg:					\
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chachapoly: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chachapoly.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chachapoly.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chachapoly.o				\
@@ -336,8 +336,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.chachapoly.com.dbg:					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.des.com: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.des.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.des.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.des: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.des.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.des.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.des.o					\
@@ -347,8 +347,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.des.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.gcm.com: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.gcm.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.gcm.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.gcm: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.gcm.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.gcm.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.gcm.o					\
@@ -358,8 +358,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.gcm.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.misc.com: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.misc.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.misc.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.misc: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.misc.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.misc.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.misc.o					\
@@ -369,8 +369,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.misc.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.nist_kw.com: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.nist_kw.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.nist_kw.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.nist_kw: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.nist_kw.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.nist_kw.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.nist_kw.o					\
@@ -380,8 +380,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.nist_kw.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.null.com: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.null.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.null.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.null: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.null.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.null.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.null.o					\
@@ -391,8 +391,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.null.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.padding.com: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.padding.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.padding.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.padding: o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.padding.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.padding.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.padding.o					\
@@ -402,9 +402,9 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_cipher.padding.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg.com.runs: private .UNVEIL += rwc:o/tmp
-o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg.com: o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg.runs: private .UNVEIL += rwc:o/tmp
+o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg: o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg.o					\
@@ -414,8 +414,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_ctr_drbg.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_des.com: o/$(MODE)/third_party/mbedtls/test/test_suite_des.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_des.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_des: o/$(MODE)/third_party/mbedtls/test/test_suite_des.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_des.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_des.o						\
@@ -425,8 +425,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_des.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_dhm.com: o/$(MODE)/third_party/mbedtls/test/test_suite_dhm.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_dhm.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_dhm: o/$(MODE)/third_party/mbedtls/test/test_suite_dhm.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_dhm.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_dhm.o						\
@@ -438,8 +438,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_dhm.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_ecdh.com: o/$(MODE)/third_party/mbedtls/test/test_suite_ecdh.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_ecdh.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_ecdh: o/$(MODE)/third_party/mbedtls/test/test_suite_ecdh.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_ecdh.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_ecdh.o						\
@@ -449,8 +449,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_ecdh.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_ecdsa.com: o/$(MODE)/third_party/mbedtls/test/test_suite_ecdsa.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_ecdsa.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_ecdsa: o/$(MODE)/third_party/mbedtls/test/test_suite_ecdsa.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_ecdsa.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_ecdsa.o						\
@@ -460,8 +460,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_ecdsa.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_ecp.com: o/$(MODE)/third_party/mbedtls/test/test_suite_ecp.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_ecp.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_ecp: o/$(MODE)/third_party/mbedtls/test/test_suite_ecp.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_ecp.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_ecp.o						\
@@ -471,8 +471,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_ecp.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_entropy.com: o/$(MODE)/third_party/mbedtls/test/test_suite_entropy.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_entropy.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_entropy: o/$(MODE)/third_party/mbedtls/test/test_suite_entropy.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_entropy.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_entropy.o						\
@@ -482,8 +482,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_entropy.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_error.com: o/$(MODE)/third_party/mbedtls/test/test_suite_error.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_error.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_error: o/$(MODE)/third_party/mbedtls/test/test_suite_error.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_error.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_error.o						\
@@ -493,8 +493,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_error.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_de.com: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_de.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_de.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_de: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_de.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_de.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_de.o					\
@@ -504,8 +504,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_de.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_en.com: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_en.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_en.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_en: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_en.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_en.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_en.o					\
@@ -515,8 +515,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes128_en.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_de.com: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_de.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_de.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_de: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_de.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_de.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_de.o					\
@@ -526,8 +526,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_de.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_en.com: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_en.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_en.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_en: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_en.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_en.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_en.o					\
@@ -537,8 +537,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes192_en.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_de.com: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_de.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_de.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_de: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_de.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_de.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_de.o					\
@@ -548,8 +548,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_de.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_en.com: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_en.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_en.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_en: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_en.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_en.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_en.o					\
@@ -559,8 +559,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.aes256_en.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.misc.com: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.misc.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.misc.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.misc: o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.misc.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.misc.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.misc.o					\
@@ -570,8 +570,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_gcm.misc.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_hkdf.com: o/$(MODE)/third_party/mbedtls/test/test_suite_hkdf.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_hkdf.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_hkdf: o/$(MODE)/third_party/mbedtls/test/test_suite_hkdf.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_hkdf.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_hkdf.o						\
@@ -581,9 +581,9 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_hkdf.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc.com.runs: private .UNVEIL += rwc:o/tmp
-o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc.com: o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc.runs: private .UNVEIL += rwc:o/tmp
+o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc: o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc.o					\
@@ -593,8 +593,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.misc.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed.com: o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed.com.dbg:					\
+o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed: o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed.o				\
@@ -604,8 +604,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.no_reseed.com.dbg:					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.nopr.com: o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.nopr.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.nopr.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.nopr: o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.nopr.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.nopr.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.nopr.o					\
@@ -615,8 +615,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.nopr.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.pr.com: o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.pr.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.pr.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.pr: o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.pr.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.pr.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.pr.o					\
@@ -626,8 +626,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_hmac_drbg.pr.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_md.com: o/$(MODE)/third_party/mbedtls/test/test_suite_md.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_md.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_md: o/$(MODE)/third_party/mbedtls/test/test_suite_md.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_md.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_md.o						\
@@ -642,8 +642,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_md.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_mdx.com: o/$(MODE)/third_party/mbedtls/test/test_suite_mdx.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_mdx.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_mdx: o/$(MODE)/third_party/mbedtls/test/test_suite_mdx.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_mdx.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_mdx.o						\
@@ -653,8 +653,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_mdx.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_memory_buffer_alloc.com: o/$(MODE)/third_party/mbedtls/test/test_suite_memory_buffer_alloc.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_memory_buffer_alloc.com.dbg:					\
+o/$(MODE)/third_party/mbedtls/test/test_suite_memory_buffer_alloc: o/$(MODE)/third_party/mbedtls/test/test_suite_memory_buffer_alloc.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_memory_buffer_alloc.dbg:						\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_memory_buffer_alloc.o				\
@@ -664,9 +664,9 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_memory_buffer_alloc.com.dbg:					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_mpi.com.runs: private .UNVEIL += rwc:o/tmp
-o/$(MODE)/third_party/mbedtls/test/test_suite_mpi.com: o/$(MODE)/third_party/mbedtls/test/test_suite_mpi.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_mpi.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_mpi.runs: private .UNVEIL += rwc:o/tmp
+o/$(MODE)/third_party/mbedtls/test/test_suite_mpi: o/$(MODE)/third_party/mbedtls/test/test_suite_mpi.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_mpi.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_mpi.o						\
@@ -681,8 +681,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_mpi.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_net.com: o/$(MODE)/third_party/mbedtls/test/test_suite_net.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_net.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_net: o/$(MODE)/third_party/mbedtls/test/test_suite_net.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_net.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_net.o						\
@@ -692,8 +692,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_net.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_nist_kw.com: o/$(MODE)/third_party/mbedtls/test/test_suite_nist_kw.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_nist_kw.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_nist_kw: o/$(MODE)/third_party/mbedtls/test/test_suite_nist_kw.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_nist_kw.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_nist_kw.o						\
@@ -703,8 +703,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_nist_kw.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_oid.com: o/$(MODE)/third_party/mbedtls/test/test_suite_oid.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_oid.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_oid: o/$(MODE)/third_party/mbedtls/test/test_suite_oid.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_oid.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_oid.o						\
@@ -714,8 +714,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_oid.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_pem.com: o/$(MODE)/third_party/mbedtls/test/test_suite_pem.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_pem.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_pem: o/$(MODE)/third_party/mbedtls/test/test_suite_pem.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_pem.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_pem.o						\
@@ -725,8 +725,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_pem.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_pk.com: o/$(MODE)/third_party/mbedtls/test/test_suite_pk.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_pk.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_pk: o/$(MODE)/third_party/mbedtls/test/test_suite_pk.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_pk.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_pk.o						\
@@ -742,8 +742,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_pk.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v15.com: o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v15.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v15.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v15: o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v15.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v15.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v15.o					\
@@ -753,8 +753,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v15.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v21.com: o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v21.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v21.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v21: o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v21.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v21.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v21.o					\
@@ -764,8 +764,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs1_v21.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs5.com: o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs5.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs5.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs5: o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs5.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs5.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs5.o						\
@@ -775,8 +775,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_pkcs5.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_pkparse.com: o/$(MODE)/third_party/mbedtls/test/test_suite_pkparse.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_pkparse.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_pkparse: o/$(MODE)/third_party/mbedtls/test/test_suite_pkparse.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_pkparse.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_pkparse.o						\
@@ -915,8 +915,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_pkparse.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_pkwrite.com: o/$(MODE)/third_party/mbedtls/test/test_suite_pkwrite.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_pkwrite.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_pkwrite: o/$(MODE)/third_party/mbedtls/test/test_suite_pkwrite.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_pkwrite.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_pkwrite.o						\
@@ -938,8 +938,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_pkwrite.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_poly1305.com: o/$(MODE)/third_party/mbedtls/test/test_suite_poly1305.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_poly1305.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_poly1305: o/$(MODE)/third_party/mbedtls/test/test_suite_poly1305.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_poly1305.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_poly1305.o					\
@@ -949,8 +949,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_poly1305.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_random.com: o/$(MODE)/third_party/mbedtls/test/test_suite_random.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_random.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_random: o/$(MODE)/third_party/mbedtls/test/test_suite_random.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_random.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_random.o						\
@@ -960,8 +960,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_random.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_rsa.com: o/$(MODE)/third_party/mbedtls/test/test_suite_rsa.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_rsa.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_rsa: o/$(MODE)/third_party/mbedtls/test/test_suite_rsa.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_rsa.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_rsa.o						\
@@ -971,8 +971,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_rsa.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_shax.com: o/$(MODE)/third_party/mbedtls/test/test_suite_shax.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_shax.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_shax: o/$(MODE)/third_party/mbedtls/test/test_suite_shax.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_shax.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_shax.o						\
@@ -982,8 +982,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_shax.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_ssl.com: o/$(MODE)/third_party/mbedtls/test/test_suite_ssl.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_ssl.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_ssl: o/$(MODE)/third_party/mbedtls/test/test_suite_ssl.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_ssl.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_ssl.o						\
@@ -994,8 +994,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_ssl.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_timing.com: o/$(MODE)/third_party/mbedtls/test/test_suite_timing.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_timing.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_timing: o/$(MODE)/third_party/mbedtls/test/test_suite_timing.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_timing.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_timing.o						\
@@ -1005,8 +1005,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_timing.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_version.com: o/$(MODE)/third_party/mbedtls/test/test_suite_version.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_version.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/test_suite_version: o/$(MODE)/third_party/mbedtls/test/test_suite_version.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_version.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_version.o						\
@@ -1016,8 +1016,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_version.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_x509parse.com: o/$(MODE)/third_party/mbedtls/test/test_suite_x509parse.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_x509parse.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_x509parse: o/$(MODE)/third_party/mbedtls/test/test_suite_x509parse.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_x509parse.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_x509parse.o					\
@@ -1301,8 +1301,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_x509parse.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/test_suite_x509write.com: o/$(MODE)/third_party/mbedtls/test/test_suite_x509write.com.dbg
-o/$(MODE)/third_party/mbedtls/test/test_suite_x509write.com.dbg:						\
+o/$(MODE)/third_party/mbedtls/test/test_suite_x509write: o/$(MODE)/third_party/mbedtls/test/test_suite_x509write.dbg
+o/$(MODE)/third_party/mbedtls/test/test_suite_x509write.dbg:							\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/lib.o							\
 		o/$(MODE)/third_party/mbedtls/test/test_suite_x509write.o					\
@@ -1337,8 +1337,8 @@ o/$(MODE)/third_party/mbedtls/test/test_suite_x509write.com.dbg:						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/everest_test.com: o/$(MODE)/third_party/mbedtls/test/everest_test.com.dbg
-o/$(MODE)/third_party/mbedtls/test/everest_test.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/everest_test: o/$(MODE)/third_party/mbedtls/test/everest_test.dbg
+o/$(MODE)/third_party/mbedtls/test/everest_test.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/everest_test.o						\
 		o/$(MODE)/third_party/mbedtls/test/everest_unravaged.o						\
@@ -1348,8 +1348,8 @@ o/$(MODE)/third_party/mbedtls/test/everest_test.com.dbg:							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/mbedtls/test/secp384r1_test.com: o/$(MODE)/third_party/mbedtls/test/secp384r1_test.com.dbg
-o/$(MODE)/third_party/mbedtls/test/secp384r1_test.com.dbg:							\
+o/$(MODE)/third_party/mbedtls/test/secp384r1_test: o/$(MODE)/third_party/mbedtls/test/secp384r1_test.dbg
+o/$(MODE)/third_party/mbedtls/test/secp384r1_test.dbg:								\
 		$(THIRD_PARTY_MBEDTLS_TEST_DEPS)								\
 		o/$(MODE)/third_party/mbedtls/test/secp384r1_test.o						\
 		o/$(MODE)/third_party/mbedtls/test/test.pkg							\
diff --git a/third_party/nsync/testing/BUILD.mk b/third_party/nsync/testing/BUILD.mk
index 97c7cb4f8..1ddb4368b 100644
--- a/third_party/nsync/testing/BUILD.mk
+++ b/third_party/nsync/testing/BUILD.mk
@@ -10,10 +10,10 @@ THIRD_PARTY_NSYNC_TESTING_SRCS = $(filter %.c,$(THIRD_PARTY_NSYNC_TESTING_FILES)
 THIRD_PARTY_NSYNC_TESTING_HDRS = $(filter %.h,$(THIRD_PARTY_NSYNC_TESTING_FILES))
 THIRD_PARTY_NSYNC_TESTING_SRCS_TEST = $(filter %_test.c,$(THIRD_PARTY_NSYNC_TESTING_SRCS))
 THIRD_PARTY_NSYNC_TESTING_OBJS = $(THIRD_PARTY_NSYNC_TESTING_SRCS:%.c=o/$(MODE)/%.o)
-THIRD_PARTY_NSYNC_TESTING_COMS = $(THIRD_PARTY_NSYNC_TESTING_SRCS_TEST:%.c=o/$(MODE)/%.com)
+THIRD_PARTY_NSYNC_TESTING_COMS = $(THIRD_PARTY_NSYNC_TESTING_SRCS_TEST:%.c=o/$(MODE)/%)
 THIRD_PARTY_NSYNC_TESTING_BINS = $(THIRD_PARTY_NSYNC_TESTING_COMS) $(THIRD_PARTY_NSYNC_TESTING_COMS:%=%.dbg)
-THIRD_PARTY_NSYNC_TESTING_TESTS_ = $(THIRD_PARTY_NSYNC_TESTING_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
-THIRD_PARTY_NSYNC_TESTING_CHECKS_ = $(THIRD_PARTY_NSYNC_TESTING_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
+THIRD_PARTY_NSYNC_TESTING_TESTS_ = $(THIRD_PARTY_NSYNC_TESTING_SRCS_TEST:%.c=o/$(MODE)/%.ok)
+THIRD_PARTY_NSYNC_TESTING_CHECKS_ = $(THIRD_PARTY_NSYNC_TESTING_SRCS_TEST:%.c=o/$(MODE)/%.runs)
 
 THIRD_PARTY_NSYNC_TESTING_DIRECTDEPS =				\
 	LIBC_CALLS						\
@@ -42,7 +42,7 @@ $(THIRD_PARTY_NSYNC_TESTING_A).pkg:				\
 		$(THIRD_PARTY_NSYNC_TESTING_OBJS)		\
 		$(foreach x,$(THIRD_PARTY_NSYNC_TESTING_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/nsync/testing/%_test.com.dbg:		\
+o/$(MODE)/third_party/nsync/testing/%_test.dbg:			\
 		$(THIRD_PARTY_NSYNC_TESTING_DEPS)		\
 		$(THIRD_PARTY_NSYNC_TESTING_A)			\
 		o/$(MODE)/third_party/nsync/testing/%_test.o	\
@@ -52,7 +52,7 @@ o/$(MODE)/third_party/nsync/testing/%_test.com.dbg:		\
 	@$(APELINK)
 
 $(THIRD_PARTY_NSYNC_TESTING_OBJS): third_party/nsync/testing/BUILD.mk
-o/$(MODE)/third_party/nsync/testing/mu_test.com.runs: private QUOTA = -C64
+o/$(MODE)/third_party/nsync/testing/mu_test.runs: private QUOTA = -C64
 
 .PHONY: o/$(MODE)/third_party/nsync/testing
 o/$(MODE)/third_party/nsync/testing:				\
diff --git a/third_party/pcre/BUILD.mk b/third_party/pcre/BUILD.mk
index 2c143c1df..3a32a0cfe 100644
--- a/third_party/pcre/BUILD.mk
+++ b/third_party/pcre/BUILD.mk
@@ -14,7 +14,7 @@ THIRD_PARTY_PCRE_A_OBJS = $(THIRD_PARTY_PCRE_A_SRCS:%.c=o/$(MODE)/%.o)
 
 THIRD_PARTY_PCRE_A_CHECKS =				\
 	$(THIRD_PARTY_PCRE_A).pkg			\
-	o/$(MODE)/third_party/pcre/pcre2posix_test.com.runs
+	o/$(MODE)/third_party/pcre/pcre2posix_test.runs
 
 THIRD_PARTY_PCRE_A_DIRECTDEPS =				\
 	LIBC_CALLS					\
@@ -42,7 +42,7 @@ $(THIRD_PARTY_PCRE_A).pkg:				\
 
 $(THIRD_PARTY_PCRE_A_OBJS): private CPPFLAGS += -DHAVE_CONFIG_H -DNDEBUG
 
-o/$(MODE)/third_party/pcre/%.com.dbg:			\
+o/$(MODE)/third_party/pcre/%.dbg:			\
 		$(THIRD_PARTY_PCRE)			\
 		o/$(MODE)/third_party/pcre/%.o		\
 		$(CRT)					\
@@ -50,8 +50,8 @@ o/$(MODE)/third_party/pcre/%.com.dbg:			\
 	@$(APELINK)
 
 THIRD_PARTY_PCRE_COMS =					\
-	o/$(MODE)/third_party/pcre/pcre2grep.com	\
-	o/$(MODE)/third_party/pcre/pcre2posix_test.com
+	o/$(MODE)/third_party/pcre/pcre2grep		\
+	o/$(MODE)/third_party/pcre/pcre2posix_test
 
 THIRD_PARTY_PCRE_BINS = $(THIRD_PARTY_PCRE_COMS) $(THIRD_PARTY_PCRE_COMS:%=%.dbg)
 THIRD_PARTY_PCRE_LIBS = $(foreach x,$(THIRD_PARTY_PCRE_ARTIFACTS),$($(x)))
diff --git a/third_party/python/BUILD.mk b/third_party/python/BUILD.mk
index 81868c829..f93428cdf 100644
--- a/third_party/python/BUILD.mk
+++ b/third_party/python/BUILD.mk
@@ -15,14 +15,14 @@ THIRD_PARTY_PYTHON_BINS =						\
 	$(THIRD_PARTY_PYTHON_COMS:%=%.dbg)
 
 THIRD_PARTY_PYTHON_COMS =						\
-	o/$(MODE)/third_party/python/Parser/asdl_c.com			\
-	o/$(MODE)/third_party/python/pystone.com			\
-	o/$(MODE)/third_party/python/python.com				\
-	o/$(MODE)/third_party/python/freeze.com				\
-	o/$(MODE)/third_party/python/pycomp.com				\
-	o/$(MODE)/third_party/python/pyobj.com				\
-	o/$(MODE)/third_party/python/hello.com				\
-	o/$(MODE)/third_party/python/repl.com
+	o/$(MODE)/third_party/python/Parser/asdl_c			\
+	o/$(MODE)/third_party/python/pystone				\
+	o/$(MODE)/third_party/python/python				\
+	o/$(MODE)/third_party/python/freeze				\
+	o/$(MODE)/third_party/python/pycomp				\
+	o/$(MODE)/third_party/python/pyobj				\
+	o/$(MODE)/third_party/python/hello				\
+	o/$(MODE)/third_party/python/repl
 
 THIRD_PARTY_PYTHON_CHECKS =						\
 	$(THIRD_PARTY_PYTHON_STAGE1_A).pkg 				\
@@ -483,12 +483,12 @@ THIRD_PARTY_PYTHON_STAGE1_A_DEPS =					\
 	$(call uniq,$(foreach x,$(THIRD_PARTY_PYTHON_STAGE1_A_DIRECTDEPS),$($(x))))
 
 o//third_party/python/Python/importlib.inc:				\
-		o/$(MODE)/third_party/python/freeze.com			\
+		o/$(MODE)/third_party/python/freeze			\
 		third_party/python/Lib/importlib/_bootstrap.py
 	@$(COMPILE) -AFREEZE -wT$@ $^ $@
 
 o//third_party/python/Python/importlib_external.inc:			\
-		o/$(MODE)/third_party/python/freeze.com			\
+		o/$(MODE)/third_party/python/freeze			\
 		third_party/python/Lib/importlib/_bootstrap_external.py
 	@$(COMPILE) -AFREEZE -wT$@ $^ $@
 
@@ -1348,7 +1348,7 @@ THIRD_PARTY_PYTHON_PYTEST_A_DATA =										\
 	third_party/python/Lib/venv/scripts/nt/deactivate.bat							\
 	third_party/python/Lib/venv/scripts/posix/activate.csh							\
 	third_party/python/Lib/venv/scripts/posix/activate.fish							\
-	third_party/python/Lib/test/hello.com									\
+	third_party/python/Lib/test/hello									\
 	third_party/python/Lib/test/xmltestdata/								\
 	third_party/python/Lib/test/xmltestdata/simple.xml							\
 	third_party/python/Lib/test/xmltestdata/simple-ns.xml							\
@@ -2124,7 +2124,7 @@ o/$(MODE)/third_party/python/pythontester.pkg:				\
 		o/$(MODE)/third_party/python/pythontester.o		\
 		$(foreach x,$(THIRD_PARTY_PYTHON_PYTEST_PYMAINS_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/python/pythontester.com.dbg:			\
+o/$(MODE)/third_party/python/pythontester.dbg:			\
 		o/$(MODE)/third_party/python/pythontester.pkg		\
 		$(THIRD_PARTY_PYTHON_PYTEST_PYMAINS_DEPS)		\
 		$(THIRD_PARTY_PYTHON_PYTEST_PYMAINS_OBJS)		\
@@ -2159,7 +2159,7 @@ o/$(MODE)/third_party/python/Lib/test/test_signal.py.runs:		\
 o/$(MODE)/third_party/python/Lib/test/test_timeout.py.runs:		\
 		private .PLEDGE = stdio rpath wpath cpath fattr proc inet
 
-PYTHONTESTER = o/$(MODE)/third_party/python/pythontester.com
+PYTHONTESTER = o/$(MODE)/third_party/python/pythontester
 
 o/$(MODE)/third_party/python/Lib/test/test_grammar.py.runs: $(PYTHONTESTER)
 	@$(COMPILE) -ACHECK -wtT$@ $(PYHARNESSARGS) $(PYTHONTESTER) -m test.test_grammar $(PYTESTARGS)
@@ -3314,35 +3314,35 @@ o/$(MODE)/third_party/python/Lib/test/test_ordered_dict.py.runs: $(PYTHONTESTER)
 
 ################################################################################
 
-o/$(MODE)/third_party/python/pyobj.com.dbg:				\
+o/$(MODE)/third_party/python/pyobj.dbg:				\
 		$(THIRD_PARTY_PYTHON_STAGE1)				\
 		o/$(MODE)/third_party/python/pyobj.o			\
 		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/python/pycomp.com.dbg:				\
+o/$(MODE)/third_party/python/pycomp.dbg:				\
 		$(THIRD_PARTY_PYTHON_STAGE1)				\
 		o/$(MODE)/third_party/python/pycomp.o			\
 		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/python/repl.com.dbg:				\
+o/$(MODE)/third_party/python/repl.dbg:				\
 		$(THIRD_PARTY_PYTHON_STAGE2)				\
 		o/$(MODE)/third_party/python/repl.o			\
 		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/python/pystone.com.dbg:				\
+o/$(MODE)/third_party/python/pystone.dbg:				\
 		$(THIRD_PARTY_PYTHON_STAGE2)				\
 		o/$(MODE)/third_party/python/Lib/test/pystone.o		\
 		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/python/Parser/asdl_c.com.dbg:			\
+o/$(MODE)/third_party/python/Parser/asdl_c.dbg:			\
 		$(THIRD_PARTY_PYTHON_STAGE2)				\
 		o/$(MODE)/third_party/python/Parser/asdl_c.o		\
 		$(CRT)							\
@@ -3475,7 +3475,7 @@ o/$(MODE)/third_party/python/Lib/test/test_difflib.o: private PYFLAGS += -Y.pyth
 
 o/$(MODE)/third_party/python/Lib/test/test_cosmo.o: private		\
 		PYFLAGS +=						\
-			-Y.python/test/hello.com
+			-Y.python/test/hello
 
 o/$(MODE)/third_party/python/Lib/test/test_asdl_parser.o: private	\
 		PYFLAGS +=						\
@@ -3978,11 +3978,11 @@ THIRD_PARTY_PYTHON_SRCS =						\
 	third_party/python/pythontester.c
 
 ################################################################################
-# PYTHON.COM
+# PYTHON
 
 THIRD_PARTY_PYTHON_PYTHON_SRCS = third_party/python/python.c
 THIRD_PARTY_PYTHON_PYTHON_OBJS = o/$(MODE)/third_party/python/python.o
-THIRD_PARTY_PYTHON_PYTHON_COMS = o/$(MODE)/third_party/python/python.com
+THIRD_PARTY_PYTHON_PYTHON_COMS = o/$(MODE)/third_party/python/python
 THIRD_PARTY_PYTHON_PYTHON_BINS = $(THIRD_PARTY_PYTHON_PYTHON_COMS) $(THIRD_PARTY_PYTHON_PYTHON_COMS:%=%.dbg)
 THIRD_PARTY_PYTHON_PYTHON_DEPS = $(call uniq,$(foreach x,$(THIRD_PARTY_PYTHON_PYTHON_DIRECTDEPS),$($(x))))
 THIRD_PARTY_PYTHON_PYTHON_DIRECTDEPS =					\
@@ -4009,7 +4009,7 @@ o/$(MODE)/third_party/python/python.pkg:				\
 		$(THIRD_PARTY_PYTHON_PYTHON_OBJS)			\
 		$(foreach x,$(THIRD_PARTY_PYTHON_PYTHON_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/python/python.com.dbg:				\
+o/$(MODE)/third_party/python/python.dbg:				\
 		o/$(MODE)/third_party/python/python.pkg			\
 		$(THIRD_PARTY_PYTHON_PYTHON_DEPS)			\
 		$(THIRD_PARTY_PYTHON_PYTHON_OBJS)			\
@@ -4017,20 +4017,12 @@ o/$(MODE)/third_party/python/python.com.dbg:				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/python/python.com:				\
-		o/$(MODE)/third_party/python/python.com.dbg		\
-		o/$(MODE)/third_party/zip/zip.com			\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
 ################################################################################
-# FREEZE.COM
+# FREEZE
 
 THIRD_PARTY_PYTHON_FREEZE_SRCS = third_party/python/freeze.c
 THIRD_PARTY_PYTHON_FREEZE_OBJS = o/$(MODE)/third_party/python/freeze.o
-THIRD_PARTY_PYTHON_FREEZE_COMS = o/$(MODE)/third_party/python/freeze.com
+THIRD_PARTY_PYTHON_FREEZE_COMS = o/$(MODE)/third_party/python/freeze
 THIRD_PARTY_PYTHON_FREEZE_BINS = $(THIRD_PARTY_PYTHON_FREEZE_COMS) $(THIRD_PARTY_PYTHON_FREEZE_COMS:%=%.dbg)
 THIRD_PARTY_PYTHON_FREEZE_DEPS = $(call uniq,$(foreach x,$(THIRD_PARTY_PYTHON_FREEZE_DIRECTDEPS),$($(x))))
 THIRD_PARTY_PYTHON_FREEZE_DIRECTDEPS =					\
@@ -4053,7 +4045,7 @@ o/$(MODE)/third_party/python/freeze.pkg:				\
 		$(THIRD_PARTY_PYTHON_FREEZE_OBJS)			\
 		$(foreach x,$(THIRD_PARTY_PYTHON_FREEZE_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/python/freeze.com.dbg:				\
+o/$(MODE)/third_party/python/freeze.dbg:				\
 		o/$(MODE)/third_party/python/freeze.pkg			\
 		$(THIRD_PARTY_PYTHON_FREEZE_DEPS)			\
 		$(THIRD_PARTY_PYTHON_FREEZE_OBJS)			\
@@ -4157,11 +4149,11 @@ o/$(MODE)/third_party/python/chibicc.inc:				\
 	@$(COMPILE) -wACHECK.h $(COMPILE.c) -xc -E -P -fdirectives-only -dD -D__chibicc__ -o $@ $<
 
 ################################################################################
-# HELLO.COM
+# HELLO
 
 THIRD_PARTY_PYTHON_HELLO_SRCS = third_party/python/hello.c
 THIRD_PARTY_PYTHON_HELLO_OBJS = o/$(MODE)/third_party/python/hello.o
-THIRD_PARTY_PYTHON_HELLO_COMS = o/$(MODE)/third_party/python/hello.com
+THIRD_PARTY_PYTHON_HELLO_COMS = o/$(MODE)/third_party/python/hello
 THIRD_PARTY_PYTHON_HELLO_BINS = $(THIRD_PARTY_PYTHON_HELLO_COMS) $(THIRD_PARTY_PYTHON_HELLO_COMS:%=%.dbg)
 THIRD_PARTY_PYTHON_HELLO_DEPS = $(call uniq,$(foreach x,$(THIRD_PARTY_PYTHON_HELLO_DIRECTDEPS),$($(x))))
 THIRD_PARTY_PYTHON_HELLO_DIRECTDEPS =					\
@@ -4172,7 +4164,7 @@ o/$(MODE)/third_party/python/hello.pkg:					\
 		$(THIRD_PARTY_PYTHON_HELLO_OBJS)			\
 		$(foreach x,$(THIRD_PARTY_PYTHON_HELLO_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/python/hello.com.dbg:				\
+o/$(MODE)/third_party/python/hello.dbg:				\
 		o/$(MODE)/third_party/python/hello.pkg			\
 		$(THIRD_PARTY_PYTHON_HELLO_DEPS)			\
 		$(THIRD_PARTY_PYTHON_HELLO_OBJS)			\
diff --git a/third_party/python/Lib/_sysconfigdata_m_cosmo_x86_64_cosmo.py b/third_party/python/Lib/_sysconfigdata_m_cosmo_x86_64_cosmo.py
index 949e78953..f371f4236 100644
--- a/third_party/python/Lib/_sysconfigdata_m_cosmo_x86_64_cosmo.py
+++ b/third_party/python/Lib/_sysconfigdata_m_cosmo_x86_64_cosmo.py
@@ -14,8 +14,8 @@ build_time_vars = {'ABIFLAGS': 'm',
  'BLDSHARED': 'gcc -shared -static -nostdlib -nostdinc       -fno-pie '
               '-mno-red-zone       -include '
               '/cpython36/libcosmo/cosmopolitan.h',
- 'BUILDEXE': '.com.dbg',
- 'BUILDPYTHON': 'python.com.dbg',
+ 'BUILDEXE': '.dbg',
+ 'BUILDPYTHON': 'python.dbg',
  'BUILD_GNU_TYPE': 'x86_64-pc-cosmo-gnu',
  'BYTESTR_DEPS': '\\',
  'CC': 'gcc',
@@ -120,7 +120,7 @@ build_time_vars = {'ABIFLAGS': 'm',
  'DYNLOADFILE': 'dynload_shlib.o',
  'ENABLE_IPV6': 0,
  'ENSUREPIP': 'no',
- 'EXE': '.com',
+ 'EXE': '',
  'EXEMODE': 755,
  'EXTRAMACHDEPPATH': '',
  'EXTRATESTOPTS': '',
@@ -651,7 +651,7 @@ build_time_vars = {'ABIFLAGS': 'm',
  'PACKAGE_VERSION': 0,
  'PARSER_HEADERS': '\\',
  'PARSER_OBJS': '\\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o',
- 'PGEN': 'Parser/pgen.com.dbg',
+ 'PGEN': 'Parser/pgen.dbg',
  'PGENOBJS': '\\ \\',
  'PGOBJS': '\\',
  'PGO_PROF_GEN_FLAG': '-fprofile-generate',
@@ -665,14 +665,14 @@ build_time_vars = {'ABIFLAGS': 'm',
  'PY3LIBRARY': '',
  'PYEXPAT_ENTROPY': "'XML_POOR_ENTROPY=1'",
  'PYLONG_BITS_IN_DIGIT': 0,
- 'PYTHON': 'python.com.dbg',
+ 'PYTHON': 'python.dbg',
  'PYTHONFRAMEWORK': '',
  'PYTHONFRAMEWORKDIR': 'no-framework',
  'PYTHONFRAMEWORKINSTALLDIR': '',
  'PYTHONFRAMEWORKPREFIX': '',
  'PYTHONPATH': ':',
- 'PYTHON_APE': 'python.com',
- 'PYTHON_FOR_BUILD': './python.com.dbg -E',
+ 'PYTHON_APE': 'python',
+ 'PYTHON_FOR_BUILD': './python.dbg -E',
  'PYTHON_FOR_REGEN': 'python3',
  'PYTHON_HEADERS': '\\',
  'PYTHON_OBJS': '\\',
@@ -775,9 +775,9 @@ build_time_vars = {'ABIFLAGS': 'm',
  'TCLTK_LIBS': '',
  'TESTOPTS': '',
  'TESTPATH': '',
- 'TESTPYTHON': './python.com.dbg',
+ 'TESTPYTHON': './python.dbg',
  'TESTPYTHONOPTS': '',
- 'TESTRUNNER': './python.com.dbg ./Tools/scripts/run_tests.py',
+ 'TESTRUNNER': './python.dbg ./Tools/scripts/run_tests.py',
  'TESTTIMEOUT': 1200,
  'THREADOBJ': '',
  'TIMEMODULE_LIB': 0,
diff --git a/third_party/python/Lib/bisect.py b/third_party/python/Lib/bisect.py
index f0a6f7243..506631bd7 100644
--- a/third_party/python/Lib/bisect.py
+++ b/third_party/python/Lib/bisect.py
@@ -91,5 +91,5 @@ try:
 except ImportError:
     pass
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import _bisect
diff --git a/third_party/python/Lib/collections/__init__.py b/third_party/python/Lib/collections/__init__.py
index b8d83c7de..2d7c83d16 100644
--- a/third_party/python/Lib/collections/__init__.py
+++ b/third_party/python/Lib/collections/__init__.py
@@ -19,7 +19,7 @@ __all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList',
 
 # For backwards compatibility, continue to make the collections ABCs
 # available through the collections module. But don't mandate it, in
-# cases where we're compiling with PYOBJ.COM.
+# cases where we're compiling with PYOBJ.
 try:
     from _collections_abc import *
     import _collections_abc
@@ -513,8 +513,8 @@ class Counter(dict):
     # References:
     #   http://en.wikipedia.org/wiki/Multiset
     #   http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html
-    #   http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm
-    #   http://code.activestate.com/recipes/259174/
+    #   http://www.demo2s/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm
+    #   http://code.activestate/recipes/259174/
     #   Knuth, TAOCP Vol. II section 4.6.3
 
     def __init__(*args, **kwds):
@@ -1246,5 +1246,5 @@ class UserString(Sequence):
     def upper(self): return self.__class__(self.data.upper())
     def zfill(self, width): return self.__class__(self.data.zfill(width))
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import _collections
diff --git a/third_party/python/Lib/collections/abc.py b/third_party/python/Lib/collections/abc.py
index e123ce41b..107ad2cd2 100644
--- a/third_party/python/Lib/collections/abc.py
+++ b/third_party/python/Lib/collections/abc.py
@@ -1,7 +1,7 @@
 from _collections_abc import *
 from _collections_abc import __all__
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     AsyncGenerator = 0
     AsyncIterable = 0
     AsyncIterator = 0
diff --git a/third_party/python/Lib/decimal.py b/third_party/python/Lib/decimal.py
index 19681563e..75405f933 100644
--- a/third_party/python/Lib/decimal.py
+++ b/third_party/python/Lib/decimal.py
@@ -15,7 +15,7 @@ except ImportError:
     except ImportError:
         pass
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import _decimal
     BasicContext = 0
     Clamped = 0
diff --git a/third_party/python/Lib/dummy_threading.py b/third_party/python/Lib/dummy_threading.py
index af346e2e8..a59265c65 100644
--- a/third_party/python/Lib/dummy_threading.py
+++ b/third_party/python/Lib/dummy_threading.py
@@ -77,7 +77,7 @@ finally:
     del _dummy_thread
     del sys_modules
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     Barrier = 0
     BoundedSemaphore = 0
     BrokenBarrierError = 0
diff --git a/third_party/python/Lib/functools.py b/third_party/python/Lib/functools.py
index 5379221ca..117226d88 100644
--- a/third_party/python/Lib/functools.py
+++ b/third_party/python/Lib/functools.py
@@ -816,5 +816,5 @@ def singledispatch(func):
     return wrapper
 
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import _functools
diff --git a/third_party/python/Lib/heapq.py b/third_party/python/Lib/heapq.py
index 47949fde5..22f19b49a 100644
--- a/third_party/python/Lib/heapq.py
+++ b/third_party/python/Lib/heapq.py
@@ -590,7 +590,7 @@ try:
 except ImportError:
   pass
 
-if __name__ == "PYOBJ.COM":
+if __name__ == "PYOBJ":
     import _heapq
 
 if __name__ == "__main__":
diff --git a/third_party/python/Lib/json/decoder.py b/third_party/python/Lib/json/decoder.py
index ae752fcda..87adced57 100644
--- a/third_party/python/Lib/json/decoder.py
+++ b/third_party/python/Lib/json/decoder.py
@@ -7,7 +7,7 @@ try:
     from _json import scanstring as c_scanstring
 except ImportError:
     c_scanstring = None
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import _json
 
 __all__ = ['JSONDecoder', 'JSONDecodeError']
diff --git a/third_party/python/Lib/json/encoder.py b/third_party/python/Lib/json/encoder.py
index d47b585c3..815a0d08e 100644
--- a/third_party/python/Lib/json/encoder.py
+++ b/third_party/python/Lib/json/encoder.py
@@ -14,7 +14,7 @@ try:
     from _json import make_encoder as c_make_encoder
 except ImportError:
     c_make_encoder = None
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import _json
 
 ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]')
diff --git a/third_party/python/Lib/json/scanner.py b/third_party/python/Lib/json/scanner.py
index 5be930beb..db7b7806b 100644
--- a/third_party/python/Lib/json/scanner.py
+++ b/third_party/python/Lib/json/scanner.py
@@ -5,7 +5,7 @@ try:
     from _json import make_scanner as c_make_scanner
 except ImportError:
     c_make_scanner = None
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import _json
 
 __all__ = ['make_scanner']
diff --git a/third_party/python/Lib/operator.py b/third_party/python/Lib/operator.py
index d8e4c6fbe..37ea0006a 100644
--- a/third_party/python/Lib/operator.py
+++ b/third_party/python/Lib/operator.py
@@ -418,7 +418,7 @@ else:
     except ImportError:
         pass
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import _operator
 
 # All of these "__func__ = func" assignments have to happen after importing
diff --git a/third_party/python/Lib/os.py b/third_party/python/Lib/os.py
index 22a6fac63..9136cfdbc 100644
--- a/third_party/python/Lib/os.py
+++ b/third_party/python/Lib/os.py
@@ -1038,7 +1038,7 @@ class PathLike(abc.ABC):
         return hasattr(subclass, '__fspath__')
 
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     CLD_CONTINUED = 0
     CLD_DUMPED = 0
     CLD_EXITED = 0
diff --git a/third_party/python/Lib/signal.py b/third_party/python/Lib/signal.py
index fd0ac1673..34b688c51 100644
--- a/third_party/python/Lib/signal.py
+++ b/third_party/python/Lib/signal.py
@@ -78,7 +78,7 @@ if 'sigwait' in _globals:
 
 del _globals, _wraps
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     ITIMER_PROF = 0
     ITIMER_REAL = 0
     ITIMER_VIRTUAL = 0
diff --git a/third_party/python/Lib/socket.py b/third_party/python/Lib/socket.py
index 62659d171..baa16703a 100644
--- a/third_party/python/Lib/socket.py
+++ b/third_party/python/Lib/socket.py
@@ -750,7 +750,7 @@ def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
                          proto, canonname, sa))
     return addrlist
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     AF_APPLETALK = 0
     AF_ASH = 0
     AF_ATMPVC = 0
diff --git a/third_party/python/Lib/sqlite3/__init__.py b/third_party/python/Lib/sqlite3/__init__.py
index a4d8c2daf..0b6253f95 100644
--- a/third_party/python/Lib/sqlite3/__init__.py
+++ b/third_party/python/Lib/sqlite3/__init__.py
@@ -25,7 +25,7 @@
 
 from sqlite3.dbapi2 import *
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     Binary = 0
     Cache = 0
     Connection = 0
diff --git a/third_party/python/Lib/sre_constants.py b/third_party/python/Lib/sre_constants.py
index 0f5461542..706c96bf0 100644
--- a/third_party/python/Lib/sre_constants.py
+++ b/third_party/python/Lib/sre_constants.py
@@ -225,7 +225,7 @@ if __name__ == "__main__":
         f.write("#define SRE_INFO_CHARSET %d\n" % SRE_INFO_CHARSET)
     print("done")
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     ANY = 0
     ANY_ALL = 0
     ASSERT = 0
diff --git a/third_party/python/Lib/stat.py b/third_party/python/Lib/stat.py
index 94dc9c46d..ecae6474e 100644
--- a/third_party/python/Lib/stat.py
+++ b/third_party/python/Lib/stat.py
@@ -26,5 +26,5 @@ FILE_ATTRIBUTE_SYSTEM = 4
 FILE_ATTRIBUTE_TEMPORARY = 256
 FILE_ATTRIBUTE_VIRTUAL = 65536
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
   import _stat
diff --git a/third_party/python/Lib/test/hello.com b/third_party/python/Lib/test/hello
similarity index 100%
rename from third_party/python/Lib/test/hello.com
rename to third_party/python/Lib/test/hello
diff --git a/third_party/python/Lib/test/pythoninfo.py b/third_party/python/Lib/test/pythoninfo.py
index 10a67be97..aa03c9798 100644
--- a/third_party/python/Lib/test/pythoninfo.py
+++ b/third_party/python/Lib/test/pythoninfo.py
@@ -7,7 +7,7 @@ import re
 import sys
 import traceback
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import resource
 
 
diff --git a/third_party/python/Lib/test/support/__init__.py b/third_party/python/Lib/test/support/__init__.py
index 701def0e7..e3a57ff81 100644
--- a/third_party/python/Lib/test/support/__init__.py
+++ b/third_party/python/Lib/test/support/__init__.py
@@ -34,7 +34,7 @@ import unittest
 import urllib.error
 import warnings
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import resource
 
 from .testresult import get_test_runner
@@ -75,7 +75,7 @@ try:
 except ImportError:
     resource = None
 
-# if __name__ == 'PYOBJ.COM':
+# if __name__ == 'PYOBJ':
 #     import bz2
 #     import zlib
 #     import resource
diff --git a/third_party/python/Lib/test/test_asdl_parser.py b/third_party/python/Lib/test/test_asdl_parser.py
index 5506c238c..91f24bf72 100644
--- a/third_party/python/Lib/test/test_asdl_parser.py
+++ b/third_party/python/Lib/test/test_asdl_parser.py
@@ -7,7 +7,7 @@ import sys
 import sysconfig
 import unittest
 
-if __name__ == "PYOBJ.COM":
+if __name__ == "PYOBJ":
     import asdl
 
 
diff --git a/third_party/python/Lib/test/test_cosmo.py b/third_party/python/Lib/test/test_cosmo.py
index a4d8a023d..abfed63dc 100644
--- a/third_party/python/Lib/test/test_cosmo.py
+++ b/third_party/python/Lib/test/test_cosmo.py
@@ -9,8 +9,8 @@ class SubprocessTest(unittest.TestCase):
     def test_execve(self):
         tmp_dir = tempfile.mkdtemp()
         self.addCleanup(shutil.rmtree, tmp_dir)
-        exe = os.path.join(tmp_dir, 'hello.com')
-        shutil.copyfile('/zip/.python/test/hello.com', exe)
+        exe = os.path.join(tmp_dir, 'hello')
+        shutil.copyfile('/zip/.python/test/hello', exe)
         os.chmod(exe, 0755)
         proc = subprocess.Popen([exe], stdout=subprocess.PIPE)
         stdout, stderr = proc.communicate()
diff --git a/third_party/python/Lib/test/test_datetime.py b/third_party/python/Lib/test/test_datetime.py
index e2ff96b2b..169b34be8 100644
--- a/third_party/python/Lib/test/test_datetime.py
+++ b/third_party/python/Lib/test/test_datetime.py
@@ -3,7 +3,7 @@ import sys
 
 from test.support import import_fresh_module, run_unittest
 
-if __name__ == "PYOBJ.COM":
+if __name__ == "PYOBJ":
     import _datetime
     import _strptime
     import datetime
diff --git a/third_party/python/Lib/test/test_decimal.py b/third_party/python/Lib/test/test_decimal.py
index bed37d56e..6718c9e66 100644
--- a/third_party/python/Lib/test/test_decimal.py
+++ b/third_party/python/Lib/test/test_decimal.py
@@ -47,7 +47,7 @@ try:
 except ImportError:
     threading = None
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import decimal
     import fractions
 
diff --git a/third_party/python/Lib/test/test_doctest.py b/third_party/python/Lib/test/test_doctest.py
index 8214fa15a..1ac6e254e 100644
--- a/third_party/python/Lib/test/test_doctest.py
+++ b/third_party/python/Lib/test/test_doctest.py
@@ -2962,7 +2962,7 @@ if __name__ == '__main__':
     else:
         test_main()
 
-if __name__ == "PYOBJ.COM":
+if __name__ == "PYOBJ":
     import test.sample_doctest
     import test.sample_doctest_no_docstrings
     import test.sample_doctest_no_doctests
diff --git a/third_party/python/Lib/test/test_fcntl.py b/third_party/python/Lib/test/test_fcntl.py
index b1564a29e..d08a53a8c 100644
--- a/third_party/python/Lib/test/test_fcntl.py
+++ b/third_party/python/Lib/test/test_fcntl.py
@@ -11,7 +11,7 @@ from test.support import (verbose, TESTFN, unlink, run_unittest, import_module,
 # Skip test if no fcntl module.
 fcntl = import_module('fcntl')
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import fcntl
     import termios
 
diff --git a/third_party/python/Lib/test/test_functools.py b/third_party/python/Lib/test/test_functools.py
index 628fdd438..1c2319bc4 100644
--- a/third_party/python/Lib/test/test_functools.py
+++ b/third_party/python/Lib/test/test_functools.py
@@ -19,7 +19,7 @@ except ImportError:
     threading = None
 
 import functools
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import decimal
 
 py_functools = support.import_fresh_module('functools', blocked=['_functools'])
diff --git a/third_party/python/Lib/test/test_gzip.py b/third_party/python/Lib/test/test_gzip.py
index eaaebcef6..35b9e8793 100644
--- a/third_party/python/Lib/test/test_gzip.py
+++ b/third_party/python/Lib/test/test_gzip.py
@@ -16,7 +16,7 @@ from test.support import _4G, bigmemtest
 from test.support.script_helper import assert_python_ok
 
 gzip = support.import_module('gzip')
-if __name__ == 'PYOBJ.COM': import gzip
+if __name__ == 'PYOBJ': import gzip
 
 data1 = b"""  int length=DEFAULTALLOC, err = Z_OK;
   PyObject *RetVal;
diff --git a/third_party/python/Lib/test/test_hashlib.py b/third_party/python/Lib/test/test_hashlib.py
index f60b09c5c..76210d386 100644
--- a/third_party/python/Lib/test/test_hashlib.py
+++ b/third_party/python/Lib/test/test_hashlib.py
@@ -24,7 +24,7 @@ from test import support
 from test.support import _4G, bigmemtest, import_fresh_module
 from http.client import HTTPException
 
-# if __name__ == 'PYOBJ.COM':
+# if __name__ == 'PYOBJ':
 #     import _sha3 # what a horror show
 
 # Were we compiled --with-pydebug or with #define Py_DEBUG?
diff --git a/third_party/python/Lib/test/test_json/test_tool.py b/third_party/python/Lib/test/test_json/test_tool.py
index 1045a40d5..0dd272a36 100644
--- a/third_party/python/Lib/test/test_json/test_tool.py
+++ b/third_party/python/Lib/test/test_json/test_tool.py
@@ -6,7 +6,7 @@ from subprocess import Popen, PIPE
 from test import support
 from test.support.script_helper import assert_python_ok
 
-if __name__ == "PYOBJ.COM":
+if __name__ == "PYOBJ":
     import json.tool
 
 class TestTool(unittest.TestCase):
diff --git a/third_party/python/Lib/test/test_marshal.py b/third_party/python/Lib/test/test_marshal.py
index d1e14a7ad..5d4577976 100644
--- a/third_party/python/Lib/test/test_marshal.py
+++ b/third_party/python/Lib/test/test_marshal.py
@@ -12,7 +12,7 @@ try:
 except ImportError:
     _testcapi = None
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import _testcapi
 
 class HelperMixin:
diff --git a/third_party/python/Lib/test/test_mmap.py b/third_party/python/Lib/test/test_mmap.py
index 38a6e52ad..c94cb5df0 100644
--- a/third_party/python/Lib/test/test_mmap.py
+++ b/third_party/python/Lib/test/test_mmap.py
@@ -10,7 +10,7 @@ import weakref
 
 # Skip test if we can't import mmap.
 mmap = import_module('mmap')
-if __name__ == 'PYOBJ.COM': import mmap
+if __name__ == 'PYOBJ': import mmap
 
 PAGESIZE = mmap.PAGESIZE
 
diff --git a/third_party/python/Lib/test/test_os.py b/third_party/python/Lib/test/test_os.py
index 2bd28d8bd..431188cda 100644
--- a/third_party/python/Lib/test/test_os.py
+++ b/third_party/python/Lib/test/test_os.py
@@ -28,7 +28,7 @@ import unittest
 import uuid
 import warnings
 from test import support
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import resource
 try:
     import _thread
diff --git a/third_party/python/Lib/test/test_repl.py b/third_party/python/Lib/test/test_repl.py
index fee2e4bd3..a2b5bcfcb 100644
--- a/third_party/python/Lib/test/test_repl.py
+++ b/third_party/python/Lib/test/test_repl.py
@@ -9,7 +9,7 @@ from textwrap import dedent
 from test.support import cpython_only, SuppressCrashReport
 from test.support.script_helper import kill_python
 
-if __name__ == "PYOBJ.COM":
+if __name__ == "PYOBJ":
     import _testcapi
 
 def spawn_repl(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw):
diff --git a/third_party/python/Lib/test/test_selectors.py b/third_party/python/Lib/test/test_selectors.py
index ac6ca2095..c32b0f0d3 100644
--- a/third_party/python/Lib/test/test_selectors.py
+++ b/third_party/python/Lib/test/test_selectors.py
@@ -15,7 +15,7 @@ try:
     import resource
 except ImportError:
     resource = None
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import resource
 
 
diff --git a/third_party/python/Lib/test/test_stat.py b/third_party/python/Lib/test/test_stat.py
index 02a44374c..35e774f0c 100644
--- a/third_party/python/Lib/test/test_stat.py
+++ b/third_party/python/Lib/test/test_stat.py
@@ -229,6 +229,6 @@ class TestFilemodeCStat(TestFilemode, unittest.TestCase):
 if __name__ == '__main__':
     unittest.main()
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
   import stat
   import _stat
diff --git a/third_party/python/Lib/test/test_syslog.py b/third_party/python/Lib/test/test_syslog.py
index b477e3d6c..b84e94dce 100644
--- a/third_party/python/Lib/test/test_syslog.py
+++ b/third_party/python/Lib/test/test_syslog.py
@@ -39,5 +39,5 @@ class Test(unittest.TestCase):
 if __name__ == "__main__":
     unittest.main()
 
-if __name__ == "PYOBJ.COM":
+if __name__ == "PYOBJ":
     import syslog
diff --git a/third_party/python/Lib/test/test_tarfile.py b/third_party/python/Lib/test/test_tarfile.py
index 68a0bb903..3a3d80368 100644
--- a/third_party/python/Lib/test/test_tarfile.py
+++ b/third_party/python/Lib/test/test_tarfile.py
@@ -26,7 +26,7 @@ try:
     import lzma
 except ImportError:
     lzma = None
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import gzip
     import bz2
 
diff --git a/third_party/python/Lib/test/test_tempfile.py b/third_party/python/Lib/test/test_tempfile.py
index faef2d300..fe1d3a7d9 100644
--- a/third_party/python/Lib/test/test_tempfile.py
+++ b/third_party/python/Lib/test/test_tempfile.py
@@ -33,7 +33,7 @@ if sys.platform.startswith('openbsd'):
 else:
     TEST_FILES = 100
 
-if __name__ == "PYOBJ.COM":
+if __name__ == "PYOBJ":
     from test import tf_inherit_check
 
 # This is organized as one test for each chunk of code in tempfile.py,
diff --git a/third_party/python/Lib/test/test_typing.py b/third_party/python/Lib/test/test_typing.py
index 548ccd452..c578e79d1 100644
--- a/third_party/python/Lib/test/test_typing.py
+++ b/third_party/python/Lib/test/test_typing.py
@@ -29,7 +29,7 @@ try:
 except ImportError:
     import collections as collections_abc  # Fallback for PY3.2.
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import test.ann_module
     import test.ann_module2
     import test.ann_module3
diff --git a/third_party/python/Lib/test/test_xml_etree_c.py b/third_party/python/Lib/test/test_xml_etree_c.py
index e0c96265f..828009af3 100644
--- a/third_party/python/Lib/test/test_xml_etree_c.py
+++ b/third_party/python/Lib/test/test_xml_etree_c.py
@@ -128,7 +128,7 @@ from encodings import (
     zlib_codec,
 )
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import _elementtree
     import xml.etree
     import xml.etree.cElementTree
diff --git a/third_party/python/Lib/warnings.py b/third_party/python/Lib/warnings.py
index ce267b90a..c1437de96 100644
--- a/third_party/python/Lib/warnings.py
+++ b/third_party/python/Lib/warnings.py
@@ -498,7 +498,7 @@ except ImportError:
         global _filters_version
         _filters_version += 1
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import _warnings
 
 # Module initialization
diff --git a/third_party/python/Lib/xml/etree/cElementTree.py b/third_party/python/Lib/xml/etree/cElementTree.py
index 98c3dec19..4c69e0e31 100644
--- a/third_party/python/Lib/xml/etree/cElementTree.py
+++ b/third_party/python/Lib/xml/etree/cElementTree.py
@@ -2,7 +2,7 @@
 
 from xml.etree.ElementTree import *
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     Comment = 0
     Element = 0
     ElementTree = 0
diff --git a/third_party/python/Lib/xml/sax/__init__.py b/third_party/python/Lib/xml/sax/__init__.py
index f18dd425a..f20d0d632 100644
--- a/third_party/python/Lib/xml/sax/__init__.py
+++ b/third_party/python/Lib/xml/sax/__init__.py
@@ -25,7 +25,7 @@ from ._exceptions import SAXException, SAXNotRecognizedException, \
                         SAXParseException, SAXNotSupportedException, \
                         SAXReaderNotAvailable
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import xml.sax
 
 def parse(source, handler, errorHandler=ErrorHandler()):
diff --git a/third_party/python/Modules/tokenbucket.c b/third_party/python/Modules/tokenbucket.c
index 802a62f62..22cd4f05a 100644
--- a/third_party/python/Modules/tokenbucket.c
+++ b/third_party/python/Modules/tokenbucket.c
@@ -223,7 +223,7 @@ PyDoc_STRVAR(blackhole_doc,
 --\n\n\
 Blackholes token for IP address.\n\
 \n\
-Bans IP address by sending it to blackholed.com. Returns 0 on success\n\
+Bans IP address by sending it to blackholed. Returns 0 on success\n\
 or errno on error. To test if blackholed is running, ban 0.0.0.0.");
 
 static PyObject *
diff --git a/third_party/python/Python/cosmomodule.c b/third_party/python/Python/cosmomodule.c
index 1681d3d42..fa82214ed 100644
--- a/third_party/python/Python/cosmomodule.c
+++ b/third_party/python/Python/cosmomodule.c
@@ -332,7 +332,7 @@ Enables logging of C function calls to stderr, e.g.\n\
         WeirdFunction()\n\
 \n\
 Please be warned this prints massive amount of text. In order for it\n\
-to work, the concomitant .com.dbg binary needs to be present.");
+to work, the concomitant .dbg binary needs to be present.");
 #endif
 
 static PyObject *
diff --git a/third_party/python/Tools/pybench/systimes.py b/third_party/python/Tools/pybench/systimes.py
index 8b6f8b34e..4ba3e742a 100755
--- a/third_party/python/Tools/pybench/systimes.py
+++ b/third_party/python/Tools/pybench/systimes.py
@@ -36,7 +36,7 @@ from __future__ import print_function
 
 import time, sys
 
-if __name__ == 'PYOBJ.COM':
+if __name__ == 'PYOBJ':
     import resource
 
 #
diff --git a/third_party/python/launch.c b/third_party/python/launch.c
index 99499beff..6914f08f6 100644
--- a/third_party/python/launch.c
+++ b/third_party/python/launch.c
@@ -51,7 +51,7 @@ PYTHON_YOINK("encodings.latin_1");
 PYTHON_YOINK("encodings.utf_8");
 PYTHON_YOINK("launchpy");
 
-extern char kLaunchPythonModuleName[]; /* generated by pyobj.com */
+extern char kLaunchPythonModuleName[]; /* generated by pyobj */
 const struct _frozen *PyImport_FrozenModules = _PyImport_FrozenModules;
 struct _inittab *PyImport_Inittab = (void *)_PyImport_Inittab;
 
diff --git a/third_party/python/pycomp.c b/third_party/python/pycomp.c
index 5acb9ae47..eb2d4a3d2 100644
--- a/third_party/python/pycomp.c
+++ b/third_party/python/pycomp.c
@@ -48,7 +48,7 @@ __static_yoink("_PyUnicode_GetCode");
 #define MANUAL "\
 SYNOPSIS\n\
 \n\
-  pycomp.com [FLAGS] SOURCE\n\
+  pycomp [FLAGS] SOURCE\n\
 \n\
 OVERVIEW\n\
 \n\
@@ -65,7 +65,7 @@ FLAGS\n\
 \n\
 EXAMPLE\n\
 \n\
-  pycomp.com -o foo/__pycache__/__init__.cpython-3.6.pyc foo/__init__.py\n\
+  pycomp -o foo/__pycache__/__init__.cpython-3.6.pyc foo/__init__.py\n\
 \n"
 
 int optimize;
diff --git a/third_party/python/pyobj.c b/third_party/python/pyobj.c
index d64aa7a81..24912cdf3 100644
--- a/third_party/python/pyobj.c
+++ b/third_party/python/pyobj.c
@@ -71,7 +71,7 @@ __static_yoink("_PyUnicode_GetCode");
 #define MANUAL "\
 SYNOPSIS\n\
 \n\
-  pyobj.com [FLAGS] SOURCE\n\
+  pyobj [FLAGS] SOURCE\n\
 \n\
 OVERVIEW\n\
 \n\
diff --git a/third_party/python/runpythonmodule.c b/third_party/python/runpythonmodule.c
index baf2a28ad..8fcd2b589 100644
--- a/third_party/python/runpythonmodule.c
+++ b/third_party/python/runpythonmodule.c
@@ -62,7 +62,7 @@ PYTHON_YOINK("encodings.aliases");
 PYTHON_YOINK("encodings.latin_1");
 PYTHON_YOINK("encodings.utf_8");
 
-extern char kLaunchPythonModuleName[]; /* optionally generated by pyobj.com */
+extern char kLaunchPythonModuleName[]; /* optionally generated by pyobj */
 const struct _frozen *PyImport_FrozenModules = _PyImport_FrozenModules;
 struct _inittab *PyImport_Inittab = (void *)_PyImport_Inittab;
 static int g_gotint;
diff --git a/third_party/sed/BUILD.mk b/third_party/sed/BUILD.mk
index 3f74547d2..37cf771b4 100644
--- a/third_party/sed/BUILD.mk
+++ b/third_party/sed/BUILD.mk
@@ -41,7 +41,7 @@ $(THIRD_PARTY_SED_A).pkg:				\
 		$(THIRD_PARTY_SED_OBJS)			\
 		$(foreach x,$(THIRD_PARTY_SED_A_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/sed/sed.com.dbg:			\
+o/$(MODE)/third_party/sed/sed.dbg:			\
 		$(THIRD_PARTY_SED)			\
 		o/$(MODE)/third_party/sed/cmd.o		\
 		$(CRT)					\
@@ -49,7 +49,7 @@ o/$(MODE)/third_party/sed/sed.com.dbg:			\
 	@$(APELINK)
 
 THIRD_PARTY_SED_BINS = $(THIRD_PARTY_SED_COMS) $(THIRD_PARTY_SED_COMS:%=%.dbg)
-THIRD_PARTY_SED_COMS = o/$(MODE)/third_party/sed/sed.com
+THIRD_PARTY_SED_COMS = o/$(MODE)/third_party/sed/sed
 THIRD_PARTY_SED_LIBS = $(THIRD_PARTY_SED_A)
 $(THIRD_PARTY_SED_OBJS): $(BUILD_FILES) third_party/sed/BUILD.mk
 
diff --git a/third_party/smallz4/BUILD.mk b/third_party/smallz4/BUILD.mk
index a99fb520b..ecc92c5a3 100644
--- a/third_party/smallz4/BUILD.mk
+++ b/third_party/smallz4/BUILD.mk
@@ -54,14 +54,14 @@ $(THIRD_PARTY_SMALLZ4_A).pkg:					\
 		$(THIRD_PARTY_SMALLZ4_A_OBJS)			\
 		$(foreach x,$(THIRD_PARTY_SMALLZ4_A_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/smallz4/smallz4.com.dbg:			\
+o/$(MODE)/third_party/smallz4/smallz4.dbg:			\
 		$(THIRD_PARTY_SMALLZ4)				\
 		o/$(MODE)/third_party/smallz4/smallz4.o		\
 		$(CRT)						\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/smallz4/smallz4cat.com.dbg:		\
+o/$(MODE)/third_party/smallz4/smallz4cat.dbg:			\
 		$(THIRD_PARTY_SMALLZ4)				\
 		o/$(MODE)/third_party/smallz4/smallz4cat.o	\
 		$(CRT)						\
@@ -69,8 +69,8 @@ o/$(MODE)/third_party/smallz4/smallz4cat.com.dbg:		\
 	@$(APELINK)
 
 THIRD_PARTY_SMALLZ4_COMS =					\
-	o/$(MODE)/third_party/smallz4/smallz4.com		\
-	o/$(MODE)/third_party/smallz4/smallz4cat.com
+	o/$(MODE)/third_party/smallz4/smallz4			\
+	o/$(MODE)/third_party/smallz4/smallz4cat
 
 THIRD_PARTY_SMALLZ4_LIBS = $(foreach x,$(THIRD_PARTY_SMALLZ4_ARTIFACTS),$($(x)))
 THIRD_PARTY_SMALLZ4_SRCS = $(foreach x,$(THIRD_PARTY_SMALLZ4_ARTIFACTS),$($(x)_SRCS))
diff --git a/third_party/sqlite3/BUILD.mk b/third_party/sqlite3/BUILD.mk
index 4177cdb19..38f086950 100644
--- a/third_party/sqlite3/BUILD.mk
+++ b/third_party/sqlite3/BUILD.mk
@@ -36,7 +36,7 @@ THIRD_PARTY_SQLITE3_SHELL_OBJS =					\
 	$(filter %shell.o,$(THIRD_PARTY_SQLITE3_A_SRCS_C:%.c=o/$(MODE)/%.o))
 
 THIRD_PARTY_SQLITE3_COMS =						\
-	o/$(MODE)/third_party/sqlite3/sqlite3.com
+	o/$(MODE)/third_party/sqlite3/sqlite3
 
 THIRD_PARTY_SQLITE3_A_CHECKS =						\
 	$(THIRD_PARTY_SQLITE3_A).pkg					\
@@ -67,7 +67,7 @@ THIRD_PARTY_SQLITE3_A_DIRECTDEPS =					\
 THIRD_PARTY_SQLITE3_A_DEPS :=						\
 	$(call uniq,$(foreach x,$(THIRD_PARTY_SQLITE3_A_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/third_party/sqlite3/sqlite3.com.dbg:				\
+o/$(MODE)/third_party/sqlite3/sqlite3.dbg:				\
 		$(THIRD_PARTY_SQLITE3_A_DEPS)				\
 		$(THIRD_PARTY_SQLITE3_SHELL_OBJS)			\
 		o/$(MODE)/third_party/sqlite3/shell.o			\
@@ -76,14 +76,6 @@ o/$(MODE)/third_party/sqlite3/sqlite3.com.dbg:				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/sqlite3/sqlite3.com:				\
-		o/$(MODE)/third_party/sqlite3/sqlite3.com.dbg		\
-		o/$(MODE)/third_party/zip/zip.com			\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
 $(THIRD_PARTY_SQLITE3_A):						\
 		third_party/sqlite3/					\
 		$(THIRD_PARTY_SQLITE3_A).pkg				\
diff --git a/third_party/tidy/BUILD.mk b/third_party/tidy/BUILD.mk
index 7df2d9c1e..c91f0e17c 100644
--- a/third_party/tidy/BUILD.mk
+++ b/third_party/tidy/BUILD.mk
@@ -44,7 +44,7 @@ $(THIRD_PARTY_TIDY_A).pkg:							\
 		$(THIRD_PARTY_TIDY_A_OBJS)					\
 		$(foreach x,$(THIRD_PARTY_TIDY_A_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/tidy/tidy.com.dbg:					\
+o/$(MODE)/third_party/tidy/tidy.dbg:						\
 		$(THIRD_PARTY_TIDY)						\
 		o/$(MODE)/third_party/tidy/tidy.o				\
 		o/$(MODE)/third_party/tidy/.tidyrc.zip.o			\
@@ -52,18 +52,10 @@ o/$(MODE)/third_party/tidy/tidy.com.dbg:					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/tidy/tidy.com:						\
-		o/$(MODE)/third_party/tidy/tidy.com.dbg				\
-		o/$(MODE)/third_party/zip/zip.com				\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
 o/$(MODE)/third_party/tidy/.tidyrc.zip.o: private ZIPOBJ_FLAGS += -B
 
 THIRD_PARTY_TIDY_COMS =								\
-	o/$(MODE)/third_party/tidy/tidy.com
+	o/$(MODE)/third_party/tidy/tidy
 
 THIRD_PARTY_TIDY_LIBS = $(foreach x,$(THIRD_PARTY_TIDY_ARTIFACTS),$($(x)))
 THIRD_PARTY_TIDY_SRCS = $(foreach x,$(THIRD_PARTY_TIDY_ARTIFACTS),$($(x)_SRCS))
diff --git a/third_party/tr/BUILD.mk b/third_party/tr/BUILD.mk
index f73c16980..54a17731b 100644
--- a/third_party/tr/BUILD.mk
+++ b/third_party/tr/BUILD.mk
@@ -40,7 +40,7 @@ $(THIRD_PARTY_TR_A).pkg:			\
 		$(THIRD_PARTY_TR_OBJS)		\
 		$(foreach x,$(THIRD_PARTY_TR_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/tr/tr.com.dbg:		\
+o/$(MODE)/third_party/tr/tr.dbg:		\
 		$(THIRD_PARTY_TR)		\
 		o/$(MODE)/third_party/tr/cmd.o	\
 		$(CRT)				\
@@ -49,7 +49,7 @@ o/$(MODE)/third_party/tr/tr.com.dbg:		\
 
 THIRD_PARTY_TR_LIBS = $(THIRD_PARTY_TR_A)
 THIRD_PARTY_TR_BINS = $(THIRD_PARTY_TR_COMS) $(THIRD_PARTY_TR_COMS:%=%.dbg)
-THIRD_PARTY_TR_COMS = o/$(MODE)/third_party/tr/tr.com
+THIRD_PARTY_TR_COMS = o/$(MODE)/third_party/tr/tr
 $(THIRD_PARTY_TR_OBJS): $(BUILD_FILES) third_party/tr/BUILD.mk
 
 .PHONY: o/$(MODE)/third_party/tr
diff --git a/third_party/tree/BUILD.mk b/third_party/tree/BUILD.mk
index 2357132e4..abdbaf4ac 100644
--- a/third_party/tree/BUILD.mk
+++ b/third_party/tree/BUILD.mk
@@ -40,7 +40,7 @@ $(THIRD_PARTY_TREE_A).pkg:				\
 		$(THIRD_PARTY_TREE_OBJS)		\
 		$(foreach x,$(THIRD_PARTY_TREE_A_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/tree/tree.com.dbg:		\
+o/$(MODE)/third_party/tree/tree.dbg:			\
 		$(THIRD_PARTY_TREE)			\
 		o/$(MODE)/third_party/tree/tree.o	\
 		$(CRT)					\
@@ -48,7 +48,7 @@ o/$(MODE)/third_party/tree/tree.com.dbg:		\
 	@$(APELINK)
 
 THIRD_PARTY_TREE_BINS = $(THIRD_PARTY_TREE_COMS) $(THIRD_PARTY_TREE_COMS:%=%.dbg)
-THIRD_PARTY_TREE_COMS = o/$(MODE)/third_party/tree/tree.com
+THIRD_PARTY_TREE_COMS = o/$(MODE)/third_party/tree/tree
 THIRD_PARTY_TREE_LIBS = $(THIRD_PARTY_TREE_A)
 $(THIRD_PARTY_TREE_OBJS): $(BUILD_FILES) third_party/tree/BUILD.mk
 
diff --git a/third_party/unzip/BUILD.mk b/third_party/unzip/BUILD.mk
index f39da5e6e..945aef41c 100644
--- a/third_party/unzip/BUILD.mk
+++ b/third_party/unzip/BUILD.mk
@@ -41,7 +41,7 @@ $(THIRD_PARTY_UNZIP_A).pkg:							\
 		$(THIRD_PARTY_UNZIP_A_OBJS)					\
 		$(foreach x,$(THIRD_PARTY_UNZIP_A_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/unzip/unzip.com.dbg:					\
+o/$(MODE)/third_party/unzip/unzip.dbg:						\
 		$(THIRD_PARTY_UNZIP)						\
 		o/$(MODE)/third_party/unzip/unzip.o				\
 		$(CRT)								\
@@ -62,7 +62,7 @@ $(THIRD_PARTY_UNZIP_A_OBJS): private						\
 		CFLAGS +=							\
 			$(OLD_CODE)
 
-THIRD_PARTY_UNZIP_COMS = o/$(MODE)/third_party/unzip/unzip.com
+THIRD_PARTY_UNZIP_COMS = o/$(MODE)/third_party/unzip/unzip
 THIRD_PARTY_UNZIP_BINS = $(THIRD_PARTY_UNZIP_COMS) $(THIRD_PARTY_UNZIP_COMS:%=%.dbg)
 THIRD_PARTY_UNZIP_LIBS = $(foreach x,$(THIRD_PARTY_UNZIP_ARTIFACTS),$($(x)))
 THIRD_PARTY_UNZIP_SRCS = $(foreach x,$(THIRD_PARTY_UNZIP_ARTIFACTS),$($(x)_SRCS))
diff --git a/third_party/xxhash/BUILD.mk b/third_party/xxhash/BUILD.mk
index 5d898b8fd..2cfc33615 100644
--- a/third_party/xxhash/BUILD.mk
+++ b/third_party/xxhash/BUILD.mk
@@ -39,7 +39,7 @@ $(THIRD_PARTY_XXHASH_A).pkg:					\
 		$(THIRD_PARTY_XXHASH_OBJS)			\
 		$(foreach x,$(THIRD_PARTY_XXHASH_A_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/xxhash/xxhsum.com.dbg:			\
+o/$(MODE)/third_party/xxhash/xxhsum.dbg:			\
 		$(THIRD_PARTY_XXHASH)				\
 		o/$(MODE)/third_party/xxhash/cli/xxhsum.o	\
 		$(CRT)						\
@@ -47,7 +47,7 @@ o/$(MODE)/third_party/xxhash/xxhsum.com.dbg:			\
 	@$(APELINK)
 
 THIRD_PARTY_XXHASH_BINS = $(THIRD_PARTY_XXHASH_COMS) $(THIRD_PARTY_XXHASH_COMS:%=%.dbg)
-THIRD_PARTY_XXHASH_COMS = o/$(MODE)/third_party/xxhash/xxhsum.com
+THIRD_PARTY_XXHASH_COMS = o/$(MODE)/third_party/xxhash/xxhsum
 THIRD_PARTY_XXHASH_LIBS = $(THIRD_PARTY_XXHASH_A)
 
 .PHONY: o/$(MODE)/third_party/xxhash
diff --git a/third_party/zip/BUILD.mk b/third_party/zip/BUILD.mk
index 43dfc78e0..3ca3d80c9 100644
--- a/third_party/zip/BUILD.mk
+++ b/third_party/zip/BUILD.mk
@@ -9,10 +9,10 @@ THIRD_PARTY_ZIP_HDRS = $(filter %.h,$(THIRD_PARTY_ZIP_FILES))
 THIRD_PARTY_ZIP_INCS = $(filter %.inc,$(THIRD_PARTY_ZIP_FILES))
 
 THIRD_PARTY_ZIP_COMS =				\
-	o/$(MODE)/third_party/zip/zip.com	\
-	o/$(MODE)/third_party/zip/zipsplit.com	\
-	o/$(MODE)/third_party/zip/zipnote.com	\
-	o/$(MODE)/third_party/zip/zipcloak.com
+	o/$(MODE)/third_party/zip/zip		\
+	o/$(MODE)/third_party/zip/zipsplit	\
+	o/$(MODE)/third_party/zip/zipnote	\
+	o/$(MODE)/third_party/zip/zipcloak
 
 THIRD_PARTY_ZIP_BINS =				\
 	$(THIRD_PARTY_ZIP_COMS)			\
@@ -102,28 +102,28 @@ o/$(MODE)/third_party/zip/zip.pkg:		\
 		$(THIRD_PARTY_ZIP_ZIP_OBJS)	\
 		$(foreach x,$(THIRD_PARTY_ZIP_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/third_party/zip/zip.com.dbg:		\
+o/$(MODE)/third_party/zip/zip.dbg:		\
 		$(THIRD_PARTY_ZIP_DEPS)		\
 		$(THIRD_PARTY_ZIP_ZIP_OBJS)	\
 		$(CRT)				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/zip/zipsplit.com.dbg:	\
+o/$(MODE)/third_party/zip/zipsplit.dbg:		\
 		$(THIRD_PARTY_ZIP_DEPS)		\
 		$(THIRD_PARTY_ZIPSPLIT_OBJS)	\
 		$(CRT)				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/zip/zipnote.com.dbg:	\
+o/$(MODE)/third_party/zip/zipnote.dbg:		\
 		$(THIRD_PARTY_ZIP_DEPS)		\
 		$(THIRD_PARTY_ZIPNOTE_OBJS)	\
 		$(CRT)				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/third_party/zip/zipcloak.com.dbg:	\
+o/$(MODE)/third_party/zip/zipcloak.dbg:		\
 		$(THIRD_PARTY_ZIP_DEPS)		\
 		$(THIRD_PARTY_ZIPCLOAK_OBJS)	\
 		$(CRT)				\
diff --git a/third_party/zstd/BUILD.mk b/third_party/zstd/BUILD.mk
index 5aa69393c..2bf4f894d 100644
--- a/third_party/zstd/BUILD.mk
+++ b/third_party/zstd/BUILD.mk
@@ -154,7 +154,7 @@ $(THIRD_PARTY_ZSTD_A_OBJS): private				\
 		CPPFLAGS +=					\
 			-DZSTD_MULTITHREAD
 
-o/$(MODE)/third_party/zstd/zstd.com.dbg:			\
+o/$(MODE)/third_party/zstd/zstd.dbg:				\
 		$(THIRD_PARTY_ZSTD)				\
 		o/$(MODE)/third_party/zstd/programs/zstdcli.o	\
 		$(CRT)						\
@@ -169,7 +169,7 @@ o/$(MODE)/third_party/zstd/lib/compress/zstd_lazy.o:		\
 		QUOTA += -C64
 
 THIRD_PARTY_ZSTD_BINS = $(THIRD_PARTY_ZSTD_COMS) $(THIRD_PARTY_ZSTD_COMS:%=%.dbg)
-THIRD_PARTY_ZSTD_COMS = o/$(MODE)/third_party/zstd/zstd.com
+THIRD_PARTY_ZSTD_COMS = o/$(MODE)/third_party/zstd/zstd
 THIRD_PARTY_ZSTD_LIBS = $(THIRD_PARTY_ZSTD_A)
 THIRD_PARTY_ZSTD_SRCS = $(foreach x,$(THIRD_PARTY_ZSTD_ARTIFACTS),$($(x)_SRCS))
 THIRD_PARTY_ZSTD_INCS = $(foreach x,$(THIRD_PARTY_ZSTD_ARTIFACTS),$($(x)_INCS))
diff --git a/tool/build/BUILD.mk b/tool/build/BUILD.mk
index 16dbb8e91..1810aed74 100644
--- a/tool/build/BUILD.mk
+++ b/tool/build/BUILD.mk
@@ -15,7 +15,7 @@ TOOL_BUILD_OBJS =							\
 	$(TOOL_BUILD_SRCS:%.c=o/$(MODE)/%.o)
 
 TOOL_BUILD_COMS =							\
-	$(TOOL_BUILD_SRCS:%.c=o/$(MODE)/%.com)
+	$(TOOL_BUILD_SRCS:%.c=o/$(MODE)/%)
 
 TOOL_BUILD_CHECKS =							\
 	$(TOOL_BUILD).pkg						\
@@ -69,7 +69,7 @@ o/$(MODE)/tool/build/build.pkg:						\
 		$(TOOL_BUILD_OBJS)					\
 		$(foreach x,$(TOOL_BUILD_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/tool/build/%.com.dbg:						\
+o/$(MODE)/tool/build/%.dbg:						\
 		$(TOOL_BUILD_DEPS)					\
 		o/$(MODE)/tool/build/build.pkg				\
 		o/$(MODE)/tool/build/%.o				\
@@ -78,9 +78,9 @@ o/$(MODE)/tool/build/%.com.dbg:						\
 	@$(APELINK)
 
 o/$(MODE)/tool/build/dso/sandbox-$(ARCH).so.zip.o			\
-o/$(MODE)/tool/build/false.com.zip.o					\
-o/$(MODE)/tool/build/echo.com.zip.o					\
-o/$(MODE)/tool/build/cocmd.com.zip.o: private				\
+o/$(MODE)/tool/build/false.zip.o					\
+o/$(MODE)/tool/build/echo.zip.o						\
+o/$(MODE)/tool/build/cocmd.zip.o: private				\
 		ZIPOBJ_FLAGS +=						\
 			-B
 
@@ -115,7 +115,7 @@ o/$(MODE)/tool/build/dso/sandbox-$(ARCH).so:				\
 		o/$(MODE)/libc/sysv/restorert.o				\
 		$(OUTPUT_OPTION)
 
-o/$(MODE)/tool/build/pledge.com.dbg:					\
+o/$(MODE)/tool/build/pledge.dbg:					\
 		$(TOOL_BUILD_DEPS)					\
 		o/$(MODE)/tool/build/build.pkg				\
 		o/$(MODE)/tool/build/dso/sandbox-$(ARCH).so.zip.o	\
@@ -135,8 +135,8 @@ o/$(MODE)/tool/build/dso/dlopen_helper.so:				\
 		o/$(MODE)/tool/build/dso/dlopen_helper.o		\
 		$(OUTPUT_OPTION)
 
-o/$(MODE)/tool/build/dlopen_test.com.runs:				\
-		o/$(MODE)/tool/build/dlopen_test.com			\
+o/$(MODE)/tool/build/dlopen_test.runs:					\
+		o/$(MODE)/tool/build/dlopen_test			\
 		o/$(MODE)/tool/build/dso/dlopen_helper.so
 	$< o/$(MODE)/tool/build/dso/dlopen_helper.so
 
diff --git a/tool/build/apelink.c b/tool/build/apelink.c
index 0c9052f34..7e5ae9aa5 100644
--- a/tool/build/apelink.c
+++ b/tool/build/apelink.c
@@ -1722,7 +1722,7 @@ static unsigned char *GetZipEndOfCentralDirectory(struct Input *in) {
     }
   }
   Die(in->path, "zip eocd not found in last 64kb of elf even though a .zip "
-                "section exists; you may need to run fixupobj.com");
+                "section exists; you may need to run fixupobj");
 }
 
 static void IndexZipAssetsFromElf(struct Input *in) {
diff --git a/tool/build/assimilate.c b/tool/build/assimilate.c
index 1aace9df2..3a4a63169 100644
--- a/tool/build/assimilate.c
+++ b/tool/build/assimilate.c
@@ -24,11 +24,11 @@
 #include "libc/elf/struct/ehdr.h"
 #include "libc/errno.h"
 #include "libc/fmt/conv.h"
-#include "libc/serialize.h"
 #include "libc/limits.h"
 #include "libc/macho.internal.h"
 #include "libc/macros.internal.h"
 #include "libc/runtime/runtime.h"
+#include "libc/serialize.h"
 #include "libc/stdckdint.h"
 #include "libc/stdio/stdio.h"
 #include "libc/str/str.h"
@@ -275,7 +275,7 @@ static void GetMachoPayload(const char *image, size_t imagesize,
   //
   //   - `arg="  9293"` is how we originally had ape do it
   //   - `arg=$((  9293))` b/c busybox sh disliked quoted space
-  //   - `arg=9293  ` is generated by modern apelink.com program
+  //   - `arg=9293  ` is generated by modern apelink program
   //
   unassert(regcomp(&rx,
                    "bs="              // dd block size arg
@@ -507,7 +507,7 @@ static void Assimilate(void) {
       case FORMAT_MACHO:
         Die(path, "can't assimilate elf to macho");
       case FORMAT_PE:
-        Die(path, "can't assimilate elf to pe (try elf2pe.com)");
+        Die(path, "can't assimilate elf to pe (try elf2pe)");
       default:
         unassert(false);
     }
diff --git a/tool/build/compile.c b/tool/build/compile.c
index 576177ef5..6beb51581 100644
--- a/tool/build/compile.c
+++ b/tool/build/compile.c
@@ -73,7 +73,7 @@ __static_yoink("zipos");
   "\
 SYNOPSIS\n\
 \n\
-  compile.com [FLAGS] COMMAND [ARGS...]\n\
+  compile [FLAGS] COMMAND [ARGS...]\n\
 \n\
 OVERVIEW\n\
 \n\
@@ -83,7 +83,7 @@ DESCRIPTION\n\
 \n\
   This is a generic command wrapper, e.g.\n\
 \n\
-    compile.com gcc -o program program.c\n\
+    compile gcc -o program program.c\n\
 \n\
   This wrapper provides the following services:\n\
 \n\
@@ -681,7 +681,7 @@ int Launch(void) {
     } else {
       /* this should never happen */
       PrintRed();
-      appends(&output, "error: compile.com read() failed w/ ");
+      appends(&output, "error: compile read() failed w/ ");
       appendd(&output, buf, FormatInt64(buf, errno) - buf);
       PrintReset();
       appendw(&output, READ16LE(": "));
@@ -704,7 +704,7 @@ int Launch(void) {
     } else {
       /* this should never happen */
       PrintRed();
-      appends(&output, "error: compile.com wait4() failed w/ ");
+      appends(&output, "error: compile wait4() failed w/ ");
       appendd(&output, buf, FormatInt64(buf, errno) - buf);
       PrintReset();
       appendw(&output, READ16LE(": "));
@@ -716,13 +716,13 @@ int Launch(void) {
   if (gotchld) {
     us = GetTimespecMicros(finish) - GetTimespecMicros(signalled);
     if (us > 1000000) {
-      appends(&output, "wut: compile.com needed ");
+      appends(&output, "wut: compile needed ");
       appendd(&output, buf, FormatUint64Thousands(buf, us) - buf);
       appends(&output, "Β΅s to wait() for zombie ");
       rc = -1;
     }
     if (gotchld > 1) {
-      appends(&output, "wut: compile.com got multiple sigchld?! ");
+      appends(&output, "wut: compile got multiple sigchld?! ");
       rc = -1;
     }
   }
@@ -909,9 +909,9 @@ int main(int argc, char *argv[]) {
     isgcc = true;
   } else if (strstr(s, "ld.bfd")) {
     isbfd = true;
-  } else if (strstr(s, "ar.com")) {
+  } else if (strstr(s, "ar")) {
     isar = true;
-  } else if (strstr(s, "package.com")) {
+  } else if (strstr(s, "package")) {
     ispkg = true;
   }
 
@@ -921,7 +921,7 @@ int main(int argc, char *argv[]) {
     // replace output filename argument
     //
     // some commands (e.g. ar) don't use the `-o PATH` notation. in that
-    // case we assume the output path was passed to compile.com -TTARGET
+    // case we assume the output path was passed to compile -TTARGET
     // which means we can replace the appropriate command line argument.
     if (!noworkaround &&  //
         !movepath &&      //
@@ -1180,7 +1180,7 @@ int main(int argc, char *argv[]) {
   } else if (target) {
     outpath = target;
   } else {
-    fputs("error: compile.com needs -TTARGET or -oOUTPATH\n", stderr);
+    fputs("error: compile needs -TTARGET or -oOUTPATH\n", stderr);
     exit(7);
   }
 
@@ -1514,10 +1514,10 @@ int main(int argc, char *argv[]) {
   // flush output
   if (WriteAllUntilSignalledOrError(2, output, appendz(output).i) == -1) {
     if (errno == EINTR) {
-      s = "notice: compile.com output truncated\n";
+      s = "notice: compile output truncated\n";
     } else {
       if (!exitcode) exitcode = 55;
-      s = "error: compile.com failed to write result\n";
+      s = "error: compile failed to write result\n";
     }
     write(2, s, strlen(s));
   }
diff --git a/tool/build/dropcache.c b/tool/build/dropcache.c
index 9ef7f455e..a10a6cfad 100644
--- a/tool/build/dropcache.c
+++ b/tool/build/dropcache.c
@@ -26,10 +26,10 @@
 /**
  * Removes file system caches from RAM.
  *
- * make o//tool/build/dropcache.com
- * sudo mv o//tool/build/dropcache.com /usr/local/bin/
- * sudo chown root /usr/local/bin/dropcache.com
- * sudo chmod u+s /usr/local/bin/dropcache.com
+ * make o//tool/build/dropcache
+ * sudo mv o//tool/build/dropcache /usr/local/bin/
+ * sudo chown root /usr/local/bin/dropcache
+ * sudo chmod u+s /usr/local/bin/dropcache
  */
 
 static void Write(int fd, const char *s) {
diff --git a/tool/build/elf2pe.c b/tool/build/elf2pe.c
index 8ae6d8957..6e65bda36 100644
--- a/tool/build/elf2pe.c
+++ b/tool/build/elf2pe.c
@@ -25,7 +25,6 @@
 #include "libc/elf/struct/shdr.h"
 #include "libc/fmt/conv.h"
 #include "libc/fmt/itoa.h"
-#include "libc/serialize.h"
 #include "libc/intrin/describeflags.internal.h"
 #include "libc/intrin/dll.h"
 #include "libc/limits.h"
@@ -39,6 +38,7 @@
 #include "libc/nt/struct/imageoptionalheader.internal.h"
 #include "libc/nt/struct/imagesectionheader.internal.h"
 #include "libc/runtime/runtime.h"
+#include "libc/serialize.h"
 #include "libc/stdckdint.h"
 #include "libc/stdio/stdio.h"
 #include "libc/str/str.h"
@@ -48,7 +48,7 @@
 #include "third_party/getopt/getopt.internal.h"
 
 // see tool/hello/hello-pe.c for an example program this can link
-// make -j8 m=tiny o/tiny/tool/hello/hello-pe.com
+// make -j8 m=tiny o/tiny/tool/hello/hello-pe
 
 #pragma GCC diagnostic ignored "-Wstringop-overflow"
 
diff --git a/tool/build/lib/BUILD.mk b/tool/build/lib/BUILD.mk
index 611db5c6a..0d40181f2 100644
--- a/tool/build/lib/BUILD.mk
+++ b/tool/build/lib/BUILD.mk
@@ -22,14 +22,14 @@ TOOL_BUILD_LIB_A_SRCS =					\
 	$(TOOL_BUILD_LIB_A_SRCS_C)
 
 TOOL_BUILD_LIB_COMS =					\
-	o/$(MODE)/tool/build/lib/apetest.com		\
-	o/$(MODE)/tool/build/lib/apetest2.com
+	o/$(MODE)/tool/build/lib/apetest		\
+	o/$(MODE)/tool/build/lib/apetest2
 
 TOOL_BUILD_LIB_A_OBJS =					\
 	$(TOOL_BUILD_LIB_A_SRCS_S:%.S=o/$(MODE)/%.o)	\
 	$(TOOL_BUILD_LIB_A_SRCS_C:%.c=o/$(MODE)/%.o)	\
-	o/$(MODE)/tool/build/lib/apetest.com.zip.o	\
-	o/$(MODE)/tool/build/lib/apetest2.com.zip.o
+	o/$(MODE)/tool/build/lib/apetest.zip.o	\
+	o/$(MODE)/tool/build/lib/apetest2.zip.o
 
 TOOL_BUILD_LIB_A_DIRECTDEPS =				\
 	LIBC_CALLS					\
@@ -74,22 +74,22 @@ o/$(MODE)/tool/build/lib/ssefloat.o: private		\
 			-msse3
 endif
 
-o/$(MODE)/tool/build/lib/apetest.com.dbg:		\
+o/$(MODE)/tool/build/lib/apetest.dbg:			\
 		$(TOOL_BUILD_LIB_A_DEPS)		\
 		o/$(MODE)/tool/build/lib/apetest.o	\
 		$(CRT)					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/tool/build/lib/apetest2.com.dbg:		\
+o/$(MODE)/tool/build/lib/apetest2.dbg:			\
 		$(TOOL_BUILD_LIB_A_DEPS)		\
 		o/$(MODE)/tool/build/lib/apetest.o	\
 		$(CRT)					\
 		$(APE_COPY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/tool/build/lib/apetest.com.zip.o		\
-o/$(MODE)/tool/build/lib/apetest2.com.zip.o: private	\
+o/$(MODE)/tool/build/lib/apetest.zip.o			\
+o/$(MODE)/tool/build/lib/apetest2.zip.o: private	\
 		ZIPOBJ_FLAGS +=				\
 			-B
 
diff --git a/tool/build/lib/getargs.c b/tool/build/lib/getargs.c
index ac0535aa4..f500708ac 100644
--- a/tool/build/lib/getargs.c
+++ b/tool/build/lib/getargs.c
@@ -37,12 +37,12 @@
  * The purpose of this library is to be able to have build commands with
  * huge argument lists. The way we do that is by replacing commands like
  *
- *     foo.com lots of args
+ *     foo lots of args
  *
  * with this
  *
  *     echo of args >args
- *     foo.com lots @args
+ *     foo lots @args
  *
  * This iterator abstracts the process of reading the special `@`
  * prefixed args. In order to do that quickly and easily, we make the
@@ -57,7 +57,7 @@
  *     # don't do this
  *     target: thousands of args
  *         $(file >$@.args) $(foreach x,$^,$(file >>$@.args,$(x)))
- *         tool.com -o $@ @$@.args
+ *         tool -o $@ @$@.args
  *
  * That is slow because it needs to open and close the args file
  * thousands of times. If we trade away filenames with spaces then the
@@ -66,7 +66,7 @@
  *     # do this
  *     target: thousands of args
  *         $(file >$@.args,$^)
- *         tool.com -o $@ @$@.args
+ *         tool -o $@ @$@.args
  *
  * We need (2) because it make the code in this file simpler and avoids
  * a malloc() dependency. Having that trailing character means argument
diff --git a/tool/build/lib/psk.c b/tool/build/lib/psk.c
index d1640b83c..47c5b57d9 100644
--- a/tool/build/lib/psk.c
+++ b/tool/build/lib/psk.c
@@ -37,7 +37,7 @@ void *GetRunitPsk(void) {
   struct stat st;
   p = gc(xasprintf("%s/.runit.psk", gc(xhomedir())));
   if (stat(p, &st) == -1 || st.st_size != 32) {
-    fprintf(stderr, "need o//examples/getrandom.com -bn32 >~/.runit.psk\n");
+    fprintf(stderr, "need o//examples/getrandom -bn32 >~/.runit.psk\n");
     exit(1);
   }
   CHECK_NOTNULL((r = malloc(32)));
diff --git a/tool/build/march-native.c b/tool/build/march-native.c
index bff08934b..6b402a9fa 100644
--- a/tool/build/march-native.c
+++ b/tool/build/march-native.c
@@ -40,10 +40,10 @@
   "-march=native flag printer v0.1\n" \
   "copyright 2023 justine alexandra roberts tunney\n"
 
-#define USAGE                        \
-  "usage: march-native.com [-hvc]\n" \
-  "  -h          show help\n"        \
-  "  -v          show version\n"     \
+#define USAGE                    \
+  "usage: march-native [-hvc]\n" \
+  "  -h          show help\n"    \
+  "  -v          show version\n" \
   "  -c          assume we're using clang (not gcc)\n"
 
 static bool isclang;
diff --git a/tool/build/mktemper.c b/tool/build/mktemper.c
index b3f89a77e..552eb47cb 100644
--- a/tool/build/mktemper.c
+++ b/tool/build/mktemper.c
@@ -28,7 +28,7 @@
 /**
  * @fileoverview stronger mktemp for shell scripts, e.g.
  *
- *     o//tool/build/mktemper.com ${TMPDIR:-/tmp}/fooXXXXXXXXXXXXX.o
+ *     o//tool/build/mktemper ${TMPDIR:-/tmp}/fooXXXXXXXXXXXXX.o
  *
  * Is a good way to name an intermediate object file.
  */
diff --git a/tool/build/package.c b/tool/build/package.c
index b52299eff..dd74c66c4 100644
--- a/tool/build/package.c
+++ b/tool/build/package.c
@@ -52,11 +52,11 @@ __static_yoink("realloc");
  *
  * This script verifies the well-formedness of dependencies, e.g.
  *
- *     o/tool/build/package.com \
+ *     o/tool/build/package \
  *       -o o/libc/stubs/stubs.pkg \
  *       o/libc/stubs/{a,b,...}.o
  *
- *     o/tool/build/package.com \
+ *     o/tool/build/package \
  *       -o o/libc/nexgen32e/nexgen32e.pkg \
  *       -d o/libc/stubs/stubs.pkg \
  *       o/libc/nexgen32e/{a,b,...}.o
@@ -358,15 +358,14 @@ static void GetOpts(struct Package *pkg, struct Packages *deps, int argc,
     }
   }
   if (pkg->path == -1) {
-    tinyprint(2, "error: no packages passed to package.com\n", NULL);
+    tinyprint(2, "error: no packages passed to package\n", NULL);
     exit(1);
   }
   if (optind == argc) {
-    tinyprint(
-        2,
-        "no objects passed to package.com; is your foo.mk $(FOO_OBJS) glob "
-        "broken?\n",
-        NULL);
+    tinyprint(2,
+              "no objects passed to package; is your foo.mk $(FOO_OBJS) glob "
+              "broken?\n",
+              NULL);
     exit(1);
   }
   getargs_init(&ga, argv + optind);
diff --git a/tool/build/pledge.c b/tool/build/pledge.c
index 910897345..26af168e7 100644
--- a/tool/build/pledge.c
+++ b/tool/build/pledge.c
@@ -37,7 +37,6 @@
 #include "libc/errno.h"
 #include "libc/fmt/conv.h"
 #include "libc/fmt/itoa.h"
-#include "libc/serialize.h"
 #include "libc/intrin/kprintf.h"
 #include "libc/intrin/promises.internal.h"
 #include "libc/intrin/safemacros.internal.h"
@@ -48,6 +47,7 @@
 #include "libc/nexgen32e/kcpuids.h"
 #include "libc/runtime/runtime.h"
 #include "libc/runtime/stack.h"
+#include "libc/serialize.h"
 #include "libc/sock/sock.h"
 #include "libc/sock/struct/pollfd.h"
 #include "libc/stdio/stdio.h"
@@ -854,10 +854,10 @@ int main(int argc, char *argv[]) {
   // perform unveiling
   ApplyFilesystemPolicy(ipromises);
 
-  // pledge.com uses the return eperm instead of killing the process
-  // model. we do this becasue it's only possible to have sigsys print
-  // crash messages if we're not pledging exec, which is what this tool
-  // always has to do currently.
+  // pledge uses the return eperm instead of killing the process model.
+  // we do this becasue it's only possible to have sigsys print crash
+  // messages if we're not pledging exec, which is what this tool always
+  // has to do currently.
   if (g_kflag) {
     __pledge_mode = PLEDGE_PENALTY_KILL_PROCESS;
   } else {
diff --git a/tool/build/runit.c b/tool/build/runit.c
index f94f735ea..503a0a79f 100644
--- a/tool/build/runit.c
+++ b/tool/build/runit.c
@@ -72,9 +72,9 @@
  * of certificates. It's how long it takes to connect, copy the binary,
  * and run it. The remote daemon is deployed via SSH if it's not there.
  *
- *     o/default/tool/build/runit.com             \
- *         o/default/tool/build/runitd.com        \
- *         o/default/test/libc/mem/qsort_test.com \
+ *     o/default/tool/build/runit             \
+ *         o/default/tool/build/runitd        \
+ *         o/default/test/libc/mem/qsort_test \
  *         freebsd.test.:31337:22
  *
  * APE binaries are hermetic and embed dependent files within their zip
@@ -412,10 +412,10 @@ int SpawnSubprocesses(int argc, char *argv[]) {
   // fork off 𝑛 subprocesses for each host on which we run binary.
   // what's important here is htop in tree mode will report like:
   //
-  //     runit.com xnu freebsd netbsd
-  //     β”œβ”€runit.com xnu
-  //     β”œβ”€runit.com freebsd
-  //     └─runit.com netbsd
+  //     runit xnu freebsd netbsd
+  //     β”œβ”€runit xnu
+  //     β”œβ”€runit freebsd
+  //     └─runit netbsd
   //
   // That way when one hangs, it's easy to know what o/s it is.
   argc -= 3;
diff --git a/tool/build/runitd.c b/tool/build/runitd.c
index 0048fe9f1..1612e7637 100644
--- a/tool/build/runitd.c
+++ b/tool/build/runitd.c
@@ -30,19 +30,18 @@
 #include "libc/fmt/conv.h"
 #include "libc/fmt/itoa.h"
 #include "libc/fmt/libgen.h"
-#include "libc/serialize.h"
 #include "libc/intrin/kprintf.h"
 #include "libc/log/appendresourcereport.internal.h"
 #include "libc/log/check.h"
 #include "libc/macros.internal.h"
 #include "libc/mem/gc.h"
-#include "libc/mem/gc.h"
 #include "libc/mem/mem.h"
 #include "libc/nexgen32e/crc32.h"
 #include "libc/proc/posix_spawn.h"
 #include "libc/runtime/internal.h"
 #include "libc/runtime/runtime.h"
 #include "libc/runtime/syslib.internal.h"
+#include "libc/serialize.h"
 #include "libc/sock/sock.h"
 #include "libc/sock/struct/pollfd.h"
 #include "libc/sock/struct/sockaddr.h"
@@ -489,7 +488,7 @@ void *ClientWorker(void *arg) {
   // condition can happen, where etxtbsy is raised by our execve
   // we're using o_cloexec so it's guaranteed to fix itself fast
   // thus we use an optimistic approach to avoid expensive locks
-  sprintf(client->tmpexepath, "o/%s.XXXXXX.com",
+  sprintf(client->tmpexepath, "o/%s.XXXXXX",
           basename(stripext(gc(strdup(origname)))));
   int exefd = openatemp(AT_FDCWD, client->tmpexepath, 4, O_CLOEXEC, 0700);
   if (exefd == -1) {
diff --git a/tool/build/unbuffer.c b/tool/build/unbuffer.c
index 9ad45229e..965a885af 100644
--- a/tool/build/unbuffer.c
+++ b/tool/build/unbuffer.c
@@ -38,7 +38,7 @@
 
 #define USAGE \
   "\
-Usage: unbuffer.com [FLAGS] PROG ARGS...\n\
+Usage: unbuffer [FLAGS] PROG ARGS...\n\
   -o PATH     output file\n\
 "
 
diff --git a/tool/build/unveil.c b/tool/build/unveil.c
index e7358124b..97b6ee0f2 100644
--- a/tool/build/unveil.c
+++ b/tool/build/unveil.c
@@ -29,15 +29,12 @@
 
 #define USAGE \
   "\
-usage: unveil.com [-h] PROG ARGS...\n\
+usage: unveil [-h] PROG ARGS...\n\
   -h           show help\n\
 \n\
-unveil.com v1.o\n\
+unveil v1.o\n\
 copyright 2022 justine alexandra roberts tunney\n\
-https://twitter.com/justinetunney\n\
-https://linkedin.com/in/jtunney\n\
-https://justine.lol/pledge/\n\
-https://github.com/jart\n\
+licensed isc\n\
 \n\
 this program lets you launch linux commands in a filesystem sandbox\n\
 inspired by the design of openbsd's unveil() system call.\n\
diff --git a/tool/build/zipcopy.c b/tool/build/zipcopy.c
index e9cc8767f..0fa328896 100644
--- a/tool/build/zipcopy.c
+++ b/tool/build/zipcopy.c
@@ -23,9 +23,9 @@
 #include "libc/elf/struct/shdr.h"
 #include "libc/errno.h"
 #include "libc/fmt/magnumstrs.internal.h"
-#include "libc/serialize.h"
 #include "libc/limits.h"
 #include "libc/runtime/runtime.h"
+#include "libc/serialize.h"
 #include "libc/stdio/stdio.h"
 #include "libc/stdio/sysparam.h"
 #include "libc/str/str.h"
@@ -85,8 +85,8 @@ FLAGS\n\
 \n\
 EXAMPLE\n\
 \n\
-  objcopy -SO binary foo.com.dbg foo.com\n\
-  zipcopy foo.com.dbg foo.com\n\
+  objcopy -SO binary foo.dbg foo\n\
+  zipcopy foo.dbg foo\n\
 \n\
 \n\
 ",
@@ -122,7 +122,7 @@ static void CopyZip(void) {
   //
   // if input is an elf file with sections, then the zip artifacts need
   // to have been linked into a .zip section and then later copied into
-  // the file end by fixupobj.com.
+  // the file end by fixupobj.
   //
   if (IsElf64Binary((ehdr = (Elf64_Ehdr *)inmap), insize) && ehdr->e_shnum &&
       (secstrs = GetElfSectionNameStringTable(ehdr, insize)) &&
diff --git a/tool/cosmocc/README.md b/tool/cosmocc/README.md
index d55b9717e..f0af92740 100644
--- a/tool/cosmocc/README.md
+++ b/tool/cosmocc/README.md
@@ -29,7 +29,7 @@ You now have an [actually portable
 executable](https://justine.lol/ape.html) that'll run on your host
 system. If anything goes wrong, see the Gotchas and Troubleshoot
 sections below. It should have also outputted two ELF executables as
-well, named `hello.com.dbg` (x86-64 Linux ELF) and `hello.aarch64.elf`
+well, named `hello.dbg` (x86-64 Linux ELF) and `hello.aarch64.elf`
 (AARCH64 Linux ELF). On Linux systems, those files are also runnable,
 which is useful for easily running programs in GDB. On other OSes GDB
 can still debug APE programs if the ELF is loaded in a second step using
@@ -163,10 +163,10 @@ being passed to the freestanding Linux compiler.
 (cd /home/jart/cosmocc; bin/aarch64-linux-cosmo-gcc -o/tmp/fatcosmocc.w48k03qgw8692.o -D__COSMOPO...
 (cd /home/jart/cosmocc; bin/fixupobj /tmp/fatcosmocc.i5lugr6bc0gu0.o)
 (cd /home/jart/cosmocc; bin/fixupobj /tmp/fatcosmocc.w48k03qgw8692.o)
-(cd /home/jart/cosmocc; bin/x86_64-linux-cosmo-gcc -o/tmp/fatcosmocc.ovdo2nqvkjjg3.com.dbg c...
+(cd /home/jart/cosmocc; bin/x86_64-linux-cosmo-gcc -o/tmp/fatcosmocc.ovdo2nqvkjjg3.dbg c...
 (cd /home/jart/cosmocc; bin/aarch64-linux-cosmo-gcc -o/tmp/fatcosmocc.d3ca1smuot0k0.aarch64.elf /...
 (cd /home/jart/cosmocc; bin/fixupobj /tmp/fatcosmocc.d3ca1smuot0k0.aarch64.elf)
-(cd /home/jart/cosmocc; bin/fixupobj /tmp/fatcosmocc.ovdo2nqvkjjg3.com.dbg)
+(cd /home/jart/cosmocc; bin/fixupobj /tmp/fatcosmocc.ovdo2nqvkjjg3.dbg)
 (cd /home/jart/cosmocc; bin/apelink -l bin/ape.elf -l bin/ape.aarch64 -...
 (cd /home/jart/cosmocc; bin/pecheck hello)
 ```
@@ -269,7 +269,7 @@ The `cosmoaddr2line` program may be used to print backtraces, based on
 DWARF data, whenever one of your programs reports a crash. It accepts as
 an argument the ELF executable produced by `cosmocc`, which is different
 from the APE executable. For example, if `cosmocc` compiles a program
-named `hello` then you'll need to pass either `hello.com.dbg` (x86-64)
+named `hello` then you'll need to pass either `hello.dbg` (x86-64)
 or `hello.aarch64.elf` to cosmoaddr2line to get the backtrace. After the
 ELf executable comes the program counter (instruction pointer) addresses
 which are easily obtained using `__builtin_frame_address(0)`. Cosmo can
diff --git a/tool/cosmocc/bin/cosmocross b/tool/cosmocc/bin/cosmocross
index 699ef31f8..555efff09 100755
--- a/tool/cosmocc/bin/cosmocross
+++ b/tool/cosmocc/bin/cosmocross
@@ -163,13 +163,6 @@ for x; do
     # this toolchain is intended for building other people's code
     # elevating warnings into errors, should only be done by devs
     continue
-  elif [ x"$x" = x"-march=native" ]; then
-    if [ $CROSS -eq 0 ]; then
-      set -- "$@" $("$BIN/march-native")
-    else
-      fatal_error "-march=native can't be used when cross compiling"
-    fi
-    continue
   elif [ x"$x" = x"-dumpversion" ]; then
     echo $GCC_VERSION
     exit 0
diff --git a/tool/cosmocc/package.sh b/tool/cosmocc/package.sh
index 029e87e50..75b2dad3b 100755
--- a/tool/cosmocc/package.sh
+++ b/tool/cosmocc/package.sh
@@ -16,7 +16,7 @@ mode() {
 }
 
 OUTDIR=${1:-cosmocc}
-APELINK=o/$(mode)/tool/build/apelink.com
+APELINK=o/$(mode)/tool/build/apelink
 AMD64=${2:-x86_64}
 ARM64=${3:-aarch64}
 GCCVER=12.3.0
@@ -35,17 +35,17 @@ make -j32 m=$AMD64 \
   o/$AMD64/ape/ape-no-modify-self.o \
   o/$AMD64/cosmopolitan.a \
   o/$AMD64/third_party/libcxx/libcxx.a \
-  o/$AMD64/tool/build/assimilate.com.dbg \
-  o/$AMD64/tool/build/march-native.com.dbg \
-  o/$AMD64/tool/build/mktemper.com.dbg \
-  o/$AMD64/tool/build/fixupobj.com.dbg \
-  o/$AMD64/tool/build/zipcopy.com.dbg \
-  o/$AMD64/tool/build/mkdeps.com.dbg \
-  o/$AMD64/tool/build/zipobj.com.dbg \
-  o/$AMD64/tool/build/apelink.com.dbg \
-  o/$AMD64/tool/build/pecheck.com.dbg \
-  o/$AMD64/third_party/make/make.com.dbg \
-  o/$AMD64/third_party/ctags/ctags.com.dbg
+  o/$AMD64/tool/build/assimilate.dbg \
+  o/$AMD64/tool/build/march-native.dbg \
+  o/$AMD64/tool/build/mktemper.dbg \
+  o/$AMD64/tool/build/fixupobj.dbg \
+  o/$AMD64/tool/build/zipcopy.dbg \
+  o/$AMD64/tool/build/mkdeps.dbg \
+  o/$AMD64/tool/build/zipobj.dbg \
+  o/$AMD64/tool/build/apelink.dbg \
+  o/$AMD64/tool/build/pecheck.dbg \
+  o/$AMD64/third_party/make/make.dbg \
+  o/$AMD64/third_party/ctags/ctags.dbg
 
 make -j32 m=$ARM64 \
   o/$ARM64/ape/ape.elf \
@@ -55,17 +55,17 @@ make -j32 m=$ARM64 \
   o/$ARM64/ape/ape-no-modify-self.o \
   o/$ARM64/cosmopolitan.a \
   o/$ARM64/third_party/libcxx/libcxx.a \
-  o/$ARM64/tool/build/assimilate.com.dbg \
-  o/$ARM64/tool/build/march-native.com.dbg \
-  o/$ARM64/tool/build/mktemper.com.dbg \
-  o/$ARM64/tool/build/fixupobj.com.dbg \
-  o/$ARM64/tool/build/zipcopy.com.dbg \
-  o/$ARM64/tool/build/mkdeps.com.dbg \
-  o/$ARM64/tool/build/zipobj.com.dbg \
-  o/$ARM64/tool/build/apelink.com.dbg \
-  o/$ARM64/tool/build/pecheck.com.dbg \
-  o/$ARM64/third_party/make/make.com.dbg \
-  o/$ARM64/third_party/ctags/ctags.com.dbg
+  o/$ARM64/tool/build/assimilate.dbg \
+  o/$ARM64/tool/build/march-native.dbg \
+  o/$ARM64/tool/build/mktemper.dbg \
+  o/$ARM64/tool/build/fixupobj.dbg \
+  o/$ARM64/tool/build/zipcopy.dbg \
+  o/$ARM64/tool/build/mkdeps.dbg \
+  o/$ARM64/tool/build/zipobj.dbg \
+  o/$ARM64/tool/build/apelink.dbg \
+  o/$ARM64/tool/build/pecheck.dbg \
+  o/$ARM64/third_party/make/make.dbg \
+  o/$ARM64/third_party/ctags/ctags.dbg
 
 mkdir -p "$OUTDIR/bin/"
 cp tool/cosmocc/README.md "$OUTDIR/"
@@ -152,8 +152,8 @@ for x in assimilate march-native mktemper fixupobj zipcopy apelink pecheck mkdep
     -l o/$ARM64/ape/ape.elf \
     -M ape/ape-m1.c \
     -o "$OUTDIR/bin/$x" \
-    o/$AMD64/tool/build/$x.com.dbg \
-    o/$ARM64/tool/build/$x.com.dbg
+    o/$AMD64/tool/build/$x.dbg \
+    o/$ARM64/tool/build/$x.dbg
 done
 for x in make ctags; do
   ape $APELINK \
@@ -161,6 +161,6 @@ for x in make ctags; do
     -l o/$ARM64/ape/ape.elf \
     -M ape/ape-m1.c \
     -o "$OUTDIR/bin/$x" \
-    o/$AMD64/third_party/$x/$x.com.dbg \
-    o/$ARM64/third_party/$x/$x.com.dbg
+    o/$AMD64/third_party/$x/$x.dbg \
+    o/$ARM64/third_party/$x/$x.dbg
 done
diff --git a/tool/curl/BUILD.mk b/tool/curl/BUILD.mk
index 520fa3226..d020ec1df 100644
--- a/tool/curl/BUILD.mk
+++ b/tool/curl/BUILD.mk
@@ -47,7 +47,7 @@ $(TOOL_CURL_A).pkg:				\
 		$(TOOL_CURL_OBJS)		\
 		$(foreach x,$(TOOL_CURL_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/tool/curl/curl.com.dbg:		\
+o/$(MODE)/tool/curl/curl.dbg:			\
 		$(TOOL_CURL)			\
 		o/$(MODE)/tool/curl/cmd.o	\
 		o/$(MODE)/tool/curl/curl.o	\
@@ -57,7 +57,7 @@ o/$(MODE)/tool/curl/curl.com.dbg:		\
 
 TOOL_CURL_LIBS = $(TOOL_CURL_A)
 TOOL_CURL_BINS = $(TOOL_CURL_COMS) $(TOOL_CURL_COMS:%=%.dbg)
-TOOL_CURL_COMS = o/$(MODE)/tool/curl/curl.com
+TOOL_CURL_COMS = o/$(MODE)/tool/curl/curl
 $(TOOL_CURL_OBJS): $(BUILD_FILES) tool/curl/BUILD.mk
 
 .PHONY: o/$(MODE)/tool/curl
diff --git a/tool/curl/test.sh b/tool/curl/test.sh
index 21fe3d007..f73396834 100755
--- a/tool/curl/test.sh
+++ b/tool/curl/test.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 m=zero
-make -j16 m=$m o/$m/tool/curl/curl.com || exit
+make -j16 m=$m o/$m/tool/curl/curl || exit
 for t in expired \
          wrong.host \
          self-signed \
@@ -19,5 +19,5 @@ for t in expired \
   u=https://$t.badssl.com/
   echo
   echo $u
-  o/$m/tool/curl/curl.com $u
+  o/$m/tool/curl/curl $u
 done
diff --git a/tool/decode/BUILD.mk b/tool/decode/BUILD.mk
index f46635e26..e5d2e9eb2 100644
--- a/tool/decode/BUILD.mk
+++ b/tool/decode/BUILD.mk
@@ -11,7 +11,7 @@ TOOL_DECODE_OBJS =					\
 	$(TOOL_DECODE_SRCS:%.c=o/$(MODE)/%.o)
 
 TOOL_DECODE_COMS =					\
-	$(TOOL_DECODE_SRCS:%.c=o/$(MODE)/%.com)
+	$(TOOL_DECODE_SRCS:%.c=o/$(MODE)/%)
 
 TOOL_DECODE_BINS =					\
 	$(TOOL_DECODE_COMS)				\
@@ -48,7 +48,7 @@ o/$(MODE)/tool/decode/decode.pkg:			\
 		$(TOOL_DECODE_OBJS)			\
 		$(foreach x,$(TOOL_DECODE_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/tool/decode/%.com.dbg:			\
+o/$(MODE)/tool/decode/%.dbg:				\
 		$(TOOL_DECODE_DEPS)			\
 		o/$(MODE)/tool/decode/%.o		\
 		o/$(MODE)/tool/decode/decode.pkg	\
diff --git a/tool/decode/ar.c b/tool/decode/ar.c
index b31aa24d5..cc3471277 100644
--- a/tool/decode/ar.c
+++ b/tool/decode/ar.c
@@ -19,11 +19,11 @@
 #include "libc/calls/calls.h"
 #include "libc/calls/struct/stat.h"
 #include "libc/fmt/conv.h"
-#include "libc/serialize.h"
 #include "libc/log/check.h"
 #include "libc/log/log.h"
 #include "libc/mem/mem.h"
 #include "libc/runtime/runtime.h"
+#include "libc/serialize.h"
 #include "libc/stdio/stdio.h"
 #include "libc/str/str.h"
 #include "libc/sysv/consts/map.h"
@@ -36,7 +36,7 @@
 
 /**
  * ar rU doge.a NOTICE  # create archive and use non-deterministic stuff
- * o//tool/decode/ar.com doge.a
+ * o//tool/decode/ar doge.a
  */
 
 static int fd;
diff --git a/tool/decode/word.c b/tool/decode/word.c
index 4e4c24e80..6f17bc3a9 100644
--- a/tool/decode/word.c
+++ b/tool/decode/word.c
@@ -5,7 +5,7 @@
 /**
  * Displays bytes as word, e.g.
  *
- *     o//tool/word.com 6e c7 ff ff
+ *     o//tool/word 6e c7 ff ff
  *     %d   = -14482
  *     %ld  = 4294952814
  *     %#x  = 0xffffc76e
diff --git a/tool/emacs/cosmo-format.el b/tool/emacs/cosmo-format.el
index bc219f4bf..107c201e9 100644
--- a/tool/emacs/cosmo-format.el
+++ b/tool/emacs/cosmo-format.el
@@ -62,6 +62,7 @@
 (defcustom cosmo-format-exts '("c" "cc" "h" "inc"  ;; c/c++
                                "hh" "cpp" "hpp"    ;; ms c/c++
                                "rl"                ;; ragel
+                               "cu"                ;; cuda
                                "proto")            ;; protobuf
   "List of pathname extensions that need clang-format."
   :type '(repeat string)
diff --git a/tool/emacs/cosmo-platform-constants.el b/tool/emacs/cosmo-platform-constants.el
index a632b649a..ec2cc0f2c 100644
--- a/tool/emacs/cosmo-platform-constants.el
+++ b/tool/emacs/cosmo-platform-constants.el
@@ -73,12 +73,23 @@
            "__gnu__"
            "_OPENMP"))
 
+        (cuda
+         '("__NVCC__"))
+
+        (hip
+         '("__HIP__"
+           "__HIPCC__"
+           "__HIP_DEVICE_COMPILE__"
+           "__AMD__"
+           "__AMDGCN__"
+           "__AMDGPU__"))
+
         (cosmo
          '("__LINKER__"))
 
         )
     (concat "\\_<"
-            (regexp-opt (append cpp92 gcc412 cosmo))
+            (regexp-opt (append cpp92 gcc412 cuda hip cosmo))
             "\\_>")))
 
 (provide 'cosmo-platform-constants)
diff --git a/tool/emacs/cosmo-stuff.el b/tool/emacs/cosmo-stuff.el
index c7ba003a3..771b45ea3 100644
--- a/tool/emacs/cosmo-stuff.el
+++ b/tool/emacs/cosmo-stuff.el
@@ -212,9 +212,9 @@
          (file (file-relative-name this root))  ;; e.g. "libc/crc32c.c"
          (name (file-name-sans-extension file)) ;; e.g. "libc/crc32c"
          (buddy (format "test/%s_test.c" name))
-         (runs (format "o/$m/%s.com%s V=5 TESTARGS=-b" name runsuffix))
-         (buns (format "o/$m/test/%s_test.com%s V=5 TESTARGS=-b" name runsuffix)))
-    (cond ((not (member ext '("c" "cc" "cpp" "s" "S" "rl" "f")))
+         (runs (format "o/$m/%s%s V=5 TESTARGS=-b" name runsuffix))
+         (buns (format "o/$m/test/%s_test%s V=5 TESTARGS=-b" name runsuffix)))
+    (cond ((not (member ext '("c" "cc" "cpp" "s" "S" "rl" "f" "cu")))
            (format "m=%s; make -j32 MODE=$m o/$m/%s"
                    mode
                    (directory-file-name
@@ -225,18 +225,18 @@
            (format
             (cosmo-join
              " && "
-             `("m=%s; f=o/$m/%s.com"
+             `("m=%s; f=o/$m/%s"
                ,(concat "make -j32 $f MODE=$m")
-               "scp $f $f.dbg win10:; ssh win10 ./%s.com"))
+               "scp $f $f.dbg win10:; ssh win10 ./%s"))
             mode name (file-name-nondirectory name)))
           ((eq kind 'run-xnu)
            (format
             (cosmo-join
              " && "
-             `("m=%s; f=o/$m/%s.com"
+             `("m=%s; f=o/$m/%s"
                ,(concat "make -j32 $f MODE=$m")
                "scp $f $f.dbg xnu:"
-               "ssh xnu ./%s.com"))
+               "ssh xnu ./%s"))
             mode name (file-name-nondirectory name)))
           ((and (equal suffix "")
                 (cosmo-contains "_test." (buffer-file-name)))
@@ -257,12 +257,12 @@
            (format
             (cosmo-join
              " && "
-             `("m=%s; f=o/$m/%s.com"
+             `("m=%s; f=o/$m/%s"
                ,(concat "make -j32 $f MODE=$m")
                "build/run ./$f"))
             mode name))
           ((eq kind 'test)
-           (format `"m=%s; f=o/$m/%s.com.ok && make -j32 $f MODE=$m" mode name))
+           (format `"m=%s; f=o/$m/%s.ok && make -j32 $f MODE=$m" mode name))
           ((and (file-regular-p this)
                 (file-executable-p this))
            (format "build/run ./%s" file))
@@ -641,14 +641,14 @@
                (compile (format "sh -c %s" file)))
               ((eq major-mode 'lua-mode)
                (let* ((mode (cosmo--make-mode arg)))
-                 (compile (format "make -j32 MODE=%s o/%s/tool/net/redbean.com && build/run o/%s/tool/net/redbean.com -i %s" mode mode mode file))))
+                 (compile (format "make -j32 MODE=%s o/%s/tool/net/redbean && build/run o/%s/tool/net/redbean -i %s" mode mode mode file))))
               ((and (eq major-mode 'python-mode)
                     (cosmo-startswith "third_party/python/Lib/test/" file))
                (let ((mode (cosmo--make-mode arg)))
                  (compile (format "make -j32 MODE=%s PYHARNESSARGS=-vv PYTESTARGS=-v o/%s/%s.py.runs"
                                   mode mode (file-name-sans-extension file)))))
               ((eq major-mode 'python-mode)
-               (compile (format "python.com %s" file)))
+               (compile (format "python %s" file)))
               ('t
                (error "cosmo-run: unknown major mode")))))))
 
@@ -715,7 +715,7 @@
       (let* ((mode (cosmo--make-mode arg cosmo-dbg-mode))
              (name (file-relative-name this root))
              (next (file-name-sans-extension name))
-             (exec (format "o/%s/%s.com.dbg" mode next))
+             (exec (format "o/%s/%s.dbg" mode next))
              (default-directory root)
              (compile-command (cosmo--compile-command this root nil mode "" "" ".runs")))
         (compile compile-command)
diff --git a/tool/hello/BUILD.mk b/tool/hello/BUILD.mk
index 6047047bf..80648401c 100644
--- a/tool/hello/BUILD.mk
+++ b/tool/hello/BUILD.mk
@@ -11,87 +11,87 @@ TOOL_HELLO_SRCS = $(TOOL_HELLO_SRCS_C) $(TOOL_HELLO_SRCS_S)
 TOOL_HELLO_OBJS = $(TOOL_HELLO_SRCS_C:%.c=o/$(MODE)/%.o) $(TOOL_HELLO_SRCS_S:%.S=o/$(MODE)/%.o)
 TOOL_HELLO_BINS = $(TOOL_HELLO_COMS) $(TOOL_HELLO_COMS:%=%.dbg)
 
-TOOL_HELLO_COMS =						\
-	o/$(MODE)/tool/hello/hello.com				\
-	o/$(MODE)/tool/hello/hello-pe.com			\
-	o/$(MODE)/tool/hello/hello-elf.com			\
-	o/$(MODE)/tool/hello/hello-unix.com
+TOOL_HELLO_COMS =					\
+	o/$(MODE)/tool/hello/hello			\
+	o/$(MODE)/tool/hello/hello-pe			\
+	o/$(MODE)/tool/hello/hello-elf			\
+	o/$(MODE)/tool/hello/hello-unix
 
-TOOL_HELLO_DIRECTDEPS =						\
-	LIBC_CALLS						\
+TOOL_HELLO_DIRECTDEPS =					\
+	LIBC_CALLS					\
 	LIBC_RUNTIME
 
-TOOL_HELLO_DEPS :=						\
+TOOL_HELLO_DEPS :=					\
 	$(call uniq,$(foreach x,$(TOOL_HELLO_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/tool/hello/hello.pkg:					\
-		$(TOOL_HELLO_OBJS)				\
+o/$(MODE)/tool/hello/hello.pkg:				\
+		$(TOOL_HELLO_OBJS)			\
 		$(foreach x,$(TOOL_HELLO_DIRECTDEPS),$($(x)_A).pkg)
 
 # generates debuggable executable using gcc
-o/$(MODE)/tool/hello/hello.com.dbg:				\
-		$(TOOL_HELLO_DEPS)				\
-		o/$(MODE)/tool/hello/hello.o			\
-		o/$(MODE)/tool/hello/hello.pkg			\
-		$(CRT)						\
+o/$(MODE)/tool/hello/hello.dbg:				\
+		$(TOOL_HELLO_DEPS)			\
+		o/$(MODE)/tool/hello/hello.o		\
+		o/$(MODE)/tool/hello/hello.pkg		\
+		$(CRT)					\
 		$(APE)
 	@$(APELINK)
 
 # uses apelink to turn it into an ape executable
 # support vector is set to all operating systems
-o/$(MODE)/tool/hello/hello.ape:					\
-		o/$(MODE)/tool/hello/hello.com.dbg		\
-		o/$(MODE)/tool/build/apelink.com		\
-		o/$(MODE)/tool/build/pecheck.com		\
+o/$(MODE)/tool/hello/hello.ape:				\
+		o/$(MODE)/tool/hello/hello.dbg		\
+		o/$(MODE)/tool/build/apelink		\
+		o/$(MODE)/tool/build/pecheck		\
 		o/$(MODE)/ape/ape.elf
-	@$(COMPILE) -ALINK.ape o/$(MODE)/tool/build/apelink.com -o $@ -l o/$(MODE)/ape/ape.elf $<
-	@$(COMPILE) -APECHECK -wT$@ o/$(MODE)/tool/build/pecheck.com $@
+	@$(COMPILE) -ALINK.ape o/$(MODE)/tool/build/apelink -o $@ -l o/$(MODE)/ape/ape.elf $<
+	@$(COMPILE) -APECHECK -wT$@ o/$(MODE)/tool/build/pecheck $@
 
 # uses apelink to generate elf-only executable
 # support vector = linux/freebsd/openbsd/netbsd/metal
-o/$(MODE)/tool/hello/hello-elf.ape:				\
-		o/$(MODE)/tool/hello/hello.com.dbg		\
-		o/$(MODE)/tool/build/apelink.com		\
+o/$(MODE)/tool/hello/hello-elf.ape:			\
+		o/$(MODE)/tool/hello/hello.dbg		\
+		o/$(MODE)/tool/build/apelink		\
 		o/$(MODE)/ape/ape.elf
-	@$(COMPILE) -ALINK.ape o/$(MODE)/tool/build/apelink.com -V elf -o $@ -l o/$(MODE)/ape/ape.elf $<
+	@$(COMPILE) -ALINK.ape o/$(MODE)/tool/build/apelink -V elf -o $@ -l o/$(MODE)/ape/ape.elf $<
 
 # uses apelink to generate non-pe ape executable
 # support vector = macos/linux/freebsd/openbsd/netbsd
 # - great way to avoid attention from bad virus scanners
 # - creates tinier executable by reducing alignment requirement
-o/$(MODE)/tool/hello/hello-unix.ape:				\
-		o/$(MODE)/tool/hello/hello.com.dbg		\
-		o/$(MODE)/tool/build/apelink.com		\
+o/$(MODE)/tool/hello/hello-unix.ape:			\
+		o/$(MODE)/tool/hello/hello.dbg		\
+		o/$(MODE)/tool/build/apelink		\
 		o/$(MODE)/ape/ape.elf
-	@$(COMPILE) -ALINK.ape o/$(MODE)/tool/build/apelink.com -V unix -o $@ -l o/$(MODE)/ape/ape.elf $<
+	@$(COMPILE) -ALINK.ape o/$(MODE)/tool/build/apelink -V unix -o $@ -l o/$(MODE)/ape/ape.elf $<
 
 # elf2pe generates optimal pe binaries
 # windows is the only platform supported
 # doesn't depend on ape or the cosmopolitan c library
-o/$(MODE)/tool/hello/hello-pe.com.dbg:				\
+o/$(MODE)/tool/hello/hello-pe.dbg:			\
 		o/$(MODE)/tool/hello/hello-pe.o
 	@$(COMPILE) -ALINK.elf $(LINK) $(LINKARGS) $(OUTPUT_OPTION) -q -e WinMain
-o/$(MODE)/tool/hello/hello-pe.ape:				\
-		o/$(MODE)/tool/hello/hello-pe.com.dbg		\
-		o/$(MODE)/tool/build/elf2pe.com
-	@$(COMPILE) -AELF2PE o/$(MODE)/tool/build/elf2pe.com -o $@ $<
+o/$(MODE)/tool/hello/hello-pe.ape:			\
+		o/$(MODE)/tool/hello/hello-pe.dbg	\
+		o/$(MODE)/tool/build/elf2pe
+	@$(COMPILE) -AELF2PE o/$(MODE)/tool/build/elf2pe -o $@ $<
 
 # elf2pe can generate binaries that don't have dll imports
-o/$(MODE)/tool/hello/life-pe.com.dbg:				\
+o/$(MODE)/tool/hello/life-pe.dbg:			\
 		o/$(MODE)/tool/hello/life-pe.o
 	@$(COMPILE) -ALINK.elf $(LINK) $(LINKARGS) $(OUTPUT_OPTION) -q -e WinMain
-o/$(MODE)/tool/hello/life-pe.ape:				\
-		o/$(MODE)/tool/hello/life-pe.com.dbg		\
-		o/$(MODE)/tool/build/elf2pe.com
-	@$(COMPILE) -AELF2PE o/$(MODE)/tool/build/elf2pe.com -o $@ $<
+o/$(MODE)/tool/hello/life-pe.ape:			\
+		o/$(MODE)/tool/hello/life-pe.dbg	\
+		o/$(MODE)/tool/build/elf2pe
+	@$(COMPILE) -AELF2PE o/$(MODE)/tool/build/elf2pe -o $@ $<
 
 # demonstrates in process monitor the lowest resource usage a win32 app can have
-o/$(MODE)/tool/hello/wait-pe.com.dbg:				\
+o/$(MODE)/tool/hello/wait-pe.dbg:			\
 		o/$(MODE)/tool/hello/wait-pe.o
 	@$(COMPILE) -ALINK.elf $(LINK) $(LINKARGS) $(OUTPUT_OPTION) -q -e WinMain
-o/$(MODE)/tool/hello/wait-pe.ape:				\
-		o/$(MODE)/tool/hello/wait-pe.com.dbg		\
-		o/$(MODE)/tool/build/elf2pe.com
-	@$(COMPILE) -AELF2PE o/$(MODE)/tool/build/elf2pe.com -R 64kb -S 4kb -o $@ $<
+o/$(MODE)/tool/hello/wait-pe.ape:			\
+		o/$(MODE)/tool/hello/wait-pe.dbg	\
+		o/$(MODE)/tool/build/elf2pe
+	@$(COMPILE) -AELF2PE o/$(MODE)/tool/build/elf2pe -R 64kb -S 4kb -o $@ $<
 
 $(TOOL_HELLO_OBJS): tool/hello/BUILD.mk
diff --git a/tool/lambda/BUILD.mk b/tool/lambda/BUILD.mk
index 818a5048f..a22b63aea 100644
--- a/tool/lambda/BUILD.mk
+++ b/tool/lambda/BUILD.mk
@@ -9,7 +9,7 @@ TOOL_LAMBDA_OBJS =						\
 	$(TOOL_LAMBDA_SRCS:%.c=o/$(MODE)/%.o)
 
 TOOL_LAMBDA_COMS :=						\
-	$(TOOL_LAMBDA_SRCS:%.c=o/$(MODE)/%.com)
+	$(TOOL_LAMBDA_SRCS:%.c=o/$(MODE)/%)
 
 TOOL_LAMBDA_BINS =						\
 	$(TOOL_LAMBDA_COMS)					\
@@ -37,7 +37,7 @@ o/$(MODE)/tool/lambda/lambda.pkg:				\
 		$(TOOL_LAMBDA_OBJS)				\
 		$(foreach x,$(TOOL_LAMBDA_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/tool/lambda/%.com.dbg:				\
+o/$(MODE)/tool/lambda/%.dbg:					\
 		$(TOOL_LAMBDA_DEPS)				\
 		o/$(MODE)/tool/lambda/%.o			\
 		o/$(MODE)/tool/lambda/lambda.pkg		\
diff --git a/tool/net/BUILD.mk b/tool/net/BUILD.mk
index a8d1d9c89..1c7219492 100644
--- a/tool/net/BUILD.mk
+++ b/tool/net/BUILD.mk
@@ -8,322 +8,282 @@ TOOL_NET_SRCS = $(filter %.c,$(TOOL_NET_FILES))
 TOOL_NET_HDRS = $(filter %.h,$(TOOL_NET_FILES))
 TOOL_NET_INCS = $(filter %.inc,$(TOOL_NET_FILES))
 
-TOOL_NET_OBJS =									\
+TOOL_NET_OBJS =								\
 	$(TOOL_NET_SRCS:%.c=o/$(MODE)/%.o)
 
-TOOL_NET_BINS =									\
-	$(TOOL_NET_COMS)							\
+TOOL_NET_BINS =								\
+	$(TOOL_NET_COMS)						\
 	$(TOOL_NET_COMS:%=%.dbg)
 
-TOOL_NET_COMS =									\
-	o/$(MODE)/tool/net/dig.com						\
-	o/$(MODE)/tool/net/winbench.com						\
-	o/$(MODE)/tool/net/redbean.com						\
-	o/$(MODE)/tool/net/redbean-demo.com					\
-	o/$(MODE)/tool/net/redbean-static.com					\
-	o/$(MODE)/tool/net/libresolv_query.com					\
-	o/$(MODE)/tool/net/redbean-unsecure.com					\
-	o/$(MODE)/tool/net/redbean-original.com
+TOOL_NET_COMS =								\
+	o/$(MODE)/tool/net/dig						\
+	o/$(MODE)/tool/net/winbench					\
+	o/$(MODE)/tool/net/redbean					\
+	o/$(MODE)/tool/net/redbean-demo					\
+	o/$(MODE)/tool/net/redbean-static				\
+	o/$(MODE)/tool/net/libresolv_query				\
+	o/$(MODE)/tool/net/redbean-unsecure				\
+	o/$(MODE)/tool/net/redbean-original
 
-TOOL_NET_CHECKS =								\
-	o/$(MODE)/tool/net/net.pkg						\
+TOOL_NET_CHECKS =							\
+	o/$(MODE)/tool/net/net.pkg					\
 	$(TOOL_NET_HDRS:%=o/$(MODE)/%.ok)
 
-TOOL_NET_DIRECTDEPS =								\
-	DSP_SCALE								\
-	LIBC_CALLS								\
-	LIBC_FMT								\
-	LIBC_INTRIN								\
-	LIBC_LOG								\
-	LIBC_MEM								\
-	LIBC_NEXGEN32E								\
-	LIBC_NT_IPHLPAPI							\
-	LIBC_NT_KERNEL32							\
-	LIBC_NT_WS2_32								\
-	LIBC_PROC								\
-	LIBC_RUNTIME								\
-	LIBC_SOCK								\
-	LIBC_STDIO								\
-	LIBC_STR								\
-	LIBC_SYSV								\
-	LIBC_SYSV_CALLS								\
-	LIBC_TIME								\
-	LIBC_THREAD								\
-	LIBC_TINYMATH								\
-	LIBC_X									\
-	NET_FINGER								\
-	NET_HTTP								\
-	NET_HTTPS								\
-	THIRD_PARTY_ARGON2							\
-	THIRD_PARTY_COMPILER_RT							\
-	THIRD_PARTY_GDTOA							\
-	THIRD_PARTY_GETOPT							\
-	THIRD_PARTY_LINENOISE							\
-	THIRD_PARTY_LUA								\
-	THIRD_PARTY_LUA_UNIX							\
-	THIRD_PARTY_MAXMIND							\
-	THIRD_PARTY_MUSL							\
-	THIRD_PARTY_MBEDTLS							\
-	THIRD_PARTY_REGEX							\
-	THIRD_PARTY_SQLITE3							\
-	THIRD_PARTY_ZLIB							\
-	TOOL_ARGS								\
-	TOOL_BUILD_LIB								\
-	TOOL_DECODE_LIB								\
+TOOL_NET_DIRECTDEPS =							\
+	DSP_SCALE							\
+	LIBC_CALLS							\
+	LIBC_FMT							\
+	LIBC_INTRIN							\
+	LIBC_LOG							\
+	LIBC_MEM							\
+	LIBC_NEXGEN32E							\
+	LIBC_NT_IPHLPAPI						\
+	LIBC_NT_KERNEL32						\
+	LIBC_NT_WS2_32							\
+	LIBC_PROC							\
+	LIBC_RUNTIME							\
+	LIBC_SOCK							\
+	LIBC_STDIO							\
+	LIBC_STR							\
+	LIBC_SYSV							\
+	LIBC_SYSV_CALLS							\
+	LIBC_TIME							\
+	LIBC_THREAD							\
+	LIBC_TINYMATH							\
+	LIBC_X								\
+	NET_FINGER							\
+	NET_HTTP							\
+	NET_HTTPS							\
+	THIRD_PARTY_ARGON2						\
+	THIRD_PARTY_COMPILER_RT						\
+	THIRD_PARTY_GDTOA						\
+	THIRD_PARTY_GETOPT						\
+	THIRD_PARTY_LINENOISE						\
+	THIRD_PARTY_LUA							\
+	THIRD_PARTY_LUA_UNIX						\
+	THIRD_PARTY_MAXMIND						\
+	THIRD_PARTY_MUSL						\
+	THIRD_PARTY_MBEDTLS						\
+	THIRD_PARTY_REGEX						\
+	THIRD_PARTY_SQLITE3						\
+	THIRD_PARTY_ZLIB						\
+	TOOL_ARGS							\
+	TOOL_BUILD_LIB							\
+	TOOL_DECODE_LIB							\
 	THIRD_PARTY_DOUBLECONVERSION
 
-TOOL_NET_DEPS :=								\
+TOOL_NET_DEPS :=							\
 	$(call uniq,$(foreach x,$(TOOL_NET_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/tool/net/net.pkg:							\
-		$(TOOL_NET_OBJS)						\
+o/$(MODE)/tool/net/net.pkg:						\
+		$(TOOL_NET_OBJS)					\
 		$(foreach x,$(TOOL_NET_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/tool/net/%.com.dbg:							\
-		$(TOOL_NET_DEPS)						\
-		o/$(MODE)/tool/net/%.o						\
-		o/$(MODE)/tool/net/net.pkg					\
-		$(CRT)								\
+o/$(MODE)/tool/net/%.dbg:						\
+		$(TOOL_NET_DEPS)					\
+		o/$(MODE)/tool/net/%.o					\
+		o/$(MODE)/tool/net/net.pkg				\
+		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-# REDBEAN.COM
+# REDBEAN
 #
 # The little web server that could!
 
-TOOL_NET_REDBEAN_LUA_MODULES =							\
-	o/$(MODE)/tool/net/lfuncs.o						\
-	o/$(MODE)/tool/net/lpath.o						\
-	o/$(MODE)/tool/net/lfinger.o						\
-	o/$(MODE)/tool/net/lre.o						\
-	o/$(MODE)/tool/net/ljson.o						\
-	o/$(MODE)/tool/net/lmaxmind.o						\
-	o/$(MODE)/tool/net/lsqlite3.o						\
-	o/$(MODE)/tool/net/largon2.o						\
+TOOL_NET_REDBEAN_LUA_MODULES =						\
+	o/$(MODE)/tool/net/lfuncs.o					\
+	o/$(MODE)/tool/net/lpath.o					\
+	o/$(MODE)/tool/net/lfinger.o					\
+	o/$(MODE)/tool/net/lre.o					\
+	o/$(MODE)/tool/net/ljson.o					\
+	o/$(MODE)/tool/net/lmaxmind.o					\
+	o/$(MODE)/tool/net/lsqlite3.o					\
+	o/$(MODE)/tool/net/largon2.o					\
 	o/$(MODE)/tool/net/launch.o
 
-o/$(MODE)/tool/net/redbean.com.dbg:						\
-		$(TOOL_NET_DEPS)						\
-		$(TOOL_NET_REDBEAN_LUA_MODULES)					\
-		o/$(MODE)/tool/net/.init.lua.zip.o				\
-		o/$(MODE)/tool/net/favicon.ico.zip.o				\
-		o/$(MODE)/tool/net/redbean.png.zip.o				\
-		o/$(MODE)/tool/net/help.txt.zip.o				\
-		o/$(MODE)/tool/net/redbean.o					\
-		o/$(MODE)/tool/net/net.pkg					\
-		$(CRT)								\
+o/$(MODE)/tool/net/redbean.dbg:						\
+		$(TOOL_NET_DEPS)					\
+		$(TOOL_NET_REDBEAN_LUA_MODULES)				\
+		o/$(MODE)/tool/net/.init.lua.zip.o			\
+		o/$(MODE)/tool/net/favicon.ico.zip.o			\
+		o/$(MODE)/tool/net/redbean.png.zip.o			\
+		o/$(MODE)/tool/net/help.txt.zip.o			\
+		o/$(MODE)/tool/net/redbean.o				\
+		o/$(MODE)/tool/net/net.pkg				\
+		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/tool/net/redbean.com:							\
-		o/$(MODE)/tool/net/redbean.com.dbg				\
-		o/$(MODE)/third_party/zip/zip.com				\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
-o/$(MODE)/tool/net/lsqlite3.o: private						\
-		CFLAGS +=							\
+o/$(MODE)/tool/net/lsqlite3.o: private					\
+		CFLAGS +=						\
 			-DSQLITE_ENABLE_SESSION
 
-# REDBEAN-DEMO.COM
+# REDBEAN-DEMO
 #
-# This redbean-demo.com program is the same as redbean.com except it
+# This redbean-demo program is the same as redbean except it
 # bundles a bunch of example code and there's a live of it available
 # online at http://redbean.justine.lol/
 
-o/$(MODE)/tool/net/.init.lua.zip.o						\
-o/$(MODE)/tool/net/demo/.init.lua.zip.o						\
-o/$(MODE)/tool/net/demo/.reload.lua.zip.o					\
-o/$(MODE)/tool/net/demo/sql.lua.zip.o						\
-o/$(MODE)/tool/net/demo/sql-backup.lua.zip.o					\
-o/$(MODE)/tool/net/demo/sql-backupstore.lua.zip.o				\
-o/$(MODE)/tool/net/demo/unix-unix.lua.zip.o					\
-o/$(MODE)/tool/net/demo/unix-rawsocket.lua.zip.o				\
-o/$(MODE)/tool/net/demo/unix-subprocess.lua.zip.o				\
-o/$(MODE)/tool/net/demo/unix-webserver.lua.zip.o				\
-o/$(MODE)/tool/net/demo/unix-dir.lua.zip.o					\
-o/$(MODE)/tool/net/demo/unix-info.lua.zip.o					\
-o/$(MODE)/tool/net/demo/unix-finger.lua.zip.o					\
-o/$(MODE)/tool/net/demo/fetch.lua.zip.o						\
-o/$(MODE)/tool/net/demo/finger.lua.zip.o					\
-o/$(MODE)/tool/net/demo/call-lua-module.lua.zip.o				\
-o/$(MODE)/tool/net/demo/store-asset.lua.zip.o					\
-o/$(MODE)/tool/net/demo/maxmind.lua.zip.o					\
-o/$(MODE)/tool/net/demo/redbean.lua.zip.o					\
-o/$(MODE)/tool/net/demo/opensource.lua.zip.o					\
-o/$(MODE)/tool/net/demo/hitcounter.lua.zip.o					\
-o/$(MODE)/tool/net/demo/binarytrees.lua.zip.o					\
-o/$(MODE)/tool/net/demo/crashreport.lua.zip.o					\
-o/$(MODE)/tool/net/demo/closedsource.lua.zip.o					\
-o/$(MODE)/tool/net/demo/printpayload.lua.zip.o					\
-o/$(MODE)/tool/net/demo/gensvg.lua.zip.o					\
-o/$(MODE)/tool/net/demo/redbean-form.lua.zip.o					\
-o/$(MODE)/tool/net/demo/redbean-xhr.lua.zip.o					\
-o/$(MODE)/tool/net/redbean.png.zip.o						\
-o/$(MODE)/tool/net/favicon.ico.zip.o						\
-o/$(MODE)/tool/net/help.txt.zip.o						\
-o/$(MODE)/tool/net/demo/404.html.zip.o: private					\
-		ZIPOBJ_FLAGS +=							\
+o/$(MODE)/tool/net/.init.lua.zip.o					\
+o/$(MODE)/tool/net/demo/.init.lua.zip.o					\
+o/$(MODE)/tool/net/demo/.reload.lua.zip.o				\
+o/$(MODE)/tool/net/demo/sql.lua.zip.o					\
+o/$(MODE)/tool/net/demo/sql-backup.lua.zip.o				\
+o/$(MODE)/tool/net/demo/sql-backupstore.lua.zip.o			\
+o/$(MODE)/tool/net/demo/unix-unix.lua.zip.o				\
+o/$(MODE)/tool/net/demo/unix-rawsocket.lua.zip.o			\
+o/$(MODE)/tool/net/demo/unix-subprocess.lua.zip.o			\
+o/$(MODE)/tool/net/demo/unix-webserver.lua.zip.o			\
+o/$(MODE)/tool/net/demo/unix-dir.lua.zip.o				\
+o/$(MODE)/tool/net/demo/unix-info.lua.zip.o				\
+o/$(MODE)/tool/net/demo/unix-finger.lua.zip.o				\
+o/$(MODE)/tool/net/demo/fetch.lua.zip.o					\
+o/$(MODE)/tool/net/demo/finger.lua.zip.o				\
+o/$(MODE)/tool/net/demo/call-lua-module.lua.zip.o			\
+o/$(MODE)/tool/net/demo/store-asset.lua.zip.o				\
+o/$(MODE)/tool/net/demo/maxmind.lua.zip.o				\
+o/$(MODE)/tool/net/demo/redbean.lua.zip.o				\
+o/$(MODE)/tool/net/demo/opensource.lua.zip.o				\
+o/$(MODE)/tool/net/demo/hitcounter.lua.zip.o				\
+o/$(MODE)/tool/net/demo/binarytrees.lua.zip.o				\
+o/$(MODE)/tool/net/demo/crashreport.lua.zip.o				\
+o/$(MODE)/tool/net/demo/closedsource.lua.zip.o				\
+o/$(MODE)/tool/net/demo/printpayload.lua.zip.o				\
+o/$(MODE)/tool/net/demo/gensvg.lua.zip.o				\
+o/$(MODE)/tool/net/demo/redbean-form.lua.zip.o				\
+o/$(MODE)/tool/net/demo/redbean-xhr.lua.zip.o				\
+o/$(MODE)/tool/net/redbean.png.zip.o					\
+o/$(MODE)/tool/net/favicon.ico.zip.o					\
+o/$(MODE)/tool/net/help.txt.zip.o					\
+o/$(MODE)/tool/net/demo/404.html.zip.o: private				\
+		ZIPOBJ_FLAGS +=						\
 			-B
 
-o/$(MODE)/tool/net/demo/.lua/.zip.o						\
-o/$(MODE)/tool/net/demo/.lua/mymodule.lua.zip.o: private			\
-		ZIPOBJ_FLAGS +=							\
+o/$(MODE)/tool/net/demo/.lua/.zip.o					\
+o/$(MODE)/tool/net/demo/.lua/mymodule.lua.zip.o: private		\
+		ZIPOBJ_FLAGS +=						\
 			-C3
 
-o/$(MODE)/tool/net/demo/seekable.txt.zip.o: private				\
-		ZIPOBJ_FLAGS +=							\
-			-B							\
+o/$(MODE)/tool/net/demo/seekable.txt.zip.o: private			\
+		ZIPOBJ_FLAGS +=						\
+			-B						\
 			-0
 
-o/$(MODE)/tool/net/redbean-demo.com.dbg:					\
-		$(TOOL_NET_DEPS)						\
-		o/$(MODE)/tool/net/redbean.o					\
-		$(TOOL_NET_REDBEAN_LUA_MODULES)					\
-		o/$(MODE)/tool/net/net.pkg					\
-		o/$(MODE)/tool/net/demo/sql.lua.zip.o				\
-		o/$(MODE)/tool/net/demo/sql-backup.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/sql-backupstore.lua.zip.o		\
-		o/$(MODE)/tool/net/demo/unix-unix.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/unix-rawsocket.lua.zip.o		\
-		o/$(MODE)/tool/net/demo/unix-subprocess.lua.zip.o		\
-		o/$(MODE)/tool/net/demo/unix-webserver.lua.zip.o		\
-		o/$(MODE)/tool/net/demo/unix-dir.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/unix-info.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/unix-finger.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/fetch.lua.zip.o				\
-		o/$(MODE)/tool/net/demo/finger.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/store-asset.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/call-lua-module.lua.zip.o		\
-		o/$(MODE)/tool/net/demo/redbean.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/maxmind.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/opensource.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/hitcounter.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/binarytrees.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/crashreport.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/closedsource.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/printpayload.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/gensvg.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/redbean-form.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/redbean-xhr.lua.zip.o			\
-		o/$(MODE)/tool/.zip.o						\
-		o/$(MODE)/tool/net/.zip.o					\
-		o/$(MODE)/tool/net/demo/.zip.o					\
-		o/$(MODE)/tool/net/demo/index.html.zip.o			\
-		o/$(MODE)/tool/net/demo/redbean.css.zip.o			\
-		o/$(MODE)/tool/net/redbean.png.zip.o				\
-		o/$(MODE)/tool/net/favicon.ico.zip.o				\
-		o/$(MODE)/tool/net/demo/404.html.zip.o				\
-		o/$(MODE)/tool/net/demo/seekable.txt.zip.o			\
-		o/$(MODE)/tool/net/demo/.lua/.zip.o				\
-		o/$(MODE)/tool/net/demo/.lua/mymodule.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/.reload.lua.zip.o			\
-		o/$(MODE)/tool/net/demo/.init.lua.zip.o				\
-		o/$(MODE)/tool/net/help.txt.zip.o				\
-		$(CRT)								\
+o/$(MODE)/tool/net/redbean-demo.dbg:					\
+		$(TOOL_NET_DEPS)					\
+		o/$(MODE)/tool/net/redbean.o				\
+		$(TOOL_NET_REDBEAN_LUA_MODULES)				\
+		o/$(MODE)/tool/net/net.pkg				\
+		o/$(MODE)/tool/net/demo/sql.lua.zip.o			\
+		o/$(MODE)/tool/net/demo/sql-backup.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/sql-backupstore.lua.zip.o	\
+		o/$(MODE)/tool/net/demo/unix-unix.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/unix-rawsocket.lua.zip.o	\
+		o/$(MODE)/tool/net/demo/unix-subprocess.lua.zip.o	\
+		o/$(MODE)/tool/net/demo/unix-webserver.lua.zip.o	\
+		o/$(MODE)/tool/net/demo/unix-dir.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/unix-info.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/unix-finger.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/fetch.lua.zip.o			\
+		o/$(MODE)/tool/net/demo/finger.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/store-asset.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/call-lua-module.lua.zip.o	\
+		o/$(MODE)/tool/net/demo/redbean.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/maxmind.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/opensource.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/hitcounter.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/binarytrees.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/crashreport.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/closedsource.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/printpayload.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/gensvg.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/redbean-form.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/redbean-xhr.lua.zip.o		\
+		o/$(MODE)/tool/.zip.o					\
+		o/$(MODE)/tool/net/.zip.o				\
+		o/$(MODE)/tool/net/demo/.zip.o				\
+		o/$(MODE)/tool/net/demo/index.html.zip.o		\
+		o/$(MODE)/tool/net/demo/redbean.css.zip.o		\
+		o/$(MODE)/tool/net/redbean.png.zip.o			\
+		o/$(MODE)/tool/net/favicon.ico.zip.o			\
+		o/$(MODE)/tool/net/demo/404.html.zip.o			\
+		o/$(MODE)/tool/net/demo/seekable.txt.zip.o		\
+		o/$(MODE)/tool/net/demo/.lua/.zip.o			\
+		o/$(MODE)/tool/net/demo/.lua/mymodule.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/.reload.lua.zip.o		\
+		o/$(MODE)/tool/net/demo/.init.lua.zip.o			\
+		o/$(MODE)/tool/net/help.txt.zip.o			\
+		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/tool/net/redbean-demo.com:						\
-		o/$(MODE)/tool/net/redbean-demo.com.dbg				\
-		o/$(MODE)/third_party/zip/zip.com				\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
-# REDBEAN-STATIC.COM
+# REDBEAN-STATIC
 #
 # Passing the -DSTATIC causes Lua and SQLite to be removed. This reduces
 # the binary size from roughly 1500 kb to 500 kb. It still supports SSL.
 
-o/$(MODE)/tool/net/redbean-static.com.dbg:					\
-		$(TOOL_NET_DEPS)						\
-		$(TOOL_NET_REDBEAN_LUA_MODULES)					\
-		o/$(MODE)/tool/net/.init.lua.zip.o				\
-		o/$(MODE)/tool/net/favicon.ico.zip.o				\
-		o/$(MODE)/tool/net/redbean.png.zip.o				\
-		o/$(MODE)/tool/net/help.txt.zip.o				\
-		o/$(MODE)/tool/net/redbean-static.o				\
-		o/$(MODE)/tool/net/net.pkg					\
-		$(CRT)								\
+o/$(MODE)/tool/net/redbean-static.dbg:					\
+		$(TOOL_NET_DEPS)					\
+		$(TOOL_NET_REDBEAN_LUA_MODULES)				\
+		o/$(MODE)/tool/net/.init.lua.zip.o			\
+		o/$(MODE)/tool/net/favicon.ico.zip.o			\
+		o/$(MODE)/tool/net/redbean.png.zip.o			\
+		o/$(MODE)/tool/net/help.txt.zip.o			\
+		o/$(MODE)/tool/net/redbean-static.o			\
+		o/$(MODE)/tool/net/net.pkg				\
+		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/tool/net/redbean-static.com:						\
-		o/$(MODE)/tool/net/redbean-static.com.dbg			\
-		o/$(MODE)/third_party/zip/zip.com				\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
-# REDBEAN-UNSECURE.COM
+# REDBEAN-UNSECURE
 #
 # Passing the -DUNSECURE will cause the TLS security code to be removed.
 # That doesn't mean redbean becomes insecure. It just reduces complexity
 # in situations where you'd rather have SSL be handled in an edge proxy.
 
-o/$(MODE)/tool/net/redbean-unsecure.com.dbg:					\
-		$(TOOL_NET_DEPS)						\
-		$(TOOL_NET_REDBEAN_LUA_MODULES)					\
-		o/$(MODE)/tool/net/.init.lua.zip.o				\
-		o/$(MODE)/tool/net/favicon.ico.zip.o				\
-		o/$(MODE)/tool/net/redbean.png.zip.o				\
-		o/$(MODE)/tool/net/help.txt.zip.o				\
-		o/$(MODE)/tool/net/redbean-unsecure.o				\
-		o/$(MODE)/tool/net/net.pkg					\
-		$(CRT)								\
+o/$(MODE)/tool/net/redbean-unsecure.dbg:				\
+		$(TOOL_NET_DEPS)					\
+		$(TOOL_NET_REDBEAN_LUA_MODULES)				\
+		o/$(MODE)/tool/net/.init.lua.zip.o			\
+		o/$(MODE)/tool/net/favicon.ico.zip.o			\
+		o/$(MODE)/tool/net/redbean.png.zip.o			\
+		o/$(MODE)/tool/net/help.txt.zip.o			\
+		o/$(MODE)/tool/net/redbean-unsecure.o			\
+		o/$(MODE)/tool/net/net.pkg				\
+		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/tool/net/redbean-unsecure.com:					\
-		o/$(MODE)/tool/net/redbean-unsecure.com.dbg			\
-		o/$(MODE)/third_party/zip/zip.com				\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
-# REDBEAN-ORIGINAL.COM
+# REDBEAN-ORIGINAL
 #
 # Passing the -DSTATIC and -DUNSECURE flags together w/ MODE=tiny will
 # produce 200kb binary that's very similar to redbean as it existed on
 # Hacker News the day it went viral.
 
-o/$(MODE)/tool/net/redbean-original.com.dbg:					\
-		$(TOOL_NET_DEPS)						\
-		$(TOOL_NET_REDBEAN_LUA_MODULES)					\
-		o/$(MODE)/tool/net/.init.lua.zip.o				\
-		o/$(MODE)/tool/net/favicon.ico.zip.o				\
-		o/$(MODE)/tool/net/redbean.png.zip.o				\
-		o/$(MODE)/tool/net/help.txt.zip.o				\
-		o/$(MODE)/tool/net/redbean-original.o				\
-		o/$(MODE)/tool/net/net.pkg					\
-		$(CRT)								\
+o/$(MODE)/tool/net/redbean-original.dbg:				\
+		$(TOOL_NET_DEPS)					\
+		$(TOOL_NET_REDBEAN_LUA_MODULES)				\
+		o/$(MODE)/tool/net/.init.lua.zip.o			\
+		o/$(MODE)/tool/net/favicon.ico.zip.o			\
+		o/$(MODE)/tool/net/redbean.png.zip.o			\
+		o/$(MODE)/tool/net/help.txt.zip.o			\
+		o/$(MODE)/tool/net/redbean-original.o			\
+		o/$(MODE)/tool/net/net.pkg				\
+		$(CRT)							\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/tool/net/redbean-original.com:					\
-		o/$(MODE)/tool/net/redbean-original.com.dbg			\
-		o/$(MODE)/third_party/zip/zip.com				\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
-o/$(MODE)/tool/net/demo/.lua/.zip.o:						\
+o/$(MODE)/tool/net/demo/.lua/.zip.o:					\
 		tool/net/demo/.lua
-o/$(MODE)/tool/net/demo/.zip.o:							\
+o/$(MODE)/tool/net/demo/.zip.o:						\
 		tool/net/demo
-o/$(MODE)/tool/net/.zip.o:							\
+o/$(MODE)/tool/net/.zip.o:						\
 		tool/net
-o/$(MODE)/tool/.zip.o:								\
+o/$(MODE)/tool/.zip.o:							\
 		tool
 
 .PHONY: o/$(MODE)/tool/net
-o/$(MODE)/tool/net:								\
-		$(TOOL_NET_BINS)						\
+o/$(MODE)/tool/net:							\
+		$(TOOL_NET_BINS)					\
 		$(TOOL_NET_CHECKS)
diff --git a/tool/net/definitions.lua b/tool/net/definitions.lua
index aa9e830de..988e3ba6f 100644
--- a/tool/net/definitions.lua
+++ b/tool/net/definitions.lua
@@ -6,7 +6,7 @@ error("Tried to evaluate definition file.")
 
 SYNOPSIS
 
-  redbean.com [-?BVabdfghjkmsuvz] [-p PORT] [-D DIR] [-- SCRIPTARGS...]
+  redbean [-?BVabdfghjkmsuvz] [-p PORT] [-D DIR] [-- SCRIPTARGS...]
 
 DESCRIPTION
 
@@ -16,9 +16,7 @@ OVERVIEW
 
   redbean makes it possible to share web applications that run offline
   as a single-file Actually Portable Executable PKZIP archive which
-  contains your assets. All you need to do is download the redbean.com
-  program below, change the filename to .zip, add your content in a zip
-  editing tool, and then change the extension back to .com.
+  contains your assets.
 
   redbean can serve 1 million+ gzip encoded responses per second on a
   cheap personal computer. That performance is thanks to zip and gzip
@@ -145,15 +143,15 @@ USAGE
   This executable is also a ZIP file that contains static assets.
   You can run redbean interactively in your terminal as follows:
 
-    ./redbean.com -vvvmbag        # starts server verbosely
+    ./redbean -vvvmbag        # starts server verbosely
     open http://127.0.0.1:8080/   # shows zip listing page
     CTRL-C                        # 1x: graceful shutdown
     CTRL-C                        # 2x: forceful shutdown
 
   You can override the default listing page by adding:
 
-    zip redbean.com index.lua     # lua server pages take priority
-    zip redbean.com index.html    # default page for directory
+    zip redbean index.lua     # lua server pages take priority
+    zip redbean index.html    # default page for directory
 
   The listing page only applies to the root directory. However the
   default index page applies to subdirectories too. In order for it
@@ -168,7 +166,7 @@ USAGE
       --no-parent            \
       --no-if-modified-since \
       http://a.example/index.html
-    zip -r redbean.com a.example/  # default page for directory
+    zip -r redbean a.example/  # default page for directory
 
   redbean normalizes the trailing slash for you automatically:
 
@@ -206,18 +204,18 @@ USAGE
   by default, embedded as a bas64 data uri. You can override the
   custom page for various errors by adding files to the zip root.
 
-    zip redbean.com 404.html      # custom not found page
+    zip redbean 404.html      # custom not found page
 
   Audio video content should not be compressed in your ZIP files.
   Uncompressed assets enable browsers to send Range HTTP request.
   On the other hand compressed assets are best for gzip encoding.
 
-    zip redbean.com index.html    # adds file
-    zip -0 redbean.com video.mp4  # adds without compression
+    zip redbean index.html    # adds file
+    zip -0 redbean video.mp4  # adds without compression
 
   You can have redbean run as a daemon by doing the following:
 
-    sudo ./redbean.com -vvdp80 -p443 -L redbean.log -P redbean.pid
+    sudo ./redbean -vvdp80 -p443 -L redbean.log -P redbean.pid
     kill -TERM $(cat redbean.pid) # 1x: graceful shutdown
     kill -TERM $(cat redbean.pid) # 2x: forceful shutdown
 
@@ -241,11 +239,11 @@ USAGE
   is on the system path beforehand. You can also "assimilate" any
   redbean into the platform-local executable format by running:
 
-      $ file redbean.com
-      redbean.com: DOS/MBR boot sector
-      $ ./redbean.com --assimilate
-      $ file redbean.com
-      redbean.com: ELF 64-bit LSB executable
+      $ file redbean
+      redbean: DOS/MBR boot sector
+      $ ./redbean --assimilate
+      $ file redbean
+      redbean: ELF 64-bit LSB executable
 
 ────────────────────────────────────────────────────────────────────────────────
 SECURITY
@@ -352,7 +350,7 @@ REPL
   interpreter then you can pass the `-i` flag to put redbean into
   interpreter mode.
 
-      redbean.com -i binarytrees.lua 15
+      redbean -i binarytrees.lua 15
 
   When the `-i` flag is passed (for interpreter mode), redbean won't
   start a web server and instead functions like the `lua` command. The
@@ -369,12 +367,12 @@ REPL
   encoded in its preferred executable format. You can assimilate your
   redbean into the local format using the following commands:
 
-      $ file redbean.com
-      redbean.com: DOS/MBR boot sector
-      $ ./redbean.com --assimilate
-      $ file redbean.com
-      redbean.com: ELF 64-bit LSB executable
-      $ sudo cp redbean.com /usr/bin/redbean
+      $ file redbean
+      redbean: DOS/MBR boot sector
+      $ ./redbean --assimilate
+      $ file redbean
+      redbean: ELF 64-bit LSB executable
+      $ sudo cp redbean /usr/bin/redbean
 
   By following the above steps, redbean can be installed systemwide for
   multiple user accounts. It's also possible to chmod the binary to have
@@ -423,11 +421,11 @@ LUA ENHANCEMENTS
 ---
 --- For example, if you launch your redbean as follows:
 ---
----     redbean.com -v arg1 arg2
+---     redbean -v arg1 arg2
 ---
 --- Then your `/.init.lua` file will have the `arg` array like:
 ---
----     arg[-1] = '/usr/bin/redbean.com'
+---     arg[-1] = '/usr/bin/redbean'
 ---     arg[ 0] = '/zip/.init.lua'
 ---     arg[ 1] = 'arg1'
 ---     arg[ 2] = 'arg2'
@@ -435,11 +433,11 @@ LUA ENHANCEMENTS
 --- If you launch redbean in interpreter mode (rather than web
 --- server) mode, then an invocation like this:
 ---
----     ./redbean.com -i script.lua arg1 arg2
+---     ./redbean -i script.lua arg1 arg2
 ---
 --- Would have an `arg` array like this:
 ---
----     arg[-1] = './redbean.com'
+---     arg[-1] = './redbean'
 ---     arg[ 0] = 'script.lua'
 ---     arg[ 1] = 'arg1'
 ---     arg[ 2] = 'arg2'
@@ -511,7 +509,7 @@ SPECIAL PATHS
         If the special argument `...` *is* encountered, then it'll be
         replaced with whatever CLI args were specified by the user.
 
-        For example, you might want to use redbean.com in interpreter
+        For example, you might want to use redbean in interpreter
         mode, where your script file is inside the zip. Then, if your
         redbean is run, what you want is to have the default behavior
         be running your script. In that case, you might:
@@ -525,13 +523,13 @@ SPECIAL PATHS
             print("hello world")
             EOF
 
-            $ zip redbean.com .args hello.lua
-            $ ./redbean.com
+            $ zip redbean .args hello.lua
+            $ ./redbean
             hello world
 
         Please note that if you ran:
 
-            $ ./redbean.com -vv
+            $ ./redbean -vv
 
         Then the default mode of redbean will kick back in. To prevent
         that from happening, simply add the magic arg `...` to the end
@@ -3855,7 +3853,7 @@ function path.islink(path) end
 --- The database file is distributed by MaxMind. You need to sign up on their
 --- website to get a free copy. The database has a generalized structure. For a
 --- concrete example of how this module may be used, please see `maxmind.lua`
---- in `redbean-demo.com`.
+--- in `redbean-demo`.
 maxmind = {}
 
 ---@param filepath string the location of the MaxMind database
@@ -7004,7 +7002,7 @@ function unix.getrusage(who) end
 --- If the executable in question needs a loader, then you will need
 --- "rpath prot_exec" too. With APE, security is strongest when you
 --- assimilate your binaries beforehand, using the --assimilate flag,
---- or the o//tool/build/assimilate.com program. On OpenBSD this is
+--- or the o//tool/build/assimilate program. On OpenBSD this is
 --- mandatory.
 ---
 --- ### prot_exec
diff --git a/tool/net/demo/closedsource.lua b/tool/net/demo/closedsource.lua
index 7c4ba37c5..1b06cdaa8 100644
--- a/tool/net/demo/closedsource.lua
+++ b/tool/net/demo/closedsource.lua
@@ -1,2 +1,2 @@
 Write('This Lua Server Page is stored in ZIP\r\n')
-Write('as compressed byte code, see luac.com and net.mk\r\n')
+Write('as compressed byte code, see luac and net.mk\r\n')
diff --git a/tool/net/help.txt b/tool/net/help.txt
index 9c3ae4a7d..8095149cd 100644
--- a/tool/net/help.txt
+++ b/tool/net/help.txt
@@ -1,6 +1,6 @@
 SYNOPSIS
 
-  redbean.com [-?BVabdfghjkmsuvz] [-p PORT] [-D DIR] [-- SCRIPTARGS...]
+  redbean [-?BVabdfghjkmsuvz] [-p PORT] [-D DIR] [-- SCRIPTARGS...]
 
 DESCRIPTION
 
@@ -10,9 +10,7 @@ OVERVIEW
 
   redbean makes it possible to share web applications that run offline
   as a single-file Actually Portable Executable PKZIP archive which
-  contains your assets. All you need to do is download the redbean.com
-  program below, change the filename to .zip, add your content in a zip
-  editing tool, and then change the extension back to .com.
+  contains your assets.
 
   redbean can serve 1 million+ gzip encoded responses per second on a
   cheap personal computer. That performance is thanks to zip and gzip
@@ -139,15 +137,15 @@ USAGE
   This executable is also a ZIP file that contains static assets.
   You can run redbean interactively in your terminal as follows:
 
-    ./redbean.com -vvvmbag        # starts server verbosely
+    ./redbean -vvvmbag        # starts server verbosely
     open http://127.0.0.1:8080/   # shows zip listing page
     CTRL-C                        # 1x: graceful shutdown
     CTRL-C                        # 2x: forceful shutdown
 
   You can override the default listing page by adding:
 
-    zip redbean.com index.lua     # lua server pages take priority
-    zip redbean.com index.html    # default page for directory
+    zip redbean index.lua     # lua server pages take priority
+    zip redbean index.html    # default page for directory
 
   The listing page only applies to the root directory. However the
   default index page applies to subdirectories too. In order for it
@@ -162,7 +160,7 @@ USAGE
       --no-parent            \
       --no-if-modified-since \
       http://a.example/index.html
-    zip -r redbean.com a.example/  # default page for directory
+    zip -r redbean a.example/  # default page for directory
 
   redbean normalizes the trailing slash for you automatically:
 
@@ -200,18 +198,18 @@ USAGE
   by default, embedded as a bas64 data uri. You can override the
   custom page for various errors by adding files to the zip root.
 
-    zip redbean.com 404.html      # custom not found page
+    zip redbean 404.html      # custom not found page
 
   Audio video content should not be compressed in your ZIP files.
   Uncompressed assets enable browsers to send Range HTTP request.
   On the other hand compressed assets are best for gzip encoding.
 
-    zip redbean.com index.html    # adds file
-    zip -0 redbean.com video.mp4  # adds without compression
+    zip redbean index.html    # adds file
+    zip -0 redbean video.mp4  # adds without compression
 
   You can have redbean run as a daemon by doing the following:
 
-    sudo ./redbean.com -vvdp80 -p443 -L redbean.log -P redbean.pid
+    sudo ./redbean -vvdp80 -p443 -L redbean.log -P redbean.pid
     kill -TERM $(cat redbean.pid) # 1x: graceful shutdown
     kill -TERM $(cat redbean.pid) # 2x: forceful shutdown
 
@@ -235,11 +233,11 @@ USAGE
   is on the system path beforehand. You can also "assimilate" any
   redbean into the platform-local executable format by running:
 
-      $ file redbean.com
-      redbean.com: DOS/MBR boot sector
-      $ ./redbean.com --assimilate
-      $ file redbean.com
-      redbean.com: ELF 64-bit LSB executable
+      $ file redbean
+      redbean: DOS/MBR boot sector
+      $ ./redbean --assimilate
+      $ file redbean
+      redbean: ELF 64-bit LSB executable
 
 ────────────────────────────────────────────────────────────────────────────────
 SECURITY
@@ -391,7 +389,7 @@ REPL
   interpreter then you can pass the `-i` flag to put redbean into
   interpreter mode.
 
-      redbean.com -i binarytrees.lua 15
+      redbean -i binarytrees.lua 15
 
   When the `-i` flag is passed (for interpreter mode), redbean won't
   start a web server and instead functions like the `lua` command. The
@@ -408,12 +406,12 @@ REPL
   encoded in its preferred executable format. You can assimilate your
   redbean into the local format using the following commands:
 
-      $ file redbean.com
-      redbean.com: DOS/MBR boot sector
-      $ ./redbean.com --assimilate
-      $ file redbean.com
-      redbean.com: ELF 64-bit LSB executable
-      $ sudo cp redbean.com /usr/bin/redbean
+      $ file redbean
+      redbean: DOS/MBR boot sector
+      $ ./redbean --assimilate
+      $ file redbean
+      redbean: ELF 64-bit LSB executable
+      $ sudo cp redbean /usr/bin/redbean
 
   By following the above steps, redbean can be installed systemwide for
   multiple user accounts. It's also possible to chmod the binary to have
@@ -459,11 +457,11 @@ GLOBALS
 
           For example, if you launch your redbean as follows:
 
-              redbean.com -v arg1 arg2
+              redbean -v arg1 arg2
 
           Then your `/.init.lua` file will have the `arg` array like:
 
-              arg[-1] = '/usr/bin/redbean.com'
+              arg[-1] = '/usr/bin/redbean'
               arg[ 0] = '/zip/.init.lua'
               arg[ 1] = 'arg1'
               arg[ 2] = 'arg2'
@@ -471,11 +469,11 @@ GLOBALS
           If you launch redbean in interpreter mode (rather than web
           server) mode, then an invocation like this:
 
-              ./redbean.com -i script.lua arg1 arg2
+              ./redbean -i script.lua arg1 arg2
 
           Would have an `arg` array like this:
 
-              arg[-1] = './redbean.com'
+              arg[-1] = './redbean'
               arg[ 0] = 'script.lua'
               arg[ 1] = 'arg1'
               arg[ 2] = 'arg2'
@@ -540,7 +538,7 @@ SPECIAL PATHS
           If the special argument `...` *is* encountered, then it'll be
           replaced with whatever CLI args were specified by the user.
 
-          For example, you might want to use redbean.com in interpreter
+          For example, you might want to use redbean in interpreter
           mode, where your script file is inside the zip. Then, if your
           redbean is run, what you want is to have the default behavior
           be running your script. In that case, you might:
@@ -554,13 +552,13 @@ SPECIAL PATHS
               print("hello world")
               EOF
 
-              $ zip redbean.com .args hello.lua
-              $ ./redbean.com
+              $ zip redbean .args hello.lua
+              $ ./redbean
               hello world
 
           Please note that if you ran:
 
-              $ ./redbean.com -vv
+              $ ./redbean -vv
 
           Then the default mode of redbean will kick back in. To prevent
           that from happening, simply add the magic arg `...` to the end
@@ -2485,7 +2483,7 @@ MAXMIND MODULE
           Write(EscapeHtml(asorg))
       end
 
-  For further details, please see maxmind.lua in redbean-demo.com.
+  For further details, please see maxmind.lua in redbean-demo.
 
 
 ────────────────────────────────────────────────────────────────────────────────
@@ -4469,7 +4467,7 @@ UNIX MODULE
       If the executable in question needs a loader, then you will need
       "rpath prot_exec" too. With APE, security is strongest when you
       assimilate your binaries beforehand, using the --assimilate flag,
-      or the o//tool/build/assimilate.com program. On OpenBSD this is
+      or the o//tool/build/assimilate program. On OpenBSD this is
       mandatory.
 
     prot_exec
diff --git a/tool/net/redbean.c b/tool/net/redbean.c
index a5146e290..762d654b3 100644
--- a/tool/net/redbean.c
+++ b/tool/net/redbean.c
@@ -152,9 +152,7 @@ __static_yoink("blink_xnu_aarch64");    // is apple silicon
  *
  * redbean makes it possible to share web applications that run offline
  * as a single-file Ξ±cτ¡αlly pΞ΄rταblΞ΅ Ξ΅xΞ΅c¡ταblΞ΅ zip archive which
- * contains your assets. All you need to do is download the redbean.com
- * program below, change the filename to .zip, add your content in a zip
- * editing tool, and then change the extension back to .com.
+ * contains your assets.
  *
  * redbean can serve 1 million+ gzip encoded responses per second on a
  * cheap personal computer. That performance is thanks to zip and gzip
@@ -6936,7 +6934,7 @@ static void MakeExecutableModifiable(void) {
   if (IsWindows()) return;  // TODO
   if (IsOpenbsd()) return;  // TODO
   if (IsNetbsd()) return;   // TODO
-  if (endswith(zpath, ".com.dbg")) return;
+  if (endswith(zpath, ".dbg")) return;
   close(zfd);
   ft = ftrace_enabled(0);
   if ((zfd = __open_executable()) == -1) {
diff --git a/tool/net/tiny/help.txt b/tool/net/tiny/help.txt
index 4adba268e..2ec98dff8 100644
--- a/tool/net/tiny/help.txt
+++ b/tool/net/tiny/help.txt
@@ -1,6 +1,6 @@
 SYNOPSIS
 
-  redbean.com [-hvduzmbagf] [-p PORT] [-D DIR]
+  redbean [-hvduzmbagf] [-p PORT] [-D DIR]
 
 DESCRIPTION
 
diff --git a/tool/plinko/BUILD.mk b/tool/plinko/BUILD.mk
index a31dd0054..40cf63924 100644
--- a/tool/plinko/BUILD.mk
+++ b/tool/plinko/BUILD.mk
@@ -11,7 +11,7 @@ TOOL_PLINKO_OBJS =						\
 	$(TOOL_PLINKO_SRCS:%.c=o/$(MODE)/%.o)
 
 TOOL_PLINKO_COMS =						\
-	$(TOOL_PLINKO_SRCS:%.c=o/$(MODE)/%.com)
+	$(TOOL_PLINKO_SRCS:%.c=o/$(MODE)/%)
 
 TOOL_PLINKO_BINS =						\
 	$(TOOL_PLINKO_COMS)					\
@@ -36,7 +36,7 @@ o/$(MODE)/tool/plinko/plinko.pkg:				\
 		$(TOOL_PLINKO_OBJS)				\
 		$(foreach x,$(TOOL_PLINKO_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/tool/plinko/%.com.dbg:				\
+o/$(MODE)/tool/plinko/%.dbg:					\
 		$(TOOL_PLINKO_DEPS)				\
 		o/$(MODE)/tool/plinko/%.o			\
 		o/$(MODE)/tool/plinko/plinko.pkg		\
@@ -45,18 +45,10 @@ o/$(MODE)/tool/plinko/%.com.dbg:				\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/tool/plinko/plinko.com:				\
-		o/$(MODE)/tool/plinko/plinko.com.dbg		\
-		o/$(MODE)/third_party/zip/zip.com		\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
+o/$(MODE)/tool/plinko/plinko.zip.o:				\
+		o/$(MODE)/tool/plinko/plinko
 
-o/$(MODE)/tool/plinko/plinko.com.zip.o:				\
-		o/$(MODE)/tool/plinko/plinko.com
-
-o/$(MODE)/tool/plinko/plinko.com.zip.o				\
+o/$(MODE)/tool/plinko/plinko.zip.o				\
 o/$(MODE)/tool/plinko/lib/library.lisp.zip.o			\
 o/$(MODE)/tool/plinko/lib/binarytrees.lisp.zip.o		\
 o/$(MODE)/tool/plinko/lib/algebra.lisp.zip.o			\
diff --git a/tool/scripts/bf b/tool/scripts/bf
index 860e05c04..49bebd370 100755
--- a/tool/scripts/bf
+++ b/tool/scripts/bf
@@ -1,4 +1,4 @@
 #!/bin/sh
-bing.com <"$1" |
-  fold.com |
+bing <"$1" |
+  fold |
   exec less
diff --git a/tool/scripts/explain-deps.py b/tool/scripts/explain-deps.py
index 3e652b983..f53f521f4 100755
--- a/tool/scripts/explain-deps.py
+++ b/tool/scripts/explain-deps.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python.com
+#!/usr/bin/env python
 
 import os
 import re
diff --git a/tool/scripts/fix-third-party.py b/tool/scripts/fix-third-party.py
index 071f353ef..0cadedcfe 100755
--- a/tool/scripts/fix-third-party.py
+++ b/tool/scripts/fix-third-party.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python.com
+#!/usr/bin/env python
 #
 # fix-third-party.py
 # normalizes third party codebases to cosmopolitan style
diff --git a/tool/scripts/get-deps.py b/tool/scripts/get-deps.py
index baf4f87a7..100f2f5cc 100755
--- a/tool/scripts/get-deps.py
+++ b/tool/scripts/get-deps.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python.com
+#!/usr/bin/env python
 #
 # OVERVIEW
 #
diff --git a/tool/scripts/grep b/tool/scripts/grep
index bb8d7b534..4dbf65a2f 100755
--- a/tool/scripts/grep
+++ b/tool/scripts/grep
@@ -2,7 +2,7 @@
 exec grep                       \
      --exclude=TAGS             \
      --exclude=HTAGS            \
-     --exclude=*.com            \
+     --exclude=*.dbg            \
      --exclude-dir=o            \
      --exclude-dir=gcc          \
      --exclude-dir=.git         \
diff --git a/tool/scripts/man2txt b/tool/scripts/man2txt
index db4d71115..e11f7fc15 100755
--- a/tool/scripts/man2txt
+++ b/tool/scripts/man2txt
@@ -1,7 +1,7 @@
 #!/bin/sh
 
-ASCII2UTF8=$(command -v ascii2utf8.com 2>/dev/null) || {
-  ASCII2UTF8=$(ls -1 o/*/tool/viz/ascii2utf8.com | head -n1)
+ASCII2UTF8=$(command -v ascii2utf8 2>/dev/null) || {
+  ASCII2UTF8=$(ls -1 o/*/tool/viz/ascii2utf8 | head -n1)
 }
 
 for x; do
diff --git a/tool/scripts/pb b/tool/scripts/pb
index 78ee628d0..b92e9fe91 100755
--- a/tool/scripts/pb
+++ b/tool/scripts/pb
@@ -1,5 +1,5 @@
 #!/bin/sh
-exec python.com -c "
+exec python -c "
 # -*- coding: utf-8 -*-
 import sys
 from math import *
diff --git a/tool/scripts/pe b/tool/scripts/pe
index e757f3a94..b8cc1275e 100755
--- a/tool/scripts/pe
+++ b/tool/scripts/pe
@@ -6,4 +6,4 @@ from math import *
 s = str($*)
 sys.stdout.write(s)
 " >/tmp/pe
-exec python.com /tmp/pe
+exec python /tmp/pe
diff --git a/tool/scripts/po b/tool/scripts/po
index d28d78460..ecc0a4092 100755
--- a/tool/scripts/po
+++ b/tool/scripts/po
@@ -1,5 +1,5 @@
 #!/bin/sh
-exec python.com -c "
+exec python -c "
 import sys
 from math import *
 s = str(oct($*).replace('o',''))
diff --git a/tool/scripts/px b/tool/scripts/px
index 59abec069..917cf3308 100755
--- a/tool/scripts/px
+++ b/tool/scripts/px
@@ -1,5 +1,5 @@
 #!/bin/sh
-exec python.com -c "
+exec python -c "
 # -*- coding: utf-8 -*-
 import sys
 from math import *
diff --git a/tool/viz/BUILD.mk b/tool/viz/BUILD.mk
index e7b02e50c..73473d3f3 100644
--- a/tool/viz/BUILD.mk
+++ b/tool/viz/BUILD.mk
@@ -5,111 +5,95 @@ PKGS += TOOL_VIZ
 
 TOOL_VIZ_SRCS := $(wildcard tool/viz/*.c)
 
-TOOL_VIZ_OBJS =					\
+TOOL_VIZ_OBJS =						\
 	$(TOOL_VIZ_SRCS:%.c=o/$(MODE)/%.o)
 
-TOOL_VIZ_COMS =					\
-	$(TOOL_VIZ_SRCS:%.c=o/$(MODE)/%.com)
+TOOL_VIZ_COMS =						\
+	$(TOOL_VIZ_SRCS:%.c=o/$(MODE)/%)
 
-TOOL_VIZ_BINS =					\
-	$(TOOL_VIZ_COMS)			\
+TOOL_VIZ_BINS =						\
+	$(TOOL_VIZ_COMS)				\
 	$(TOOL_VIZ_COMS:%=%.dbg)
 
-TOOL_VIZ_DIRECTDEPS =				\
-	DSP_CORE				\
-	DSP_MPEG				\
-	DSP_SCALE				\
-	DSP_TTY					\
-	LIBC_CALLS				\
-	LIBC_FMT				\
-	LIBC_INTRIN				\
-	LIBC_LOG				\
-	LIBC_MEM				\
-	LIBC_NEXGEN32E				\
-	LIBC_NT_COMDLG32			\
-	LIBC_NT_GDI32				\
-	LIBC_NT_KERNEL32			\
-	LIBC_NT_USER32				\
-	LIBC_PROC				\
-	LIBC_RUNTIME				\
-	LIBC_SOCK				\
-	LIBC_STDIO				\
-	LIBC_STR				\
-	LIBC_SYSV				\
-	LIBC_SYSV_CALLS				\
-	LIBC_THREAD				\
-	LIBC_TIME				\
-	LIBC_TINYMATH				\
-	LIBC_VGA				\
-	LIBC_X					\
-	NET_HTTP				\
-	THIRD_PARTY_COMPILER_RT			\
-	THIRD_PARTY_DLMALLOC			\
-	THIRD_PARTY_GDTOA			\
-	THIRD_PARTY_GETOPT			\
-	THIRD_PARTY_MAXMIND			\
-	THIRD_PARTY_MUSL			\
-	THIRD_PARTY_STB				\
-	THIRD_PARTY_XED				\
-	THIRD_PARTY_ZLIB			\
-	TOOL_DECODE_LIB				\
+TOOL_VIZ_DIRECTDEPS =					\
+	DSP_CORE					\
+	DSP_MPEG					\
+	DSP_SCALE					\
+	DSP_TTY						\
+	LIBC_CALLS					\
+	LIBC_FMT					\
+	LIBC_INTRIN					\
+	LIBC_LOG					\
+	LIBC_MEM					\
+	LIBC_NEXGEN32E					\
+	LIBC_NT_COMDLG32				\
+	LIBC_NT_GDI32					\
+	LIBC_NT_KERNEL32				\
+	LIBC_NT_USER32					\
+	LIBC_PROC					\
+	LIBC_RUNTIME					\
+	LIBC_SOCK					\
+	LIBC_STDIO					\
+	LIBC_STR					\
+	LIBC_SYSV					\
+	LIBC_SYSV_CALLS					\
+	LIBC_THREAD					\
+	LIBC_TIME					\
+	LIBC_TINYMATH					\
+	LIBC_VGA					\
+	LIBC_X						\
+	NET_HTTP					\
+	THIRD_PARTY_COMPILER_RT				\
+	THIRD_PARTY_DLMALLOC				\
+	THIRD_PARTY_GDTOA				\
+	THIRD_PARTY_GETOPT				\
+	THIRD_PARTY_MAXMIND				\
+	THIRD_PARTY_MUSL				\
+	THIRD_PARTY_STB					\
+	THIRD_PARTY_XED					\
+	THIRD_PARTY_ZLIB				\
+	TOOL_DECODE_LIB					\
 	TOOL_VIZ_LIB
 
-TOOL_VIZ_DEPS :=				\
+TOOL_VIZ_DEPS :=					\
 	$(call uniq,$(foreach x,$(TOOL_VIZ_DIRECTDEPS),$($(x))))
 
-o/$(MODE)/tool/viz/viz.pkg:			\
-		$(TOOL_VIZ_OBJS)		\
+o/$(MODE)/tool/viz/viz.pkg:				\
+		$(TOOL_VIZ_OBJS)			\
 		$(foreach x,$(TOOL_VIZ_DIRECTDEPS),$($(x)_A).pkg)
 
-o/$(MODE)/tool/viz/%.com.dbg:			\
-		$(TOOL_VIZ_DEPS)		\
-		o/$(MODE)/tool/viz/%.o		\
-		o/$(MODE)/tool/viz/viz.pkg	\
-		$(CRT)				\
+o/$(MODE)/tool/viz/%.dbg:				\
+		$(TOOL_VIZ_DEPS)			\
+		o/$(MODE)/tool/viz/%.o			\
+		o/$(MODE)/tool/viz/viz.pkg		\
+		$(CRT)					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/tool/viz/printimage.com.dbg:		\
-		$(TOOL_VIZ_DEPS)		\
-		o/$(MODE)/tool/viz/printimage.o	\
-		o/$(MODE)/tool/viz/viz.pkg	\
-		o/$(MODE)/LICENSE.zip.o		\
-		$(CRT)				\
+o/$(MODE)/tool/viz/printimage.dbg:			\
+		$(TOOL_VIZ_DEPS)			\
+		o/$(MODE)/tool/viz/printimage.o		\
+		o/$(MODE)/tool/viz/viz.pkg		\
+		o/$(MODE)/LICENSE.zip.o			\
+		$(CRT)					\
 		$(APE_NO_MODIFY_SELF)
 	@$(APELINK)
 
-o/$(MODE)/tool/viz/printimage.com:			\
-		o/$(MODE)/tool/viz/printimage.com.dbg	\
-		o/$(MODE)/third_party/zip/zip.com	\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
-o/$(MODE)/tool/viz/printvideo.com:			\
-		o/$(MODE)/tool/viz/printvideo.com.dbg	\
-		o/$(MODE)/third_party/zip/zip.com	\
-		o/$(MODE)/tool/build/symtab.com
-	@$(MAKE_OBJCOPY)
-	@$(MAKE_SYMTAB_CREATE)
-	@$(MAKE_SYMTAB_ZIP)
-
-o/$(MODE)/tool/viz/derasterize.o: private	\
-		CFLAGS +=			\
-			-DSTACK_FRAME_UNLIMITED	\
+o/$(MODE)/tool/viz/derasterize.o: private		\
+		CFLAGS +=				\
+			-DSTACK_FRAME_UNLIMITED		\
 			$(MATHEMATICAL)
 
-o/$(MODE)/tool/viz/magikarp.o: private		\
-		CFLAGS +=			\
+o/$(MODE)/tool/viz/magikarp.o: private			\
+		CFLAGS +=				\
 			$(MATHEMATICAL)
 
-$(TOOL_VIZ_OBJS):				\
-		$(BUILD_FILES)			\
+$(TOOL_VIZ_OBJS):					\
+		$(BUILD_FILES)				\
 		tool/viz/BUILD.mk
 
 .PHONY: o/$(MODE)/tool/viz
-o/$(MODE)/tool/viz:				\
-		o/$(MODE)/tool/viz/lib		\
-		$(TOOL_VIZ_BINS)		\
+o/$(MODE)/tool/viz:					\
+		o/$(MODE)/tool/viz/lib			\
+		$(TOOL_VIZ_BINS)			\
 		$(TOOL_VIZ_CHECKS)
diff --git a/tool/viz/ascii2utf8.c b/tool/viz/ascii2utf8.c
index 381c77ba1..d895b7bf1 100644
--- a/tool/viz/ascii2utf8.c
+++ b/tool/viz/ascii2utf8.c
@@ -25,7 +25,7 @@
   Getting started:
 
     nroff -mandoc -rLL=72n -rLT=78n -Tutf8 <manpage.1 |
-      o/tool/viz/ascii2utf8.com
+      o/tool/viz/ascii2utf8
 
   ASCII Bold:
 
diff --git a/tool/viz/derasterize.c b/tool/viz/derasterize.c
index 07ac725f5..8a0e1d829 100644
--- a/tool/viz/derasterize.c
+++ b/tool/viz/derasterize.c
@@ -82,7 +82,7 @@ DESCRIPTION\n\
 \n\
 EXAMPLES\n\
 \n\
-  $ ./derasterize.com samples/wave.png > wave.uaart\n\
+  $ ./derasterize samples/wave.png > wave.uaart\n\
   $ cat wave.uaart\n\
 \n\
 AUTHORS\n\
diff --git a/tool/viz/dumphexc.c b/tool/viz/dumphexc.c
index 3d4d65bd2..d7f40a953 100644
--- a/tool/viz/dumphexc.c
+++ b/tool/viz/dumphexc.c
@@ -25,7 +25,7 @@
 /**
  * @fileoverview Hex String Literal Converter, e.g.
  *
- *     $ echo hello | o/tool/viz/dumphexc.com
+ *     $ echo hello | o/tool/viz/dumphexc
  *     "\
  *     \x68\x65\x6c\x6c\x6f\x0a"
  */
diff --git a/tool/viz/life.c b/tool/viz/life.c
index ae947c8c7..c01118719 100644
--- a/tool/viz/life.c
+++ b/tool/viz/life.c
@@ -102,11 +102,11 @@
  * Here's how you can compile this program on Linux:
  *
  *     git clone https://github.com/jart/cosmopolitan && cd cosmopolitan
- *     make -j12 o//tool/viz/life.com
+ *     make -j12 o//tool/viz/life
  *
  * The output binary works on Linux, Windows, Mac, and FreeBSD:
  *
- *     o//tool/viz/life.com
+ *     o//tool/viz/life
  *
  * @see https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
  * @see https://www.conwaylife.com/wiki/Run_Length_Encoded
@@ -225,10 +225,10 @@ static char16_t statusline16[256];
 #define GODOWN(x)    ((x) << 8)
 #define GORIGHT(x)   (((x) & ~RIGHT) << 1)
 #define GOLEFT(x)    (((x) & ~LEFT) >> 1)
-#define LEFTMOST(x)  ((x)&LEFT)
-#define RIGHTMOST(x) ((x)&RIGHT)
-#define TOPMOST(x)   ((x)&TOP)
-#define BOTMOST(x)   ((x)&BOTTOM)
+#define LEFTMOST(x)  ((x) & LEFT)
+#define RIGHTMOST(x) ((x) & RIGHT)
+#define TOPMOST(x)   ((x) & TOP)
+#define BOTMOST(x)   ((x) & BOTTOM)
 
 #define ADD(X)       \
   do {               \
diff --git a/tool/viz/printansi.c b/tool/viz/printansi.c
index 0347823c8..733701d6b 100644
--- a/tool/viz/printansi.c
+++ b/tool/viz/printansi.c
@@ -84,9 +84,10 @@ FLAGS\n\
 \n\
 EXAMPLES\n\
 \n\
-  printansi.com -w80 -h40 logo.png\n\
+  printansi -w80 -h40 logo.png\n\
 \n\
-\n", NULL);
+\n",
+            NULL);
   exit(rc);
 }
 
diff --git a/tool/viz/printimage.c b/tool/viz/printimage.c
index 8cc472f6d..fb2c5974a 100644
--- a/tool/viz/printimage.c
+++ b/tool/viz/printimage.c
@@ -93,8 +93,9 @@ FLAGS\n\
 \n\
 EXAMPLES\n\
 \n\
-  printimage.com -sxd lemurs.jpg  # 256-color dither unsharp\n\
-\n", NULL);
+  printimage -sxd lemurs.jpg  # 256-color dither unsharp\n\
+\n",
+            NULL);
   exit(rc);
 }
 
diff --git a/tool/viz/printvideo.c b/tool/viz/printvideo.c
index 848dabb90..19b2acd59 100644
--- a/tool/viz/printvideo.c
+++ b/tool/viz/printvideo.c
@@ -1572,7 +1572,7 @@ int main(int argc, char *argv[]) {
     fprintf(stderr, "please install either the "
                     "`play` (sox) or "
                     "`ffplay` (ffmpeg) "
-                    "commands, so printvideo.com can play audio\n");
+                    "commands, so printvideo can play audio\n");
     usleep(10000);
   }
   infd_ = STDIN_FILENO;
diff --git a/tool/viz/unbing.c b/tool/viz/unbing.c
index c748f0b99..fc5074eb4 100644
--- a/tool/viz/unbing.c
+++ b/tool/viz/unbing.c
@@ -30,9 +30,9 @@
  * something almost representing a source code file. A hack also exists
  * for comments in such files: 𝘢𝘴𝘦 π‘›π‘œπ‘›-π‘Žπ‘ π‘π‘–π‘– π—Ήπ—²π˜π˜π—²π—Ώπ—Άπ—»π—΄ π”žπ”©π”±π”’π”―π”«π”žπ”±π”¦π”³π”’π”°.
  *
- *   bash$ o/tool/viz/bing.com </bin/sh | o/tool/viz/fold.com >sh.txt
+ *   bash$ o/tool/viz/bing </bin/sh | o/tool/viz/fold >sh.txt
  *   bash$ emacs sh.txt
- *   bash$ o/tool/viz/unbing.com <sh.txt >sh
+ *   bash$ o/tool/viz/unbing <sh.txt >sh
  *   bash$ chmod +x sh
  *   bash$ ./sh
  *
diff --git a/tool/zsh/mmake b/tool/zsh/mmake
index 31787a222..0b5315bae 100644
--- a/tool/zsh/mmake
+++ b/tool/zsh/mmake
@@ -39,7 +39,7 @@ done
   j=-j$(nproc)
 }
 local make=${MAKE:-${COSMOCC:-/opt/cosmocc/current}/bin/make}
-[[ -x $make ]] || make=${COSMO:-$PWD}/build/bootstrap/make.com
+[[ -x $make ]] || make=${COSMO:-$PWD}/build/bootstrap/make
 ( set -x
   exec $make $j $flags MODE=$mode $targs )
 # vim:ft=zsh