Skip to content
제품 목록

미리 써보기업무 자동화 도구 모음

vibe-post-it

사업보고서 비교, Slack 변환처럼 반복 업무를 한 번에

입력 하나, 결과 하나로 끝나는 작은 도구들. 쓸 만해지면 서비스로 떼어냅니다.

  • Vue
  • jsdiff
  • Slack Block Kit

사업보고서 버전 비교

항목별로 바뀐 곳을 칠하고, 바뀐 숫자만 모아 요약합니다.

Slack 메시지 변환

레거시 attachment를 Block Kit으로 바꾸고 5개 언어 전송 코드를 만듭니다.

브라우저 안에서만

붙여넣은 내용은 서버로 보내지 않습니다.

사업보고서 두 버전 비교 ​

공시 문서는 매년 비슷한 문장에 숫자만 조금씩 바뀝니다. 사람이 두 파일을 나란히 놓고 찾던 일을 항목 단위로 나눠 비교하고, 바뀐 숫자를 따로 뽑아 요약합니다. 비교는 jsdiff로 하되, 1,820억원 같은 숫자가 쉼표에서 쪼개지지 않도록 공백 단위로 자른 토큰을 비교합니다.

사업보고서 두 버전 비교예시는 가상의 회사입니다. 입력은 브라우저 안에서만 처리합니다.
5 / 5개 항목 변경9건 수치 변경추가삭제

변경 요약

  • 사업의 개요: 수치 2건 변경 (매출 비중은 82% → 74%, 해외 법인은 2곳 → 3곳)
  • 주요 제품: 수치 1건 변경 (온도·진동 센서 200 → 300), 문장 추가·수정
  • 매출 및 수주상황: 수치 3건 변경 (당기 매출액은 1,820억원 → 2,140억원, 전기 대비 6.1% → 17.6%, 수주잔고는 640억원 → 910억원)
  • 연구개발활동: 수치 3건 변경 (연구개발비는 매출액의 11.2% → 10.4%, 204억원 → 223억원, 연구 인력은 138명 → 151명)
  • 위험 요인 항목이 새로 생겼습니다.

규칙으로 만든 요약입니다. LLM 요약을 붙일 때도 이 목록만 근거로 쓰게 해서 없는 변경을 지어내지 않도록 합니다.

1. 사업의 개요

+11 −11

예시전자(가상)는 산업용 센서와 관제 소프트웨어를 개발합니다. 국내 매출 비중은 82%이며74%이며 해외 법인은 2곳입니다.3곳입니다.

2. 주요 제품

+44 −12

주력 제품은 온도·진동 센서 S-200과S-300과 관제 플랫폼 Watch입니다. Watch는 연간 구독 방식으로 판매합니다.판매하며, 올해부터 AI 이상 탐지 기능을 유료 옵션으로 제공합니다.

3. 매출 및 수주상황

+23 −22

당기 매출액은 1,820억원으로2,140억원으로 전기 대비 6.1%17.6% 증가했습니다. 수주잔고는 640억원입니다.910억원입니다.

4. 연구개발활동

+22 −22

연구개발비는 매출액의 11.2%인10.4%인 204억원이며,223억원이며, 연구 인력은 138명입니다.151명입니다.

5. 위험 요인

신설

해외 매출 확대에 따라 환율 변동 위험이 커졌습니다.

어떻게 나누고 요약하나 ​

  1. 1., Ⅱ., 가., ## 같은 제목 줄로 문서를 항목으로 자릅니다.
  2. 같은 제목끼리 짝을 지어 공백 단위 토큰으로 비교합니다. 한쪽에만 있는 항목은 신설·삭제로 표시합니다.
  3. 삭제 바로 뒤에 추가가 오고 둘 다 숫자를 담고 있으면 수치 변경으로 묶고, 앞 단어 두 개를 문맥으로 붙입니다.
  4. 요약은 이 목록으로만 만듭니다. LLM을 붙여 문장으로 다듬더라도 목록에 없는 변경은 쓰지 못하게 합니다.

다음 단계는 OpenDART에서 같은 회사의 두 해 보고서를 받아 자동으로 넣는 것입니다. 이 데이터는 공개자료 챗봇과 같이 씁니다.

Slack 레거시 메시지 변환 ​

오래된 알림 코드는 아직 attachments의 color, fields, footer를 씁니다. Slack은 이 형식을 레거시로 분류하고 Block Kit을 권장합니다. 붙여넣으면 Block Kit으로 바꾸고, 바꾼 메시지를 보내는 코드를 언어별로 만들어 줍니다.

