TomblooとかTombfixのようなクロスポストクライアントアプリ。
📝 Note: このアプリはservice.jsでプラグインとして拡張可能な設計になっており、各サービスのAPIキーやカスタムロジックの実装が必要なため、バイナリ配布は行っていません。
利用する場合は、手元でソースコードをクローンし、必要なサービスプラグインを実装してから実行してください。
- Twitter、はてなブックマークなどへのクロスポスト
- はてなブックマークを使ったタグ補完
- 独自に対応サービスを追加可能
- 入力欄はtextlintでのリアルタイムLint
- URLスキームを使ってブラウザから起動できる
- Codex/Claude CLI連携によるAI説明文生成
アプリに必要な依存をnpmでインストールします。
npm install
アプリを起動する前に利用するサービスの設定をservice.jsで定義してください。
利用するサービスは後述するservice.jsに定義します。
postemリポジトリに実装があるビルトインサポートしているサービスは次の通りです。
クロスポストできるサービスの一覧をservice.jsで定義します。
- src/service.example.jsを
service.jsにリネームして設定
cp src/service.example.js src/service.jsデフォルトでは次のサービスが有効になっています。
- はてなブックマーク
- デバッグ(Development modeのみ有効)
また、src/servicesを参考にして独自のサービスを追加できます。
Development mode:
npm start
Production mode: dist/ディレクトリにバイナリが出力されます。
npm run dist
# dist/ にアプリができる
Browser mode: asocial-bookmark形式のリポジトリに対応しています。
https://postem.netlify.com/?title={TITLE}&url={URL}&github.owner={Owner名}&github.repo={リポジトリ名}&github.ref={refsheads%2Fブランチ名}&github.indexPropertyName={プロパティ名}&github.token={GitHub_Token}
- 投稿するサービスの選択(アイコンをクリック or ショートカット)
- タグや説明欄を入力
- "Submit"で送信(Cmd+Enter)
表示されているアイコンの左から順番にCmd+数字のショートカットが振られています。
- Cmd+1: Twitter
- Cmd+2: はてなブックマーク
最後のアイコンだけはCmd+0が振られています。
次の引数を付けて起動すると初期値が入った状態で起動できます。
--title: set default title--url: set default url
./bin/cmd.js --title "タイトル" --url "https://example.com"
URL schemeはproduction modeで作成したバイナリを一度起動しておく必要があります。 起動すると、次のURL schemeが自動的に登録されます。
postem://
今見ているサイトについて投稿する場合は、次のJavaScriptを実行するとアプリが起動できます。
location.href = `postem://?url=${encodeURIComponent(window.top.location.href)}&title=${encodeURIComponent(window.top.document.title)}`
Codex CLIまたは Claude CLI を使って URL から説明文を自動生成できます。
service.jsにaiConfigを export します。claudeCodeConfigはサポートしていません。
export const aiConfig = {
enabled: true,
type: "codex",
cliPath: process.env.CODEX_CLI_PATH || `${process.env.HOME}/.local/bin/codex`,
workDir: "/path/to/work/dir",
profile: "postem", // オプション: ~/.codex/postem.config.toml を重ねる
model: "gpt-5.4", // オプション
outputSchema: true, // オプション: comment/tags のJSON Schemaを一時ファイルに生成して渡す
timeoutMs: 120000, // オプション: AI生成全体のtimeout
logEvents: true, // オプション: codex exec --json の進行イベントをconsoleに出す
mcpServers: {
// HTTP MCP Server
"example-http": {
url: "https://example.com/mcp",
required: true,
default_tools_approval_mode: "approve",
enabled_tools: ["example_tool"]
},
// stdio MCP Server
"example-stdio": {
command: "npx",
args: ["some-mcp-server"],
cwd: "/path/to/cwd",
env: {},
default_tools_approval_mode: "approve",
enabled_tools: ["lintText"]
}
},
// 任意のcodex -c key=value override
config: {
model_reasoning_effort: "medium",
model_verbosity: "low",
default_permissions: "postem-no-files",
"permissions.postem-no-files": {
filesystem: {
"/": "deny",
":workspace_roots": {
".": "deny"
}
}
},
"features.shell_tool": false,
"mcp_servers.example-stdio.tool_timeout_sec": 120
},
// 文字列または関数
prompt: ({ url, title }) => `以下のURLの内容を要約してください。\n\nURL: ${url}\nTitle: ${title}`
};Claude CLI を使う場合はtype: "claude"にします。
export const aiConfig = {
enabled: true,
type: "claude",
cliPath: process.env.CLAUDE_CODE_CLI_PATH || `${process.env.HOME}/.local/bin/claude`,
workDir: "/path/to/work/dir",
model: "claude-sonnet-4-5-20250929",
mcpConfig: {
mcpServers: {
"example-http": {
url: "https://example.com/mcp",
type: "http"
}
}
},
prompt: ({ url, title }) => `以下のURLの内容を要約してください。\n\nURL: ${url}\nTitle: ${title}`
};| 項目 | 説明 |
|---|---|
enabled |
機能の有効/無効 |
type |
実行する CLI の種類(codexまたはclaude) |
cliPath |
CLI のパス。packaged app では shell の PATH を継承しないことがあるため、絶対パス推奨 |
workDir |
作業ディレクトリ |
profile |
Codex profile 名。type: "codex"のみ |
model |
使用するモデル(オプション) |
outputSchema |
Codex の出力 JSON Schema。true、JSON Schema オブジェクト、または schema ファイルパスを指定できます。type: "codex"のみ |
timeoutMs |
AI 生成全体の timeout。省略時は 120000。0以下で無効化 |
logEvents |
Codex JSONL イベントを console に出す。type: "codex"のみ |
mcpServers |
Codex MCP サーバー設定。type: "codex"のみ |
config |
Codex の-c key=value override。type: "codex"のみ |
mcpConfig |
Claude CLI の MCP サーバー設定。type: "claude"のみ |
prompt |
CLI に渡すプロンプト(文字列または({ url, title, relatedItems, availableTags }) => string形式の関数) |
- URL を入力すると自動で AI 生成が実行されます(1 秒のデバウンス付き)
- 結果はプレビューエリアに表示されます
- Cmd+Shift+Jまたはクリックで結果をコメント欄に挿入します
type: "codex"では Codex CLI が事前にインストール・認証されている必要があります- Codex の MCP は
mcpServersからcodex exec -c mcp_servers...へ変換されます - Codex の永続的な MCP 設定は
~/.codex/config.tomlや~/.codex/<profile>.config.tomlにも定義できます outputSchema: trueではcommentとtagsを返す JSON Schema を一時ファイルに生成し、codex exec --output-schemaへ渡しますtype: "codex"ではcodex exec --jsonのturn.completedを見て、プロセスの終了待ちに依存せず結果を反映します- 説明文生成ではローカルファイルの読み取りや shell 実行は不要なため、
default_permissionsで filesystem を deny し、"features.shell_tool": falseを指定することを推奨します type: "codex"ではmcpConfigは使えません。type: "claude"ではmcpServersとconfigは使えません
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature - Commit your changes:
git commit -am 'Add some feature' - Push to the branch:
git push origin my-new-feature - Submit a pull request :D
MIT