diff --git a/src/sbbs3/js_archive.c b/src/sbbs3/js_archive.c
index a82c26da1debf24be2dc911f1547ff0ae2746743..3fd1c9259df56b448d0b961deb0a5c3abeda6d26 100644
--- a/src/sbbs3/js_archive.c
+++ b/src/sbbs3/js_archive.c
@@ -196,6 +196,19 @@ js_archive_type(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
 	return JS_TRUE;
 }
 
+static JSBool
+js_archive_name(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
+{
+	const char* filename;
+
+	if((filename = js_GetClassPrivate(cx, obj, &js_archive_class)) == NULL)
+		return JS_FALSE;
+
+	JSString* js_str = JS_NewStringCopyZ(cx, filename);
+	*vp = STRING_TO_JSVAL(js_str);
+	return JS_TRUE;
+}
+
 // TODO: consider making 'path' and 'case-sensitive' arguments to wildmatch() configurable via method arguments
 static JSBool
 js_list(JSContext *cx, uintN argc, jsval *arglist)
@@ -582,6 +595,7 @@ static jsSyncMethodSpec js_archive_functions[] = {
 static char* archive_prop_desc[] = {
 
 	 "format/compression type of archive file - <small>READ ONLY</small>"
+	,"filename specified in constructor - <small>READ ONLY</small>"
 	,NULL
 };
 #endif
@@ -612,6 +626,10 @@ js_archive_constructor(JSContext *cx, uintN argc, jsval *arglist)
 		JS_ReportError(cx, "JS_DefineProperty failed");
 		return JS_FALSE;
 	}
+	if(!JS_DefineProperty(cx, obj, "name", JSVAL_VOID, js_archive_name, NULL, JSPROP_ENUMERATE|JSPROP_READONLY)) {
+		JS_ReportError(cx, "JS_DefineProperty failed");
+		return JS_FALSE;
+	}
 
 #ifdef BUILD_JSDOCS
 	js_DescribeSyncObject(cx,obj,"Class used for creating, reading, or extracting archive files on the local file system<br>"