{"id":29151157,"url":"https://github.com/arrow2nd/concopy","last_synced_at":"2025-07-01T00:08:19.635Z","repository":{"id":300015809,"uuid":"1002056226","full_name":"arrow2nd/concopy","owner":"arrow2nd","description":"🤖 Extension to copy URL in any format","archived":false,"fork":false,"pushed_at":"2025-06-26T15:59:09.000Z","size":429,"stargazers_count":0,"open_issues_count":8,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-27T12:07:10.528Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arrow2nd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-14T16:10:41.000Z","updated_at":"2025-06-15T01:29:03.000Z","dependencies_parsed_at":"2025-06-19T13:02:30.017Z","dependency_job_id":"b2f99af2-877b-4d7e-82a5-ba9808c3511f","html_url":"https://github.com/arrow2nd/concopy","commit_stats":null,"previous_names":["arrow2nd/concopy"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/arrow2nd/concopy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arrow2nd%2Fconcopy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arrow2nd%2Fconcopy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arrow2nd%2Fconcopy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arrow2nd%2Fconcopy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arrow2nd","download_url":"https://codeload.github.com/arrow2nd/concopy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arrow2nd%2Fconcopy/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262870875,"owners_count":23377313,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-07-01T00:08:19.040Z","updated_at":"2025-07-01T00:08:19.614Z","avatar_url":"https://github.com/arrow2nd.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🦊 concopy\n\nA Firefox/Chrome extension for copying web content with custom JavaScript\nfunctions. Create your own clipboard formatting rules with a beautiful,\nintuitive interface!\n\n## ✨ Features\n\n### 🎯 **Core Functionality**\n\n- Create custom copy functions with safe template-based execution\n- Access page title, URL, selected text, and metadata\n- Built-in utility functions for common formatting tasks\n- Rich HTML and plain text output support\n\n### 🎨 **Beautiful Interface**\n\n- Modern, responsive design with orange fox theme\n- Drag \u0026 drop function reordering\n- Random color generation with harmonious palette (22 curated colors)\n- Visual function customization with background/text colors\n\n### 🔄 **Import/Export \u0026 Sharing**\n\n- Share functions via encoded URLs\n- Import/export functions as JSON files\n- URL-based function installation from share links\n- Firefox-compatible import dialog (no chrome-extension:// dependency)\n\n### 🛡️ **Security \u0026 Performance**\n\n- CSP-compliant execution (no eval/Function constructor)\n- Template-based safe function execution\n- Custom code editing for all templates - templates serve as starting points\n- Firefox Manifest V3 compatible\n- Automatic clipboard API integration\n\n### ⌨️ **Convenience Features**\n\n- Keyboard shortcut support (`Ctrl+Shift+L` / `Cmd+Shift+L`)\n- Automatic Firefox extension packaging\n- Content script injection fallback\n- Cross-browser compatibility (Firefox/Chrome)\n\n## 🚀 Installation\n\n### For Users\n\n1. Download the latest `concopy-extension.zip` from releases\n2. **Firefox**:\n   - Open `about:debugging` → This Firefox → Load Temporary Add-on\n   - Select the downloaded zip file\n3. **Chrome**:\n   - Open `chrome://extensions/` → Enable Developer mode\n   - Drag \u0026 drop the zip file\n\n### For Developers\n\n```bash\n# Clone and install dependencies\ngit clone \u003crepository-url\u003e\ncd concopy\nnpm install\n\n# Build the extension\nnpm run build\n\n# The extension will be packaged as concopy-extension.zip\n```\n\n## 📖 Usage\n\n### Basic Usage\n\n1. Click the fox icon in your browser toolbar (or use `Ctrl+Shift+L`)\n2. Click \"Create your first function\" or go to Options\n3. Choose from 6 built-in templates or create custom functions\n4. Save and use on any webpage!\n\n### Template Functions\n\n- **Rich Text Link**: HTML link with title and URL\n- **Markdown Link**: Markdown-formatted link\n- **Title and URL**: Simple title + URL combination\n- **Selected Text**: Copy selected text or fallback to title\n- **Page Summary**: Comprehensive page information\n- **Custom Template**: Create your own with template variables\n\nAll templates are fully editable - they serve as starting points that you can customize to your needs!\n\n### Function Interface\n\nYour functions receive a `page` parameter with:\n\n```typescript\ninterface PageContext {\n  title: string; // Page title\n  url: string; // Page URL\n  selection: string; // Selected text\n  content: string; // Full page text\n  meta: { // Meta tag information\n    description?: string;\n    keywords?: string;\n    author?: string;\n    [key: string]: string | undefined;\n  };\n}\n```\n\n### Template Rendering\n\nUse the `render()` function for dynamic content:\n\n```javascript\n// Template variables: {{variable}} for escaped, {{\u0026variable}} for unescaped\nrender(\"Visit {{title}} at {{\u0026url}}\", page);\n// Result: \"Visit My Page at https://example.com\"\n```\n\n### Library Functions\n\nThe `lib` object provides utilities:\n\n```javascript\nlib.formatDate(date, \"YYYY-MM-DD HH:mm\"); // Format dates\nlib.escapeHtml(text); // Escape HTML\nlib.truncate(text, 100, \"...\"); // Truncate text\nlib.toMarkdownLink(title, url); // [title](url)\nlib.toHtmlLink(title, url); // \u003ca href=\"url\"\u003etitle\u003c/a\u003e\nlib.extractDomain(url); // Get domain\nlib.simplifyUrl(url); // Remove query params\n```\n\n## 🎨 Example Functions\n\n### Rich HTML Link\n\n```javascript\n((page) =\u003e {\n  return {\n    html: render('\u003ca href=\"{{\u0026url}}\"\u003e{{title}}\u003c/a\u003e', page),\n    text: page.title,\n  };\n});\n```\n\n### Markdown with Date\n\n```javascript\n((page) =\u003e {\n  const date = lib.formatDate(new Date(), \"YYYY-MM-DD\");\n  return `[${page.title}](${page.url}) - ${date}`;\n});\n```\n\n### Page Summary\n\n```javascript\n((page) =\u003e {\n  const summary = [\n    \"Title: \" + page.title,\n    \"URL: \" + page.url,\n  ];\n\n  if (page.meta?.description) {\n    summary.push(\"Description: \" + page.meta.description);\n  }\n\n  return summary.join(\"\\n\");\n});\n```\n\n## 🛠️ Development\n\n### Development Server\n\n```bash\nnpm run dev\n```\n\n### Building\n\n```bash\nnpm run build          # Build and package extension\nnpm run package        # Package existing build\nnpm run lint          # Check code quality\nnpm run typecheck     # Type checking\n```\n\n### Project Structure\n\n```\nsrc/\n├── background/       # Extension background script\n├── content/         # Content script for page interaction\n├── popup/           # Extension popup interface  \n├── options/         # Options page for function management\n├── components/      # Reusable React components\n└── lib/            # Core functionality\n    ├── colors.ts   # Color palette and utilities\n    ├── library.ts  # Helper functions\n    ├── storage.ts  # Browser storage management\n    ├── templates.ts # Template system and execution\n    └── types.ts    # TypeScript definitions\n```\n\n### Technology Stack\n\n- **Frontend**: React 18 + TypeScript + Tailwind CSS\n- **Bundler**: Vite 5 with React plugin\n- **Extension**: Manifest V3 with webextension-polyfill\n- **UI Components**: react-beautiful-dnd for drag \u0026 drop\n- **Code Quality**: ESLint + TypeScript strict mode\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create your feature branch\n3. Run `npm run lint` and `npm run typecheck`\n4. Commit your changes\n5. Open a pull request\n\n## 📄 License\n\nMIT License - see LICENSE file for details\n\n## 🦊 About\n\nconcopy makes it easy to create custom clipboard formatting rules for any\nwebsite. Whether you need markdown links, rich HTML content, or custom formatted\ntext, concopy's template system has you covered with a beautiful, user-friendly\ninterface.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farrow2nd%2Fconcopy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farrow2nd%2Fconcopy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farrow2nd%2Fconcopy/lists"}