Slack 레거시 attachment → Block Kit변환과 미리보기는 브라우저에서만 일어나고, 메시지를 보내지 않습니다.

Slack에서 보이는 모습

deploy-bot 앱

배포가 끝났습니다

deploy-bot

api-server v2.4.1
변경 12건, 마이그레이션 1건이 포함되었습니다.

환경
production

소요 시간
3분 42초

승인자
@ops-lead

릴리스 노트

GitHub Actions | 25. 10. 17. 오전 12:00

curl -X POST "$SLACK_WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  -d '{"text":"배포가 끝났습니다","blocks":[{"type":"section","text":{"type":"mrkdwn","text":"배포가 끝났습니다"}}],"attachments":[{"color":"#36a64f","blocks":[{"type":"context","elements":[{"type":"mrkdwn","text":"deploy-bot"}]},{"type":"section","text":{"type":"mrkdwn","text":"*<https://example.com/releases/2.4.1|api-server v2.4.1>*\n변경 12건, 마이그레이션 1건이 포함되었습니다."}},{"type":"section","fields":[{"type":"mrkdwn","text":"*환경*\nproduction"},{"type":"mrkdwn","text":"*소요 시간*\n3분 42초"},{"type":"mrkdwn","text":"*승인자*\n@ops-lead"}]},{"type":"actions","elements":[{"type":"button","text":{"type":"plain_text","text":"릴리스 노트"},"url":"https://example.com/releases/2.4.1","action_id":"action_0"}]},{"type":"context","elements":[{"type":"mrkdwn","text":"GitHub Actions  |  <!date^1760659200^{date_short_pretty} {time}|2025-10-17T00:00:00.000Z>"}]}]}]}'

웹훅 주소는 코드에 넣지 않고 SLACK_WEBHOOK_URL 환경변수로 받습니다. 블록 6개.

변환 규칙 ​

레거시 필드Block Kit
pretext맨 위 section
author_name, author_iconcontext (이미지 + 텍스트)
title, title_link, textsection mrkdwn, thumb_url은 accessory 이미지
fieldssection.fields 10개씩 나눔
image_urlimage
actions 버튼actions + button
footer, tscontext, 시간은 <!date^...>로 보는 사람의 시간대에 맞춤
colorBlock Kit에는 없음. 옵션을 켜면 attachments[].blocks로 감싸 막대를 유지

코드를 못 바꾸는 시스템이라면: 변환 릴레이 ​

레거시 시스템의 웹훅 주소만 바꿔 끼우면 되는 작은 서버입니다. 받은 메시지를 같은 규칙으로 바꿔 진짜 Slack 웹훅으로 넘깁니다.

js
// relay/server.mjs — Node 20+, 의존성 없음
import { createServer } from 'node:http'
import { toBlocks } from './convert.mjs' // 위 변환기와 같은 규칙

const routes = JSON.parse(process.env.RELAY_ROUTES) // { "deploy": "https://hooks.slack.com/..." }

createServer(async (req, res) => {
  const name = req.url.split('/').pop()
  if (req.method !== 'POST' || !routes[name]) return res.writeHead(404).end()
  const legacy = JSON.parse(await new Response(req).text())
  const out = await fetch(routes[name], {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(toBlocks(legacy, { keepColor: true })),
  })
  res.writeHead(out.status).end(await out.text())
}).listen(8787)

웹훅 주소는 환경변수로만 받고, 로그에는 경로 이름과 응답 코드만 남깁니다.

저장소 구조 ​

포스트잇처럼 떠오를 때마다 하나씩 붙이는 도구 모음입니다. 각 도구는 입력 하나, 결과 하나로 끝나는 크기로 만들고, 쓸 만해지면 별도 서비스로 떼어냅니다. 아래 두 개는 이 페이지에서 바로 써볼 수 있습니다.

text
vibe-post-it/
├── Makefile                 # make dev / test / new NAME=...
├── tools/
│   ├── report-diff/         # 사업보고서 버전 비교 + 변경 요약
│   ├── slack-blocks/        # 레거시 attachment → Block Kit 변환
│   └── _template/           # 새 도구 뼈대
├── relay/                   # 선택: 레거시 웹훅을 받아 변환 후 전달하는 작은 서버
└── packages/ui/             # 공통 입력창·결과 프레임

로드맵 ​

  1. OpenDART 연동으로 보고서 두 버전 자동 불러오기
  2. 표(재무제표) 셀 단위 비교
  3. 변환 릴레이를 Docker 이미지로 배포
  4. 새 도구 후보: 회의록 액션 아이템 추출, 견적서 버전 비교

업무에 AI를 붙여 실제로 돌려봅니다.