diff --git a/packages/backend/src/misc/langmap.ts b/packages/backend/src/misc/langmap.ts
index 0f71c8f81c..d36796d403 100644
--- a/packages/backend/src/misc/langmap.ts
+++ b/packages/backend/src/misc/langmap.ts
@@ -1,5 +1,4 @@
-import LangMap from "firefish-js/built/misc/langmap.js";
-
-export const langmap = LangMap.langmap;
+import { langmap as _langmap } from "firefish-js";
+export const langmap = _langmap;
 
 export type PostLanguage = keyof typeof langmap;
diff --git a/packages/backend/src/misc/schema.ts b/packages/backend/src/misc/schema.ts
index 8d073e4832..b4148e7e27 100644
--- a/packages/backend/src/misc/schema.ts
+++ b/packages/backend/src/misc/schema.ts
@@ -1,4 +1,7 @@
 // TODO: use firefish-js
+import { Schema as _Schema } from "firefish-js";
 
-export * from "firefish-js/built/misc/schema.js";
-// export Schema from "firefish-js";
+export const refs = _Schema.refs;
+export type Packed<T extends keyof typeof refs> = _Schema.Packed<T>;
+export type Schema = _Schema.Schema;
+export type SchemaType<P extends _Schema.Schema> = _Schema.SchemaType<P>;
diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts
index 14bbc44661..293c56d6f8 100644
--- a/packages/client/vite.config.ts
+++ b/packages/client/vite.config.ts
@@ -89,7 +89,7 @@ export default defineConfig(({ command, mode }) => {
 			sourcemap: process.env.NODE_ENV === "development",
 			reportCompressedSize: false,
 			commonjsOptions: {
-				include: [/firefish-js/, /node_modules/],
+				include: [/node_modules/],
 			},
 		},
 		optimizeDeps: {
diff --git a/packages/firefish-js/.swcrc b/packages/firefish-js/.swcrc
index 89800c7b67..f398cdce5c 100644
--- a/packages/firefish-js/.swcrc
+++ b/packages/firefish-js/.swcrc
@@ -17,7 +17,7 @@
 	},
 	"minify": false,
 	"module": {
-		"type": "commonjs",
+		"type": "es6",
 		"strict": true,
 		"resolveFully": true
 	}
diff --git a/packages/firefish-js/package.json b/packages/firefish-js/package.json
index 50228712e1..cd30e879d1 100644
--- a/packages/firefish-js/package.json
+++ b/packages/firefish-js/package.json
@@ -4,12 +4,12 @@
 	"description": "Firefish SDK for JavaScript",
 	"homepage": "https://firefish.dev/firefish/firefish/-/tree/develop/packages/firefish-js",
 	"main": "./built/index.js",
+	"type": "module",
 	"types": "./src/index.ts",
 	"license": "MIT",
 	"scripts": {
-		"build": "pnpm swc src --out-dir built --source-maps false --copy-files --strip-leading-paths && pnpm run build:types",
-		"build:debug": "pnpm swc src --out-dir built --source-maps true --copy-files --strip-leading-paths && pnpm run build:types",
-		"build:types": "pnpm tsc --emitDeclarationOnly",
+		"build": "pnpm swc src --out-dir built --source-maps false --copy-files --strip-leading-paths",
+		"build:debug": "pnpm swc src --out-dir built --source-maps true --copy-files --strip-leading-paths",
 		"watch": "pnpm swc src --out-dir built --source-maps true --copy-files --strip-leading-paths --watch",
 		"lint": "pnpm biome check --apply src",
 		"format": "pnpm biome format --write src",
@@ -36,7 +36,7 @@
 		"typescript": "5.4.5"
 	},
 	"files": [
-		"built"
+		"built", "src"
 	],
 	"dependencies": {
 		"eventemitter3": "^5.0.1",
diff --git a/packages/firefish-js/src/api.ts b/packages/firefish-js/src/api.ts
index 3cfdfedbfe..5553c1feeb 100644
--- a/packages/firefish-js/src/api.ts
+++ b/packages/firefish-js/src/api.ts
@@ -1,4 +1,4 @@
-import type { Endpoints } from "./api.types";
+import type { Endpoints } from "./api.types.js";
 
 const MK_API_ERROR = Symbol();
 
diff --git a/packages/firefish-js/src/api.types.ts b/packages/firefish-js/src/api.types.ts
index a153a96962..c458e46a09 100644
--- a/packages/firefish-js/src/api.types.ts
+++ b/packages/firefish-js/src/api.types.ts
@@ -38,7 +38,7 @@ import type {
 	UserList,
 	UserLite,
 	UserSorting,
-} from "./entities";
+} from "./entities.js";
 
 import type * as consts from "./consts";
 
diff --git a/packages/firefish-js/src/entities.ts b/packages/firefish-js/src/entities.ts
index e622e98df4..93e11285ba 100644
--- a/packages/firefish-js/src/entities.ts
+++ b/packages/firefish-js/src/entities.ts
@@ -1,5 +1,5 @@
-import type * as consts from "./consts";
-import type { Packed } from "./misc/schema";
+import type * as consts from "./consts.js";
+import type { Packed } from "./misc/schema.js";
 
 export type ID = string;
 export type DateString = string;
diff --git a/packages/firefish-js/src/index.ts b/packages/firefish-js/src/index.ts
index efb625258e..126ab47e53 100644
--- a/packages/firefish-js/src/index.ts
+++ b/packages/firefish-js/src/index.ts
@@ -1,17 +1,17 @@
-import * as acct from "./acct";
-import type { Acct } from "./acct";
-import { Endpoints } from "./api.types";
-import type * as ApiTypes from "./api.types";
-import * as consts from "./consts";
-import Stream, { Connection } from "./streaming";
-import * as StreamTypes from "./streaming.types";
-import type * as TypeUtils from "./type-utils";
+import * as acct from "./acct.js";
+import type { Acct } from "./acct.js";
+import type { Endpoints } from "./api.types.js";
+import type * as ApiTypes from "./api.types.js";
+import * as consts from "./consts.js";
+import Stream, { Connection } from "./streaming.js";
+import * as StreamTypes from "./streaming.types.js";
+import type * as TypeUtils from "./type-utils.js";
 
-import type * as SchemaTypes from "./misc/schema";
-import * as Schema from "./misc/schema";
+import type * as SchemaTypes from "./misc/schema.js";
+import * as Schema from "./misc/schema.js";
 
 export {
-	Endpoints,
+	type Endpoints,
 	type ApiTypes,
 	Stream,
 	Connection as ChannelConnection,
@@ -31,11 +31,11 @@ export const languages = consts.languages;
 export const ffVisibility = consts.ffVisibility;
 export const instanceSortParam = consts.instanceSortParam;
 
-import { langmap } from "./misc/langmap";
+import { langmap } from "./misc/langmap.js";
 
 // api extractor not supported yet
 //export * as api from './api';
 //export * as entities from './entities';
-import * as api from "./api";
-import * as entities from "./entities";
+import * as api from "./api.js";
+import * as entities from "./entities.js";
 export { api, entities, langmap };
diff --git a/packages/firefish-js/src/schema/notification.ts b/packages/firefish-js/src/schema/notification.ts
index 85d7d33970..dec921a8a7 100644
--- a/packages/firefish-js/src/schema/notification.ts
+++ b/packages/firefish-js/src/schema/notification.ts
@@ -1,4 +1,4 @@
-import { notificationTypes } from "../consts";
+import { notificationTypes } from "../consts.js";
 
 export const packedNotificationSchema = {
 	type: "object",
diff --git a/packages/firefish-js/src/streaming.ts b/packages/firefish-js/src/streaming.ts
index 58491bc8c0..0fcd0c7498 100644
--- a/packages/firefish-js/src/streaming.ts
+++ b/packages/firefish-js/src/streaming.ts
@@ -1,6 +1,6 @@
 import { EventEmitter } from "eventemitter3";
 import ReconnectingWebsocket from "reconnecting";
-import type { BroadcastEvents, Channels } from "./streaming.types";
+import type { BroadcastEvents, Channels } from "./streaming.types.js";
 
 function autobind(instance: any): void {
 	const prototype = Object.getPrototypeOf(instance);
diff --git a/packages/firefish-js/src/streaming.types.ts b/packages/firefish-js/src/streaming.types.ts
index 5b81780271..ca4aa3396d 100644
--- a/packages/firefish-js/src/streaming.types.ts
+++ b/packages/firefish-js/src/streaming.types.ts
@@ -12,7 +12,7 @@ import type {
 	UserGroup,
 	UserLite,
 } from "./entities";
-import type { Connection } from "./streaming";
+import type { Connection } from "./streaming.js";
 
 type FIXME = any;
 
diff --git a/packages/firefish-js/src/type-utils.ts b/packages/firefish-js/src/type-utils.ts
index d28675c55c..92695709b5 100644
--- a/packages/firefish-js/src/type-utils.ts
+++ b/packages/firefish-js/src/type-utils.ts
@@ -1,4 +1,4 @@
-import type { Endpoints } from "./api.types";
+import type { Endpoints } from "./api.types.js";
 
 export type PropertyOfType<Type, U> = {
 	[K in keyof Type]: Type[K] extends U ? K : never;