
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.
@livx.cc/frame
Advanced tools
External infrastructure for Vue.js applications
Frame provides a complete, opinionated development environment for Vue.js applications, letting you focus on your views and business logic while Frame handles the infrastructure.
src/views/ directorynpm install -g @livx.cc/frame
# Basic project
frame init my-app
# Full-featured project with all options
frame init my-app --typescript --pinia --testing --eslint --prettier --git
# Create and navigate
frame create my-store --typescript --pinia
cd my-store
# Start development server
frame dev
# Build for production
frame build
# Preview production build
frame preview
# Run tests
frame test
frame init [name] [options] # Create new Frame project
frame create [name] [options] # Alias for init
Options:
--typescript - Use TypeScript--eslint - Include ESLint configuration--prettier - Include Prettier configuration--pinia - Include Pinia store management--testing - Include Vitest testing setup--git - Initialize git repositoryframe scaffold <type> [name] [options] # Generate code
frame generate <type> [name] [options] # Alias for scaffold
Types:
component - Vue component with Pug templateview - Page view with routingcomposable - Vue composablestore - Pinia storemiddleware - Route middlewarelayout - Layout componentplugin - Vue pluginOptions:
--typescript - Generate TypeScript files--test - Include test filesExamples:
frame scaffold component UserProfile --typescript --test
frame generate view ProductDetails --test
frame scaffold composable useApi --typescript
frame generate store userStore --typescript
frame update [options] # Add features to existing project
Options:
--pug - Add Pug templating support--meta - Add meta management--pinia - Add Pinia state management--testing - Add Vitest testing--eslint - Add ESLint configuration--prettier - Add Prettier configuration--all - Add all available featuresFrame creates a clean, organized project structure:
my-app/
├── src/
│ ├── views/ # Auto-routed page views
│ ├── components/ # Reusable components
│ ├── composables/ # Vue composables
│ ├── store/ # Pinia stores (if enabled)
│ ├── middleware/ # Route middleware
│ ├── layouts/ # Layout components
│ ├── plugins/ # Vue plugins
│ └── tests/ # Test files
├── frame.config.mjs # Frame configuration
├── tsconfig.json # TypeScript config (if enabled)
├── vitest.config.ts # Test config (if enabled)
└── package.json
Frame automatically generates routes from your src/views/ directory:
src/views/
├── Home.vue → /
├── About.vue → /about
├── [id].vue → /:id
└── user/
└── [userId].vue → /user/:userId
Custom Route Overrides:
You can override file-based routes with custom configurations in frame.config.mjs:
export default {
routing: {
customRoutes: [
{
path: '/',
name: 'Home',
component: './src/views/Home.vue',
meta: {
hideHeader: true,
hideFooter: true,
title: 'Welcome Home'
}
},
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: './src/views/NotFoundView.vue',
meta: {
hideHeader: true,
title: 'Page Not Found'
}
}
]
}
}
Custom routes automatically override file-based routes with the same path, giving you full control over route behavior while keeping your views organized.
Dynamic SEO and social media optimization:
<script setup lang="ts">
import { useFrameMeta } from '#frame/meta-helpers';
useFrameMeta({
title: 'My Amazing Page',
description: 'This page is built with Frame',
keywords: ['vue', 'frame', 'awesome'],
type: 'website'
});
</script>
Clean, maintainable templates:
<template lang="pug">
div.container
h1 {{ title }}
p.description {{ description }}
button.btn(@click="handleClick")
| Click me!
</template>
Control header/footer visibility on a per-page basis using route meta:
1. Configure routes with layout meta:
// frame.config.mjs
export default {
routing: {
customRoutes: [
{
path: '/login',
component: './src/views/Login.vue',
meta: {
hideHeader: true,
hideFooter: true
}
}
]
}
}
2. Use the router-ready pattern in App.vue:
<template lang="pug">
#app
nav.header(v-if="showHeader")
// Your navigation
main
router-view
footer(v-if="showFooter")
// Your footer
</template>
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue';
import { useRouter, useRoute } from 'vue-router';
const router = useRouter();
const route = useRoute();
const routerReady = ref(false);
// Prevents flash of header/footer on page load
const showHeader = computed(() => routerReady.value && !route.meta.hideHeader);
const showFooter = computed(() => routerReady.value && !route.meta.hideFooter);
onMounted(async () => {
await router.isReady();
routerReady.value = true;
});
</script>
This pattern prevents FOUC (Flash of Unstyled Content) and ensures smooth page transitions.
Generate components with proper structure:
frame scaffold component UserCard --typescript --test
Creates:
src/components/UserCard.vue - Component with Pug templatesrc/tests/components/UserCard.test.ts - Test fileFrame supports modern CSS solutions out of the box:
Use Tailwind's utility-first approach and extract component classes with @apply:
@layer components {
.btn-primary {
@apply bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded;
}
}
Use powerful CSS preprocessors with variables, mixins, and nesting:
<style lang="less" scoped>
@primary: #42b883;
.component {
background: lighten(@primary, 40%);
&:hover {
background: lighten(@primary, 30%);
}
}
</style>
Quick Setup:
# Tailwind CSS
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
# LESS
npm install -D less
# SCSS
npm install -D sass
Frame handles all the configuration automatically. See the CSS Preprocessors Guide for details.
Comprehensive guides available in .tmp/ directory:
Frame includes Vitest for fast, modern testing:
// src/tests/components/MyComponent.test.ts
import { mount } from '@vue/test-utils';
import { describe, it, expect } from 'vitest';
import MyComponent from '@/components/MyComponent.vue';
describe('MyComponent', () => {
it('renders correctly', () => {
const wrapper = mount(MyComponent);
expect(wrapper.text()).toContain('Expected text');
});
});
Customize Frame behavior with frame.config.mjs:
export default {
// Custom Vite config
vite: {
// Your Vite customizations
},
// Router options
router: {
scrollBehavior: 'smooth'
},
// Meta defaults
meta: {
siteName: 'My App',
themeColor: '#42b883'
}
};
git checkout -b feature/amazing-featuregit commit -m 'Add amazing feature'git push origin feature/amazing-feature.tmp/ directory for detailed guidesframe --help or frame <command> --helpCustom Routes Override File-Based Routes
frame.config.mjs now automatically override file-based routes with the same pathFOUC Prevention for Header/Footer
Enhanced Layout Control
hideHeader and hideFooter route meta flags for per-page layout controlSee IMPROVEMENTS.md for detailed documentation.
Built with ❤️ for the Vue.js community
FAQs
External infrastructure for Vue.js applications
We found that @livx.cc/frame demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.