塑造个人品牌,发现细分市场,构建可持续盈利的产品
개인 브랜드 구축·세분화 시장 발굴·지속 가능한 수익 제품 만들기를 공유
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기🚧 In active development: a broken commit is usually followed by a fix soon after. Self-hosted scheduler that publishes one video to YouTube, TikTok and Instagram, each with its own text and release time
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗[!IMPORTANT]
🚧 In active development 🚧
I use flock every day while I build it, and
mastermoves fast. Now and then a commit breaks something; a fix usually follows within hours. If something stops working, check the latest commits or pull again later.
flock schedules a video out to YouTube, Instagram, TikTok and Facebook, with its own text and its own release time for each platform.
All four publish for real. Facebook takes reels on a Page.
Get the code:
git clone https://github.com/Chrotesque/flock.git
cd flock
pnpm install
Put the PocketBase superuser details in scripts/.pb-creds.json:
{ "url": "http://<host>:8091", "email": "[email protected]", "password": "…" }
Create the collections. This is safe to re-run; run it again after every update, since a new version may add collections or fields:
pnpm setup-pb
Point the app at the same instance in .env (start from .env.example):
PUBLIC_POCKETBASE_URL=http://<host>:8091
For development:
pnpm dev
To publish it, set FLOCK_DEPLOY_DEST in .env to PocketBase's pb_public
folder, then:
pnpm deploy
This builds the app and mirrors it into that folder. PocketBase serves it straight away, with no restart.
[!WARNING] The mirror deletes anything in that folder that is not part of the build. Point it only at a
pb_publicthat belongs to flock.pnpm deploy:dryshows what would change.
From flock's website. The same page also opens at https://flock-scheduler.netlify.app/app/. It asks once for your server's address (the one flock opens at), keeps it in that browser, and talks only to that server. The browser has to reach the server over https, and it needs a profile picked again there, since to the browser it is a new site. Change… under Settings → Storage and defaults names another server.
pnpm build:site builds that copy into site/app/ and zips site/ into
site/site.zip, ready to upload to a static host.
Showing flock inside another site (iframe):
pb_hooks/strip_xframe.pb.js into PocketBase's pb_hooks/ folder (a
container mounts it at /pb/pb_hooks).FLOCK_FRAME_ANCESTORS in PocketBase's environment to that site's
origin.Confirming an upload only queues it. The worker is a separate process that keeps running when no browser is open. It:
A platform you have not set up just leaves its releases waiting in the queue.
Start from the example config. It will hold your client secrets, and git ignores it:
cp worker/.worker-config.example.json worker/.worker-config.json
In the Google Cloud console:
Put the client ID and secret in the config, then connect a channel:
pnpm worker:auth
Run it once per channel. pnpm worker:youtube lists the channels the worker
can upload to; with several, each brand picks its own in Settings → Brands.
Good to know:
worker:auth every week.pnpm worker:auth --with-playlists to have videos added to playlists.
Without it they are skipped, and the Review step says so.statsSeconds, statsVideos, statsBudget and
statsCeiling in the config adjust it.TikTok cannot schedule, so the worker uploads at the slot and TikTok posts once it has processed the video, usually a minute or two later.
On the TikTok for Developers portal:
user.info.basic and video.publish scopes.http://localhost:8765/tiktok. Put the same address in the config as
tiktok.redirectUri.tiktok.clientKey and tiktok.clientSecret. Until the app is reviewed, use
its sandbox keys and add your account as a target user.Then connect, signed in to the TikTok account that will post:
pnpm worker:auth --tiktok
pnpm worker:tiktok shows who each account posts as, which audiences it
offers and whether the Dashboard reads its numbers.TikTok on the Dashboard (optional): add the Display API to the app and
tick video.list and user.info.stats too — on a live app that is a
portal revision TikTok reviews; a sandbox can grant them straight away. Then
sign each account in again with them:
pnpm worker:auth --tiktok --with-stats
The worker then reads the account's newest public videos (views, likes,
comments, shares) and its follower count every 10 minutes into PocketBase's
post_stats (ttStatsPosts, ttStatsSeconds; 0 turns it off), and links
each post flock made to its video. Without --with-stats the sign-in asks for
posting only, and TikTok shows no videos on the Dashboard.
To try it on a sandbox without touching your running worker's config:
pnpm tiktok:demo init writes worker/.worker-config.demo.json (TikTok key,
secret and redirect URI and the PocketBase address copied from your config —
put the sandbox's key and secret there if yours is the live app's), pnpm tiktok:demo sign-in signs a sandbox target user in with the reading scopes,
and pnpm tiktok:demo read reads its videos and followers once. A brand whose
TikTok account has the same handle shows them.
Signing in from flock's page. The Dashboard's info button (ⓘ) turns red
while a brand's TikTok account cannot be read, and its popup has Continue
with TikTok. TikTok sends the browser back to flock's /connect/tiktok page,
which has to be registered on the app as a redirect URI (on flock's website:
https://flock-scheduler.netlify.app/app/connect/tiktok). Something has to
answer it: set "pageSignin": "stats" in the worker config's tiktok section
(or true to ask for posting only), or run pnpm tiktok:demo serve for the
sandbox while signing in.
Limits:
ffmpegPath / FLOCK_FFMPEG). Without an image, or without ffmpeg, the
cover is the Cover frame set in TikTok's options, and the post says why.Every video goes out as a Reel: MP4 or MOV, under 1 GB, 3 seconds to 15
minutes. The worker uploads it ten minutes before its slot
(instagramLeadSeconds) and publishes it on the minute. Instagram sometimes
refuses an upload it had accepted in full, and a connection can drop. In
either case the worker starts the upload again, pausing longer each time,
until 15 minutes past the slot. A reel that gets through late goes out at
once.
You need:
Put the app's App ID and App secret (App settings → Basic — not the
Instagram app ID) in the config as instagram.appId and
instagram.appSecret, then run:
pnpm worker:auth --instagram --token
It lists the permissions you need and waits for a token. To make one, in the Graph API Explorer:
The worker keeps each Page's own token, which does not expire.
1,2 or
all. Running it again adds or refreshes accounts and drops none.--token. That needs the
Facebook Login for Business product; a configuration id goes in
instagram.configId. Once the app is Live, Facebook only sends you back to
an address registered on the app, so the token route is the simpler one.pnpm worker:instagram shows each account and how much of its daily
allowance (100 posts) is used.instagram_manage_insights granted, the worker also
reads each account's newest 100 posts, their views and each reel's skip rate
every 10 minutes, into PocketBase's post_stats (igStatsPosts,
igStatsSeconds; 0 turns it off), and the Dashboard shows them.Every video goes out as a public Reel on a Facebook Page: MP4 (or MOV), 3 to 90 seconds. Facebook holds a reel for its release time itself, so the worker uploads it as soon as the slot is within four weeks; a slot less than ten minutes away goes out at once. A Page allows 30 reels a day through the API.
It uses the same Meta app as Instagram, which has to be Live (App Mode at the top of the app's dashboard): in Development mode, Facebook shows the reels only to people with a role on the app. Going Live needs the privacy policy, terms and data deletion addresses filled in under App settings → Basic; posting to your own Pages needs no App Review.
The Pages your Instagram accounts are linked to are ready to use without another step. For other Pages, or to choose which:
pnpm worker:auth --facebook --token
It works like the Instagram setup: it lists the permissions (pages_show_list,
pages_read_engagement, pages_manage_posts), takes a token from the
Graph API Explorer, lists every Page the token can post to, and keeps each
Page's own token. Running it again adds or refreshes Pages and drops none.
pnpm worker:facebook shows which Pages the worker posts to.
Then choose each brand's Page in Settings → Brands.
fbStatsPosts,
fbStatsSeconds; 0 turns it off). Their views need one more permission,
read_insights: add it in the Graph API Explorer and run the setup again
(pnpm worker:auth --instagram --token, or --facebook --token if you
listed your Pages that way). Until then the Dashboard says the views are not
read.Make a key at app.vidiq.com/account/settings/mcp, put it in the config as
vidiqKey, and check it without spending credits:
pnpm worker:vidiq
The Details step then has a Score title button beside the YouTube title. Each score costs credits.
pnpm worker:dry # show what is queued, upload nothing
pnpm worker # run
pnpm worker:once # one pass, then exit
pnpm worker:stats # one stats read, then exit
If it starts with Cannot reach http://…:8091, PocketBase is not reachable yet. The worker keeps retrying for five minutes.
"role": "all" (the default). It
does everything."role": "nas" worker there and a
"role": "local" worker on your PC.
pocketbaseUrl and "role": "local".all worker beside the others. One worker per role runs on
a machine; starting a second does nothing.The sidebar shows one dot per worker (PC left, NAS right): green running, red stopped, amber with a ring while the PC does the NAS worker's work as well.
pnpm build:worker
This writes dist/worker/flock-worker.exe. Copy it and your
.worker-config.json into one folder on the other machine.
pnpm worker, and flock-worker auth --tiktok
connects an account.FLOCK_WORKER_CONFIG points.
A downloaded copy saved as worker-config.json (browsers drop the leading
dot) is read too.On Windows the build also writes flock-worker-background.exe, which runs
without a window:
flock-worker-background.exe --stop stops it too.flock-worker.log beside itself. If it cannot start (no config,
flock out of reach for five minutes, one already running), a message box
says why.Local folders are paths on the worker's own machine: after moving the worker, set them again in Settings.
pnpm build:worker also writes dist/worker/flock-worker.cjs, the whole
worker for plain Node. Put it and the config in one folder on the NAS, and
create a container from node:24-alpine with:
/config, running node /config/flock-worker.cjs;FLOCK_WORKER_ROLE=nas, and FLOCK_PB_URL set to an address of PocketBase
the container can reach (a LAN address is safest);/mnt/user/<share>. A folder typed in Settings as \\server\share\folder is
read as /mnt/user/share/folder;--restart unless-stopped, and on Unraid --user 99:100 with UMASK=000
so copied videos stay editable over SMB;FLOCK_RESTART_ON_UPDATE=1, so it restarts itself on a new version;ffmpeg and ffprobe binaries in
the config folder, executable by the container's user (chmod 755). Not
apk add: it needs root, which --user takes away;FLOCK_PREVIEW_HOST=0.0.0.0,
an https address in front of that port (Tailscale Serve, for example — the
page is https, so the browser will not play from plain http), and
FLOCK_PREVIEW_URL set to that address.To update it, set FLOCK_WORKER_DEST in .env to that folder (as your PC
reaches it) and run:
pnpm deploy:worker
It copies the new worker in and waits until the worker has finished what it was doing and restarted. To connect another account to the NAS config:
FLOCK_WORKER_CONFIG=\\nas\appdata\flock_worker\.worker-config.json pnpm worker:auth --tiktok
Then restart the container.
Pick a profile. Nothing can be uploaded or changed until this browser is on one: the Log signs every change with the profile's name. There are no logins — pick an existing profile or add one; a profile can be a person or a machine. Each has its own Dashboard columns, To finish Indicator, time zones and hidden videos, while brands, uploads and folders are shared by everyone. Opening flock from another address counts as another browser.
\\nas\videos\incoming. Their videos appear in one
Watch folders list on the Upload step.
Right-click a file in any list to play it. Previews come from the PC worker (port 8790), so they work while it runs, in a browser on that PC.
The lists are as fresh as the worker's last scan; nothing shows before it has run once. A file that has been uploaded before is hidden; Show N uploaded before brings it back.
Upload has four steps: Upload, Details, Schedule, Review.
1. Upload. Drop a video on the picker, or drag one from a list on the right onto a video box. One video goes to every platform. Press a platform under Own file to give it a video of its own; that arrangement is remembered.
2. Details. The platform buttons in the top bar switch which platform you are writing for.
{outro}, to drop it in.At the top of the boxes on the right, Product name takes what the video is about, such as the game's name, for the whole upload. It is optional. The boxes below it follow the platform you are writing for:
Instagram and Facebook: an optional Cover image (JPEG or PNG, up to 8 MB for Instagram and 10 MB for Facebook). One image serves both; the switch in the box's corner gives each its own. TikTok takes the same image (Instagram's, when the two have their own); its Cover Time box only asks where in the video it goes, Beginning or End (the default).
YouTube: playlists, from the channel's own. Click the field, tick as many as you like, then Done; each shows as a tag with an × to take it off.
TikTok: the Post to TikTok box, with the choices TikTok wants made on every post:
The box reads the account afresh from TikTok each time it is shown. If TikTok says the account cannot post right now, the box says so and the upload waits.
Continue unlocks once every platform you ticked is written for and has a video.
3. Schedule. A calendar of the coming days, starting today: 14 days, or 7 to 14 with Show N days (at most 12 while a second time zone is shown). Drag a platform's icon to another day or hour — a label beside it names the slot under the pointer — then pick :00, :15, :30 or :45 from the bar that opens; or type the exact date and time underneath.
4. Review. The video plays beside exactly what each platform gets and when, and which account each post goes out as. Warnings show here too, such as a playlist the channel's connection cannot add to, or another brand's name in a post's text, the video's file name or its project folder.
Text written elsewhere, in a chat with an assistant say, goes in with one
Ctrl+V anywhere in flock, as a flock block: a JSON object starting with
"flock": 1.
{
"flock": 1,
"brand": "My brand",
"product": "The game: its subtitle",
"thumbnail": "C:/Users/me/Pictures/cover.png",
"youtube": { "title": "…", "description": "…", "tags": ["…"], "playlists": ["…", "…"], "schedule": "2026-10-13 18:00" },
"instagram": { "caption": "…", "schedule": "2026-10-13 19:30" },
"tiktok": { "caption": "…", "schedule": "now" }
}
flock opens Upload, switches to the brand, ticks each platform named and fills
it in. A note in the corner says what was filled. With several brands, a
brand that matches none (a typo) fills nothing: the note asks which brand it
is for, suggesting the closest one.
product fills the Product name box on Details.playlists takes one title or a list ("playlist" works too). A title
the channel has no playlist for is named in the note.schedule is local time, or "now". It fills the Schedule step, where
you can still change it.thumbnail is the cover image for Instagram, Facebook and TikTok, read
by the worker from its own disk (JPEG or PNG, up to 8 MB).Anything else on the clipboard pastes as usual.
A project folder holds one subfolder per video. Add project folders in Settings, local or on the network, like watch folders.
flock.json appears in it, within
a second or two (the worker watches the folders). That file is a flock
block, as above. In it, a bare file name like "thumb.png"
means an image in the same subfolder.flock.json changes, the Project Folder box offers to fill from it
again.flock.json to flock_uploaded.json. A new flock.json in the same folder
starts a new project.Update available! slides in above Worker when a newer flock has been deployed than the open page runs (it looks every five minutes and whenever you come back to the tab), with a line or two on what changed (hover it for all of them). Click it to reload. It waits while a video is uploading, and asks for a second click when an upload being composed would be lost.
Dashboard, at the top of the sidebar, opens over whatever page you are on, and flock opens on it; its arrow points back while it is open. Click it again, press Esc or go to another page to close it. For the brand in view it shows what follows. Right-click a brand's button for its month over month: views, likes and comments in each whole month of the last year against the month before, all platforms together and each below, with the month still running on top, judged by what its days so far come to over the whole month — YouTube's from YouTube Analytics, Instagram's from its account insights, Facebook's and TikTok's only for months flock read from their first day. It opens as a graph, one line for each of the three, green where a month rose on the one before and red where it fell, the stronger the bigger the change; List shows the months as a table. Beside it, pick the timeframe: the last 30 to 360 days, or Lifetime; it opens on 180 days.
940 (+9); the refresh button (the two
arrows at the top right) resets those.TikTok's numbers are read once its accounts are signed in with
--with-stats, and Facebook's views once its Pages grant read_insights.
When each platform was last read, and today's YouTube quota, sit behind the
ⓘ at the top right.
On a phone (a screen up to 640 pixels wide) flock is the Dashboard alone: the filter is the funnel, the brand one button, and the list keeps the date, followers, views, likes and comments, with the product name on a line above (the title for a video that has none) and a line between the columns. Tap a total for each platform's part. Each column has an icon for its name (an eye for views, a thumb for likes) centred over its numbers, which stays at the top as you scroll. Ratio View, editing, the periods, Jestr, the curve, vs usual, Skipped and Engaged are left out there.
Calendar shows every release on a grid of all 24 hours, starting two days before today: 14 days, or 7 to 14 from Show N days. Each upload is one small box of its platforms' icons in its hour, past ones without a fill, and the current hour is marked in pink; hover a box to read every post of that upload. It opens read-only: press Edit twice within two seconds, then drag an icon to move that platform's post, or a box's grip (its left edge) to move the whole upload, to another day or hour at least 15 minutes ahead. In Edit mode each box also shows its upload's product name under the icons: the part before a colon, and a name typed in capitals in normal capitals. A YouTube video or Facebook reel already uploaded moves there too: the worker gives the platform the new time within seconds. Right-click any post of an upload to release all of it at once or delete it, or tick the platforms to release or delete just those; each button takes three presses within two seconds apiece, and a post already out is left out and says why on hover. A YouTube video or Facebook reel waiting on the platform is put out or deleted there by the worker. A post that can no longer move, because it is out or about to go out, shakes and says why. With several brands, buttons on top show one brand or all.
The same menu's Edit this upload opens it in Upload with everything filled in — each post's text as typed, its options, time and cover, and the video already stored — and confirming there saves over it; Review lists what saving will change first. A post flock still holds (Instagram and TikTok until just before their time) changes completely, a different video included. A YouTube video already uploaded takes a new title, description, tags and playlists, and a Facebook reel a new caption and cover, from the worker; given another video, either is deleted there and uploaded again. A post that is out, or about to go out, opens locked and says why. TikTok's audience and the other choices it wants made by hand are picked again.
Log lists every change with its time and the machine that made it. Filter by category, search, or click a machine to see only its entries. It cannot be edited or cleared. Its Worker tab shows the worker's output live, kept for 14 days: the place to look when a post did not come out as asked. Its Update tab lists what changed in flock itself, one short line per change with its date and version, filterable by Added, Changed, Fixed and Removed.
Each upload in the Log says, per post, whether it was sent to go out Immediately or Scheduled for a slot. Click it to open its overview. It shows the video (click its name to play it), each post's text as typed and as sent, every setting, the account and the slot as confirmed, and the warnings the Review step showed. Beside that is what happened next: each post's state and link, and everything the worker logged about the upload. Uploads from before flock 0.12.0 show what their stored upload still holds, with Immediately or Scheduled worked out from the stored times (dashed).
An upload made for the wrong brand can be moved from its overview: under Brand, pick where it goes (with two brands, the button already names the other one), read what will happen to each post, and press Move to … three times, each within two seconds. The worker does it within seconds:
--with-playlists, which can delete.To finish, in the sidebar, is a box for what needs attention and for YouTube videos with something left to do by hand: green with a check when nothing needs doing now, a yellow-to-pink outline with an exclamation mark when something does, and solid red, slowly pulsing, when a post did not go out (it failed, or its slot passed and it was never sent). It turns gold, with a wobbling medal, when a video is doing far better than usual (below); only red outranks that. The number under it is how many things are listed. Click it to open the list over the page.
General is shared by every brand:
The brand in view has:
{name}.site/ is the source of flock's website,
which the developer portals link to: an overview, how it works, the privacy
policy and the terms. It is plain HTML, uploaded by hand to a static host; edit
it here and upload the folder again.