diff --git a/services/bsky/api.js b/services/bsky/api.js
index 56c769b9d..5d14c0057 100644
--- a/services/bsky/api.js
+++ b/services/bsky/api.js
@@ -44,19 +44,62 @@ const assert = require('node:assert')
 const cluster = require('node:cluster')
 const path = require('node:path')

-const { BskyAppView, ServerConfig } = require('@atproto/bsky')
+const bsky = require('@atproto/bsky') // import all bsky features
 const { Secp256k1Keypair } = require('@atproto/crypto')
 
 const main = async () => {
   const env = getEnv()
-  const config = ServerConfig.readEnv()
+  const config = bsky.ServerConfig.readEnv()
   assert(env.serviceSigningKey, 'must set BSKY_SERVICE_SIGNING_KEY')
   const signingKey = await Secp256k1Keypair.import(env.serviceSigningKey)
-  const bsky = BskyAppView.create({ config, signingKey })
-  await bsky.start()
+
+// starts: involve logics in packages/dev-env/src/bsky.ts >>>>>>>>>>>>>
+// Separate migration db in case migration changes some connection state that we need in the tests, e.g. "alter database ... set ..."
+  const migrationDb = new bsky.Database({
+      url: env.dbPostgresUrl,
+      schema: env.dbPostgresSchema,
+    })
+  if (env.migration) {
+      await migrationDb.migrateToOrThrow(env.migration)
+  } else {
+      await migrationDb.migrateToLatestOrThrow()
+  }
+  await migrationDb.close()
+
+  const db = new bsky.Database({
+      url: env.dbPostgresUrl,
+      schema: env.dbPostgresSchema,
+      poolSize: 10,
+  })
+
+  const dataplane = await bsky.DataPlaneServer.create(
+      db,
+      env.dataplanePort,
+      config.didPlcUrl
+  )
+
+  const bsync = await bsky.MockBsync.create(db, env.bsyncPort)
+
+// ends: involve logics in packages/dev-env/src/bsky.ts   <<<<<<<<<<<<<
+
+  const server = bsky.BskyAppView.create({ config, signingKey })
+// starts: involve logics in packages/dev-env/src/bsky.ts >>>>>>>>>>>>>
+  const sub = new bsky.RepoSubscription({
+      service: env.repoProvider,
+      db,
+      idResolver: dataplane.idResolver,
+      background: new bsky.BackgroundQueue(db),
+    })
+// ends: involve logics in packages/dev-env/src/bsky.ts   <<<<<<<<<<<<<
+  await server.start()
+  sub.start() // involve logics in packages/dev-env/src/bsky.ts
   // Graceful shutdown (see also https://aws.amazon.com/blogs/containers/graceful-shutdowns-with-ecs/)
   const shutdown = async () => {
-    await bsky.destroy()
+    await server.destroy()
+    await bsync.destroy()
+    await dataplane.destroy()
+    await sub.destroy()
+    await db.close()
   }
   process.on('SIGTERM', shutdown)
   process.on('disconnect', shutdown) // when clustering
@@ -64,6 +107,12 @@ const main = async () => {
 
 const getEnv = () => ({
   serviceSigningKey: process.env.BSKY_SERVICE_SIGNING_KEY || undefined,
+  dbPostgresUrl:     process.env.BSKY_DB_POSTGRES_URL     || undefined,
+  dbPostgresSchema:  process.env.BSKY_DB_POSTGRES_SCHEMA  || undefined,
+  dataplanePort :    maybeParseInt(process.env.BSKY_DATAPLANE_PORT)     || undefined,
+  bsyncPort :        maybeParseInt(process.env.BSKY_BSYNC_PORT)         || undefined,
+  migration:         process.env.ENABLE_MIGRATIONS === 'true'           || undefined,
+  repoProvider:      process.env.BSKY_REPO_PROVIDER                     || undefined
 })
 
 const maybeParseInt = (str) => {